diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index df20b1a..ea5961a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -25,9 +25,9 @@
         with:
           access_token: ${{ github.token }}
       - name: 'Check out repository'
-        uses: actions/checkout@v2.3.4
+        uses: actions/checkout@v2.4.0
       - name: 'Cache local Maven repository'
-        uses: actions/cache@v2.1.6
+        uses: actions/cache@v2.1.7
         with:
           path: ~/.m2/repository
           key: maven-${{ hashFiles('**/pom.xml') }}
@@ -57,9 +57,9 @@
     runs-on: ubuntu-latest
     steps:
       - name: 'Check out repository'
-        uses: actions/checkout@v2.3.4
+        uses: actions/checkout@v2.4.0
       - name: 'Cache local Maven repository'
-        uses: actions/cache@v2.1.6
+        uses: actions/cache@v2.1.7
         with:
           path: ~/.m2/repository
           key: maven-${{ hashFiles('**/pom.xml') }}
@@ -86,9 +86,9 @@
     runs-on: ubuntu-latest
     steps:
       - name: 'Check out repository'
-        uses: actions/checkout@v2.3.4
+        uses: actions/checkout@v2.4.0
       - name: 'Cache local Maven repository'
-        uses: actions/cache@v2.1.6
+        uses: actions/cache@v2.1.7
         with:
           path: ~/.m2/repository
           key: maven-${{ hashFiles('**/pom.xml') }}
diff --git a/Android.bp b/Android.bp
index 376abe9..6a861aa 100644
--- a/Android.bp
+++ b/Android.bp
@@ -108,6 +108,11 @@
         "error_prone_annotations",
     ],
     java_version: "1.8",
+    errorprone: {
+        javacflags: [
+            "-Xep:NoCanIgnoreReturnValueOnClasses:WARN",
+        ],
+    },
 }
 
 java_library_host {
@@ -121,6 +126,11 @@
          "junit",
     ],
     java_version: "1.8",
+    errorprone: {
+        javacflags: [
+            "-Xep:ReturnValueIgnored:WARN",
+        ],
+    },
 }
 
 // Guava for Android can't compile against an Android bootclasspath, compile
@@ -135,6 +145,11 @@
         "error_prone_annotations",
     ],
     java_version: "1.8",
+    errorprone: {
+        javacflags: [
+            "-Xep:NoCanIgnoreReturnValueOnClasses:WARN",
+        ],
+    },
 }
 
 java_host_for_device {
@@ -142,19 +157,22 @@
     libs: ["guava-android-host"],
 }
 
-// Compatibility name for existing host modules
-java_library_host {
-    name: "guavalib",
-    static_libs: ["guava"],
-}
-
 // Compile dummy implementations of annotations used by guava but not
 // present in the Android tree.
+// 30 may not be the lowest min_sdk_version, but the min sdk version
+// for permission controller.
 java_library {
     name: "guava-android-annotation-stubs",
     host_supported: true,
+    // b/267831518: Pin tradefed and dependencies to Java 11.
+    java_version: "11",
     sdk_version: "core_current",
+    min_sdk_version: "30",
     srcs: ["android-annotation-stubs/src/**/*.java"],
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
 }
 
 // Compile guava testlib
@@ -167,4 +185,9 @@
         "guava-android-annotation-stubs",
         "junit",
     ],
+    errorprone: {
+        javacflags: [
+            "-Xep:ReturnValueIgnored:WARN",
+        ],
+    },
 }
diff --git a/BUILD b/BUILD
deleted file mode 100644
index 22c9e62..0000000
--- a/BUILD
+++ /dev/null
@@ -1,58 +0,0 @@
-# TODO(b/198224074): auto-generate this file using bp2build.
-#
-
-alias(
-    name = "guava",
-    actual = select({
-        "//build/bazel/platforms/os:android": ":guava-android-host",
-        "//conditions:default": ":guava-jre",
-    }),
-    visibility = ["//visibility:public"],
-)
-
-java_library(
-    name = "guava-android-host",
-    srcs = glob(["android/guava/src/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        ":guava-android-annotation-stubs",
-        ":guava-both",
-        "//external/error_prone:error_prone_annotations",
-    ],
-    exports = [
-        ":guava-both",
-    ],
-    target_compatible_with = ["//build/bazel/platforms/os:android"],
-)
-
-java_library(
-    name = "guava-android-annotation-stubs",
-    srcs = glob(["android-annotation-stubs/src/**/*.java"]),
-)
-
-java_library(
-    name = "guava-both",
-    srcs = glob(["futures/failureaccess/**/*.java"]),
-    deps = [
-        ":guava-android-annotation-stubs",
-        "//external/error_prone:error_prone_annotations",
-        "//external/jsr305",
-    ],
-    exports = [
-        "//external/jsr305",
-    ],
-)
-
-java_library(
-    name = "guava-jre",
-    srcs = glob(["guava/src/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        ":guava-android-annotation-stubs",
-        ":guava-both",
-        "//external/error_prone:error_prone_annotations",
-    ],
-    exports = [
-        ":guava-both",
-    ],
-)
diff --git a/METADATA b/METADATA
index 9bf3de1..5b12c48 100644
--- a/METADATA
+++ b/METADATA
@@ -9,11 +9,11 @@
     type: GIT
     value: "https://github.com/google/guava.git"
   }
-  version: "31.0.1"
+  version: "31.1"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2021
-    month: 12
+    year: 2022
+    month: 6
     day: 7
   }
 }
diff --git a/README.md b/README.md
index d5bcf55..8afda8f 100644
--- a/README.md
+++ b/README.md
@@ -9,11 +9,11 @@
 is widely used on most Java projects within Google, and widely used by many
 other companies as well.
 
-Guava comes in two flavors.
+Guava comes in two flavors:
 
 *   The JRE flavor requires JDK 1.8 or higher.
-*   If you need support for JDK 1.7 or Android, use the Android flavor. You can
-    find the Android Guava source in the [`android` directory].
+*   If you need support for Android, use the Android flavor. You can find the
+    Android Guava source in the [`android` directory].
 
 [`android` directory]: https://github.com/google/guava/tree/master/android
 
@@ -21,9 +21,9 @@
 
 Guava's Maven group ID is `com.google.guava`, and its artifact ID is `guava`.
 Guava provides two different "flavors": one for use on a (Java 8+) JRE and one
-for use on Android or Java 7 or by any library that wants to be compatible with
-either of those. These flavors are specified in the Maven version field as
-either `31.0.1-jre` or `31.0.1-android`. For more about depending on Guava, see
+for use on Android or by any library that wants to be compatible with Android.
+These flavors are specified in the Maven version field as either `31.1-jre` or
+`31.1-android`. For more about depending on Guava, see
 [using Guava in your build].
 
 To add a dependency on Guava using Maven, use the following:
@@ -32,9 +32,9 @@
 <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
-  <version>31.0.1-jre</version>
+  <version>31.1-jre</version>
   <!-- or, for Android: -->
-  <version>31.0.1-android</version>
+  <version>31.1-android</version>
 </dependency>
 ```
 
@@ -45,16 +45,16 @@
   // Pick one:
 
   // 1. Use Guava in your implementation only:
-  implementation("com.google.guava:guava:31.0.1-jre")
+  implementation("com.google.guava:guava:31.1-jre")
 
   // 2. Use Guava types in your public API:
-  api("com.google.guava:guava:31.0.1-jre")
+  api("com.google.guava:guava:31.1-jre")
 
   // 3. Android - Use Guava in your implementation only:
-  implementation("com.google.guava:guava:31.0.1-android")
+  implementation("com.google.guava:guava:31.1-android")
 
   // 4. Android - Use Guava types in your public API:
-  api("com.google.guava:guava:31.0.1-android")
+  api("com.google.guava:guava:31.1-android")
 }
 ```
 
diff --git a/android/guava-bom/pom.xml b/android/guava-bom/pom.xml
index b0afa45..736c02f 100644
--- a/android/guava-bom/pom.xml
+++ b/android/guava-bom/pom.xml
@@ -8,7 +8,7 @@
 
   <groupId>com.google.guava</groupId>
   <artifactId>guava-bom</artifactId>
-  <version>31.0.1-android</version>
+  <version>31.1-android</version>
   <packaging>pom</packaging>
   
   <parent>
diff --git a/android/guava-testlib/pom.xml b/android/guava-testlib/pom.xml
index 8e67de7..1fcf058 100644
--- a/android/guava-testlib/pom.xml
+++ b/android/guava-testlib/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>31.0.1-android</version>
+    <version>31.1-android</version>
   </parent>
   <artifactId>guava-testlib</artifactId>
   <name>Guava Testing Library</name>
@@ -19,10 +19,6 @@
       <artifactId>jsr305</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.checkerframework</groupId>
-      <artifactId>checker-compat-qual</artifactId>
-    </dependency>
-    <dependency>
       <groupId>com.google.errorprone</groupId>
       <artifactId>error_prone_annotations</artifactId>
     </dependency>
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java b/android/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java
index a5674d3..b86ef17 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java
@@ -188,7 +188,7 @@
     E[] elements = createSamplesArray();
     E duplicate = elements[(elements.length / 2) - 1];
     elements[(elements.length / 2) + 1] = duplicate;
-    return new ArrayWithDuplicate<E>(elements, duplicate);
+    return new ArrayWithDuplicate<>(elements, duplicate);
   }
 
   // Helper methods to improve readability of derived classes
@@ -211,7 +211,7 @@
    * requirement {@link com.google.common.collect.testing.features.CollectionFeature#KNOWN_ORDER}.
    */
   protected List<E> getOrderedElements() {
-    List<E> list = new ArrayList<E>();
+    List<E> list = new ArrayList<>();
     for (E e : getSubjectGenerator().order(new ArrayList<E>(getSampleElements()))) {
       list.add(e);
     }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java b/android/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java
index 090442e..5e0de3c 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java
@@ -72,8 +72,8 @@
   /** @return an array of the proper size with {@code null} as the key of the middle element. */
   protected Entry<K, V>[] createArrayWithNullKey() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullKeyLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullKeyLocation];
+    int nullKeyLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullKeyLocation];
     array[nullKeyLocation] = entry(null, oldEntry.getValue());
     return array;
   }
@@ -97,8 +97,8 @@
   /** @return an array of the proper size with {@code null} as the value of the middle element. */
   protected Entry<K, V>[] createArrayWithNullValue() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullValueLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullValueLocation];
+    int nullValueLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullValueLocation];
     array[nullValueLocation] = entry(oldEntry.getKey(), null);
     return array;
   }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java b/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
index 3588e85..a04d3ff 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
@@ -96,9 +96,9 @@
 
     public MapKeySetGenerator(OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>> mapGenerator) {
       this.mapGenerator = mapGenerator;
-      final SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
+      SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
       this.samples =
-          new SampleElements<K>(
+          new SampleElements<>(
               mapSamples.e0().getKey(),
               mapSamples.e1().getKey(),
               mapSamples.e2().getKey(),
@@ -203,9 +203,9 @@
     public MapValueCollectionGenerator(
         OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>> mapGenerator) {
       this.mapGenerator = mapGenerator;
-      final SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
+      SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
       this.samples =
-          new SampleElements<V>(
+          new SampleElements<>(
               mapSamples.e0().getValue(),
               mapSamples.e1().getValue(),
               mapSamples.e2().getValue(),
@@ -239,14 +239,13 @@
     @Override
     public V[] createArray(int length) {
       // noinspection UnnecessaryLocalVariable
-      final V[] vs =
-          ((TestMapGenerator<K, V>) mapGenerator.getInnerGenerator()).createValueArray(length);
+      V[] vs = ((TestMapGenerator<K, V>) mapGenerator.getInnerGenerator()).createValueArray(length);
       return vs;
     }
 
     @Override
     public Iterable<V> order(List<V> insertionOrder) {
-      final List<Entry<K, V>> orderedEntries =
+      List<Entry<K, V>> orderedEntries =
           castOrCopyToList(mapGenerator.order(castOrCopyToList(mapGenerator.getSampleElements(5))));
       sort(
           insertionOrder,
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
index b629fa9..db086aa 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
@@ -185,7 +185,7 @@
 
     TestSuite suite = new TestSuite(name);
     for (Class<? extends AbstractTester> testerClass : testers) {
-      final TestSuite testerSuite =
+      TestSuite testerSuite =
           makeSuiteForTesterClass((Class<? extends AbstractTester<?>>) testerClass);
       if (testerSuite.countTestCases() > 0) {
         suite.addTest(testerSuite);
@@ -211,7 +211,7 @@
   protected abstract List<Class<? extends AbstractTester>> getTesters();
 
   private boolean matches(Test test) {
-    final Method method;
+    Method method;
     try {
       method = extractMethod(test);
     } catch (IllegalArgumentException e) {
@@ -222,7 +222,7 @@
       logger.finer(Platform.format("%s: excluding because it was explicitly suppressed.", test));
       return false;
     }
-    final TesterRequirements requirements;
+    TesterRequirements requirements;
     try {
       requirements = FeatureUtil.getTesterRequirements(method);
     } catch (ConflictingRequirementsException e) {
@@ -268,8 +268,8 @@
   }
 
   protected TestSuite makeSuiteForTesterClass(Class<? extends AbstractTester<?>> testerClass) {
-    final TestSuite candidateTests = new TestSuite(testerClass);
-    final TestSuite suite = filterSuite(candidateTests);
+    TestSuite candidateTests = new TestSuite(testerClass);
+    TestSuite suite = filterSuite(candidateTests);
 
     Enumeration<?> allTests = suite.tests();
     while (allTests.hasMoreElements()) {
@@ -286,7 +286,7 @@
 
   private TestSuite filterSuite(TestSuite suite) {
     TestSuite filtered = new TestSuite(suite.getName());
-    final Enumeration<?> tests = suite.tests();
+    Enumeration<?> tests = suite.tests();
     while (tests.hasMoreElements()) {
       Test test = (Test) tests.nextElement();
       if (matches(test)) {
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java b/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java
index 8efafc3..aac71cc 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java
@@ -49,7 +49,7 @@
 
   // Clone of Lists.newArrayList
   public static <E> List<E> copyToList(Iterable<? extends E> elements) {
-    List<E> list = new ArrayList<E>();
+    List<E> list = new ArrayList<>();
     addAll(list, elements);
     return list;
   }
@@ -60,7 +60,7 @@
 
   // Clone of Sets.newLinkedHashSet
   public static <E> Set<E> copyToSet(Iterable<? extends E> elements) {
-    Set<E> set = new LinkedHashSet<E>();
+    Set<E> set = new LinkedHashSet<>();
     addAll(set, elements);
     return set;
   }
@@ -188,11 +188,11 @@
     return modified;
   }
 
-  static <T> Iterable<T> reverse(final List<T> list) {
+  static <T> Iterable<T> reverse(List<T> list) {
     return new Iterable<T>() {
       @Override
       public Iterator<T> iterator() {
-        final ListIterator<T> listIter = list.listIterator(list.size());
+        ListIterator<T> listIter = list.listIterator(list.size());
         return new Iterator<T>() {
           @Override
           public boolean hasNext() {
@@ -213,7 +213,7 @@
     };
   }
 
-  static <T> Iterator<T> cycle(final Iterable<T> iterable) {
+  static <T> Iterator<T> cycle(Iterable<T> iterable) {
     return new Iterator<T>() {
       Iterator<T> iterator = Collections.<T>emptySet().iterator();
 
@@ -251,7 +251,7 @@
   }
 
   public static <K, V> Comparator<Entry<K, V>> entryComparator(
-      final Comparator<? super K> keyComparator) {
+      Comparator<? super K> keyComparator) {
     return new Comparator<Entry<K, V>>() {
       @Override
       @SuppressWarnings("unchecked") // no less safe than putting it in the map!
@@ -345,7 +345,7 @@
    * @param delta the difference between the true size of the collection and the values returned by
    *     the size method
    */
-  public static <T> Collection<T> misleadingSizeCollection(final int delta) {
+  public static <T> Collection<T> misleadingSizeCollection(int delta) {
     // It would be nice to be able to return a real concurrent
     // collection like ConcurrentLinkedQueue, so that e.g. concurrent
     // iteration would work, but that would not be GWT-compatible.
@@ -363,7 +363,7 @@
    * equals. This is used for testing unmodifiable collections of map entries; for example, it
    * should not be possible to access the raw (modifiable) map entry via a nefarious equals method.
    */
-  public static <K, V> Entry<K, V> nefariousMapEntry(final K key, final V value) {
+  public static <K, V> Entry<K, V> nefariousMapEntry(K key, V value) {
     return new Entry<K, V>() {
       @Override
       public K getKey() {
@@ -410,7 +410,7 @@
     if (iterable instanceof List) {
       return (List<E>) iterable;
     }
-    List<E> list = new ArrayList<E>();
+    List<E> list = new ArrayList<>();
     for (E e : iterable) {
       list.add(e);
     }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java b/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
index b8b5c28..4849138 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
@@ -149,7 +149,7 @@
     for (V value : values) {
       if (value != null) {
         try {
-          value.hashCode();
+          int unused = value.hashCode();
         } catch (Exception e) {
           return false;
         }
@@ -265,7 +265,7 @@
   protected void assertMoreInvariants(Map<K, V> map) {}
 
   public void testClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -286,8 +286,8 @@
   }
 
   public void testContainsKey() {
-    final Map<K, V> map;
-    final K unmappedKey;
+    Map<K, V> map;
+    K unmappedKey;
     try {
       map = makePopulatedMap();
       unmappedKey = getKeyNotInPopulatedMap();
@@ -312,8 +312,8 @@
   }
 
   public void testContainsValue() {
-    final Map<K, V> map;
-    final V unmappedValue;
+    Map<K, V> map;
+    V unmappedValue;
     try {
       map = makePopulatedMap();
       unmappedValue = getValueNotInPopulatedMap();
@@ -334,8 +334,8 @@
   }
 
   public void testEntrySet() {
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -344,8 +344,8 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final K unmappedKey;
-    final V unmappedValue;
+    K unmappedKey;
+    V unmappedValue;
     try {
       unmappedKey = getKeyNotInPopulatedMap();
       unmappedValue = getValueNotInPopulatedMap();
@@ -359,7 +359,7 @@
   }
 
   public void testEntrySetForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -369,8 +369,8 @@
   }
 
   public void testEntrySetContainsEntryIncompatibleKey() {
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -379,7 +379,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -396,8 +396,8 @@
     if (!allowsNullKeys || !supportsPut) {
       return;
     }
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -406,7 +406,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -420,8 +420,8 @@
   }
 
   public void testEntrySetContainsEntryNullKeyMissing() {
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -430,7 +430,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -450,7 +450,7 @@
   }
 
   public void testEntrySetIteratorRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -488,7 +488,7 @@
   }
 
   public void testEntrySetRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -512,8 +512,8 @@
   }
 
   public void testEntrySetRemoveMissingKey() {
-    final Map<K, V> map;
-    final K key;
+    Map<K, V> map;
+    K key;
     try {
       map = makeEitherMap();
       key = getKeyNotInPopulatedMap();
@@ -540,7 +540,7 @@
   }
 
   public void testEntrySetRemoveDifferentValue() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -570,8 +570,8 @@
     if (!allowsNullKeys || !supportsPut || !supportsRemove) {
       return;
     }
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -580,7 +580,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -597,7 +597,7 @@
   }
 
   public void testEntrySetRemoveNullKeyMissing() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -626,7 +626,7 @@
   }
 
   public void testEntrySetRemoveAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -663,7 +663,7 @@
   }
 
   public void testEntrySetRemoveAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -689,7 +689,7 @@
   }
 
   public void testEntrySetRetainAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -717,7 +717,7 @@
   }
 
   public void testEntrySetRetainAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -743,7 +743,7 @@
   }
 
   public void testEntrySetClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -765,10 +765,10 @@
   }
 
   public void testEntrySetAddAndAddAll() {
-    final Map<K, V> map = makeEitherMap();
+    Map<K, V> map = makeEitherMap();
 
     Set<Entry<K, V>> entrySet = map.entrySet();
-    final Entry<K, V> entryToAdd = mapEntry(null, null);
+    Entry<K, V> entryToAdd = mapEntry(null, null);
     try {
       entrySet.add(entryToAdd);
       fail("Expected UnsupportedOperationException or NullPointerException.");
@@ -793,8 +793,8 @@
       return;
     }
 
-    final Map<K, V> map;
-    final V valueToSet;
+    Map<K, V> map;
+    V valueToSet;
     try {
       map = makePopulatedMap();
       valueToSet = getValueNotInPopulatedMap();
@@ -804,8 +804,8 @@
 
     Set<Entry<K, V>> entrySet = map.entrySet();
     Entry<K, V> entry = entrySet.iterator().next();
-    final V oldValue = entry.getValue();
-    final V returnedValue = entry.setValue(valueToSet);
+    V oldValue = entry.getValue();
+    V returnedValue = entry.setValue(valueToSet);
     assertEquals(oldValue, returnedValue);
     assertTrue(entrySet.contains(mapEntry(entry.getKey(), valueToSet)));
     assertEquals(valueToSet, map.get(entry.getKey()));
@@ -819,7 +819,7 @@
       return;
     }
 
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -828,8 +828,8 @@
 
     Set<Entry<K, V>> entrySet = map.entrySet();
     Entry<K, V> entry = entrySet.iterator().next();
-    final V oldValue = entry.getValue();
-    final V returnedValue = entry.setValue(oldValue);
+    V oldValue = entry.getValue();
+    V returnedValue = entry.setValue(oldValue);
     assertEquals(oldValue, returnedValue);
     assertTrue(entrySet.contains(mapEntry(entry.getKey(), oldValue)));
     assertEquals(oldValue, map.get(entry.getKey()));
@@ -837,15 +837,16 @@
   }
 
   public void testEqualsForEqualMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
 
-    assertEquals(map, map);
-    assertEquals(makePopulatedMap(), map);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(map.equals(map));
+    assertTrue(makePopulatedMap().equals(map));
     assertFalse(map.equals(Collections.emptyMap()));
     // no-inspection ObjectEqualsNull
     assertFalse(map.equals(null));
@@ -856,8 +857,8 @@
       return;
     }
 
-    final Map<K, V> map;
-    final Map<K, V> largerMap;
+    Map<K, V> map;
+    Map<K, V> largerMap;
     try {
       map = makePopulatedMap();
       largerMap = makePopulatedMap();
@@ -874,8 +875,8 @@
       return;
     }
 
-    final Map<K, V> map;
-    final Map<K, V> smallerMap;
+    Map<K, V> map;
+    Map<K, V> smallerMap;
     try {
       map = makePopulatedMap();
       smallerMap = makePopulatedMap();
@@ -888,15 +889,16 @@
   }
 
   public void testEqualsForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
 
-    assertEquals(map, map);
-    assertEquals(makeEmptyMap(), map);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(map.equals(map));
+    assertTrue(makeEmptyMap().equals(map));
     assertEquals(Collections.emptyMap(), map);
     assertFalse(map.equals(Collections.emptySet()));
     // noinspection ObjectEqualsNull
@@ -904,7 +906,7 @@
   }
 
   public void testGet() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -925,7 +927,7 @@
   }
 
   public void testGetForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     K unmappedKey = null;
     try {
       map = makeEmptyMap();
@@ -954,7 +956,7 @@
   }
 
   public void testHashCode() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -964,7 +966,7 @@
   }
 
   public void testHashCodeForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -974,9 +976,9 @@
   }
 
   public void testPutNewKey() {
-    final Map<K, V> map = makeEitherMap();
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map = makeEitherMap();
+    K keyToPut;
+    V valueToPut;
     try {
       keyToPut = getKeyNotInPopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
@@ -1002,9 +1004,9 @@
   }
 
   public void testPutExistingKey() {
-    final Map<K, V> map;
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map;
+    K keyToPut;
+    V valueToPut;
     try {
       map = makePopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
@@ -1033,16 +1035,16 @@
     if (!supportsPut) {
       return;
     }
-    final Map<K, V> map = makeEitherMap();
-    final V valueToPut;
+    Map<K, V> map = makeEitherMap();
+    V valueToPut;
     try {
       valueToPut = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
     if (allowsNullKeys) {
-      final V oldValue = map.get(null);
-      final V returnedValue = map.put(null, valueToPut);
+      V oldValue = map.get(null);
+      V returnedValue = map.put(null, valueToPut);
       assertEquals(oldValue, returnedValue);
       assertEquals(valueToPut, map.get(null));
       assertTrue(map.containsKey(null));
@@ -1061,8 +1063,8 @@
     if (!supportsPut) {
       return;
     }
-    final Map<K, V> map = makeEitherMap();
-    final K keyToPut;
+    Map<K, V> map = makeEitherMap();
+    K keyToPut;
     try {
       keyToPut = getKeyNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1070,8 +1072,8 @@
     }
     if (allowsNullValues) {
       int initialSize = map.size();
-      final V oldValue = map.get(keyToPut);
-      final V returnedValue = map.put(keyToPut, null);
+      V oldValue = map.get(keyToPut);
+      V returnedValue = map.put(keyToPut, null);
       assertEquals(oldValue, returnedValue);
       assertNull(map.get(keyToPut));
       assertTrue(map.containsKey(keyToPut));
@@ -1091,8 +1093,8 @@
     if (!supportsPut) {
       return;
     }
-    final Map<K, V> map;
-    final K keyToPut;
+    Map<K, V> map;
+    K keyToPut;
     try {
       map = makePopulatedMap();
       keyToPut = map.keySet().iterator().next();
@@ -1101,8 +1103,8 @@
     }
     if (allowsNullValues) {
       int initialSize = map.size();
-      final V oldValue = map.get(keyToPut);
-      final V returnedValue = map.put(keyToPut, null);
+      V oldValue = map.get(keyToPut);
+      V returnedValue = map.put(keyToPut, null);
       assertEquals(oldValue, returnedValue);
       assertNull(map.get(keyToPut));
       assertTrue(map.containsKey(keyToPut));
@@ -1119,16 +1121,16 @@
   }
 
   public void testPutAllNewKey() {
-    final Map<K, V> map = makeEitherMap();
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map = makeEitherMap();
+    K keyToPut;
+    V valueToPut;
     try {
       keyToPut = getKeyNotInPopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
-    final Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
+    Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
     if (supportsPut) {
       int initialSize = map.size();
       map.putAll(mapToPut);
@@ -1147,9 +1149,9 @@
   }
 
   public void testPutAllExistingKey() {
-    final Map<K, V> map;
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map;
+    K keyToPut;
+    V valueToPut;
     try {
       map = makePopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
@@ -1157,7 +1159,7 @@
       return;
     }
     keyToPut = map.keySet().iterator().next();
-    final Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
+    Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
     int initialSize = map.size();
     if (supportsPut) {
       map.putAll(mapToPut);
@@ -1176,8 +1178,8 @@
   }
 
   public void testRemove() {
-    final Map<K, V> map;
-    final K keyToRemove;
+    Map<K, V> map;
+    K keyToRemove;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1202,8 +1204,8 @@
   }
 
   public void testRemoveMissingKey() {
-    final Map<K, V> map;
-    final K keyToRemove;
+    Map<K, V> map;
+    K keyToRemove;
     try {
       map = makePopulatedMap();
       keyToRemove = getKeyNotInPopulatedMap();
@@ -1229,7 +1231,7 @@
   }
 
   public void testKeySetRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1254,7 +1256,7 @@
   }
 
   public void testKeySetRemoveAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1279,7 +1281,7 @@
   }
 
   public void testKeySetRetainAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1303,7 +1305,7 @@
   }
 
   public void testKeySetClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -1325,7 +1327,7 @@
   }
 
   public void testKeySetRemoveAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1351,7 +1353,7 @@
   }
 
   public void testKeySetRetainAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1377,8 +1379,8 @@
   }
 
   public void testValues() {
-    final Map<K, V> map;
-    final Collection<V> valueCollection;
+    Map<K, V> map;
+    Collection<V> valueCollection;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1387,7 +1389,7 @@
     assertInvariants(map);
 
     valueCollection = map.values();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1399,7 +1401,7 @@
   }
 
   public void testValuesIteratorRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1434,7 +1436,7 @@
   }
 
   public void testValuesRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1460,8 +1462,8 @@
   }
 
   public void testValuesRemoveMissing() {
-    final Map<K, V> map;
-    final V valueToRemove;
+    Map<K, V> map;
+    V valueToRemove;
     try {
       map = makeEitherMap();
       valueToRemove = getValueNotInPopulatedMap();
@@ -1485,7 +1487,7 @@
   }
 
   public void testValuesRemoveAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1513,7 +1515,7 @@
   }
 
   public void testValuesRemoveAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1539,7 +1541,7 @@
   }
 
   public void testValuesRetainAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1567,7 +1569,7 @@
   }
 
   public void testValuesRetainAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1593,7 +1595,7 @@
   }
 
   public void testValuesClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java b/android/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java
index a6ec93d..2adf072 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java
@@ -33,12 +33,12 @@
   // TODO: expose allow nulls parameter?
 
   public static <E> MinimalCollection<E> of(E... contents) {
-    return new MinimalCollection<E>(Object.class, true, contents);
+    return new MinimalCollection<>(Object.class, true, contents);
   }
 
   // TODO: use this
   public static <E> MinimalCollection<E> ofClassAndContents(Class<? super E> type, E... contents) {
-    return new MinimalCollection<E>(type, true, contents);
+    return new MinimalCollection<>(type, true, contents);
   }
 
   private final E[] contents;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java b/android/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java
index c151c15..15d48db 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java
@@ -51,7 +51,7 @@
   /** Returns an iterable whose iterator returns the given elements in order. */
   public static <E> MinimalIterable<E> of(E... elements) {
     // Make sure to get an unmodifiable iterator
-    return new MinimalIterable<E>(Arrays.asList(elements).iterator());
+    return new MinimalIterable<>(Arrays.asList(elements).iterator());
   }
 
   /**
@@ -59,7 +59,7 @@
    * out of the source collection at the time this method is called.
    */
   @SuppressWarnings("unchecked") // Es come in, Es go out
-  public static <E> MinimalIterable<E> from(final Collection<E> elements) {
+  public static <E> MinimalIterable<E> from(Collection<E> elements) {
     return (MinimalIterable) of(elements.toArray());
   }
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java b/android/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java
index 988dd3f..9a87d24 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java
@@ -45,13 +45,13 @@
 
   public static <E> MinimalSet<E> ofClassAndContents(
       Class<? super E> type, E[] emptyArrayForContents, Iterable<? extends E> contents) {
-    List<E> setContents = new ArrayList<E>();
+    List<E> setContents = new ArrayList<>();
     for (E e : contents) {
       if (!setContents.contains(e)) {
         setContents.add(e);
       }
     }
-    return new MinimalSet<E>(type, setContents.toArray(emptyArrayForContents));
+    return new MinimalSet<>(type, setContents.toArray(emptyArrayForContents));
   }
 
   private MinimalSet(Class<? super E> type, E... contents) {
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java
index 77a1984..0e1a229 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java
@@ -116,10 +116,10 @@
 
   /** Create a suite whose maps are descending views of other maps. */
   private TestSuite createDescendingSuite(
-      final FeatureSpecificTestSuiteBuilder<
+      FeatureSpecificTestSuiteBuilder<
               ?, ? extends OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>>>
           parentBuilder) {
-    final TestSortedMapGenerator<K, V> delegate =
+    TestSortedMapGenerator<K, V> delegate =
         (TestSortedMapGenerator<K, V>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>();
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java
index 38eb56e..4c86ab4 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java
@@ -40,7 +40,7 @@
 @GwtIncompatible
 public final class NavigableSetTestSuiteBuilder<E> extends SortedSetTestSuiteBuilder<E> {
   public static <E> NavigableSetTestSuiteBuilder<E> using(TestSortedSetGenerator<E> generator) {
-    NavigableSetTestSuiteBuilder<E> builder = new NavigableSetTestSuiteBuilder<E>();
+    NavigableSetTestSuiteBuilder<E> builder = new NavigableSetTestSuiteBuilder<>();
     builder.usingGenerator(generator);
     return builder;
   }
@@ -99,10 +99,9 @@
 
   /** Create a suite whose maps are descending views of other maps. */
   private TestSuite createDescendingSuite(
-      final FeatureSpecificTestSuiteBuilder<
-              ?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
+      FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
           parentBuilder) {
-    final TestSetGenerator<E> delegate =
+    TestSetGenerator<E> delegate =
         (TestSetGenerator<E>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>();
@@ -124,7 +123,7 @@
 
               @Override
               public Iterable<E> order(List<E> insertionOrder) {
-                List<E> list = new ArrayList<E>();
+                List<E> list = new ArrayList<>();
                 for (E e : delegate.order(insertionOrder)) {
                   list.add(e);
                 }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java b/android/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java
index 1b8924c..1ff3fac 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java
@@ -70,7 +70,7 @@
     @SuppressWarnings("unchecked")
     List<E> allSampleElements =
         Arrays.asList(samples.e0(), samples.e1(), samples.e2(), samples.e3(), samples.e4());
-    return new ArrayList<E>(allSampleElements.subList(0, howMany));
+    return new ArrayList<>(allSampleElements.subList(0, howMany));
   }
 
   @Override
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java b/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java
index 28d6f79..923f56f 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java
@@ -42,7 +42,7 @@
 
   public static <E> ReserializingTestCollectionGenerator<E> newInstance(
       TestCollectionGenerator<E> delegate) {
-    return new ReserializingTestCollectionGenerator<E>(delegate);
+    return new ReserializingTestCollectionGenerator<>(delegate);
   }
 
   @Override
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java b/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java
index c92a3ff..555440a 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java
@@ -35,7 +35,7 @@
   }
 
   public static <E> TestSetGenerator<E> newInstance(TestSetGenerator<E> delegate) {
-    return new ReserializingTestSetGenerator<E>(delegate);
+    return new ReserializingTestSetGenerator<>(delegate);
   }
 
   @Override
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java b/android/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java
index 8ed4810..91d9fd9 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java
@@ -117,7 +117,7 @@
 
   @Override
   public NavigableSet<E> descendingSet() {
-    return new SafeTreeSet<E>(delegate.descendingSet());
+    return new SafeTreeSet<>(delegate.descendingSet());
   }
 
   @Override
@@ -137,7 +137,7 @@
 
   @Override
   public NavigableSet<E> headSet(E toElement, boolean inclusive) {
-    return new SafeTreeSet<E>(delegate.headSet(checkValid(toElement), inclusive));
+    return new SafeTreeSet<>(delegate.headSet(checkValid(toElement), inclusive));
   }
 
   @Override
@@ -198,7 +198,7 @@
   @Override
   public NavigableSet<E> subSet(
       E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
-    return new SafeTreeSet<E>(
+    return new SafeTreeSet<>(
         delegate.subSet(
             checkValid(fromElement), fromInclusive, checkValid(toElement), toInclusive));
   }
@@ -215,7 +215,7 @@
 
   @Override
   public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
-    return new SafeTreeSet<E>(delegate.tailSet(checkValid(fromElement), inclusive));
+    return new SafeTreeSet<>(delegate.tailSet(checkValid(fromElement), inclusive));
   }
 
   @Override
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java b/android/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java
index 829c4cc..03266ab 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java
@@ -56,7 +56,7 @@
   }
 
   public void testTailMapWriteThrough() {
-    final SortedMap<K, V> map;
+    SortedMap<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -82,7 +82,7 @@
   }
 
   public void testTailMapRemoveThrough() {
-    final SortedMap<K, V> map;
+    SortedMap<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -105,7 +105,7 @@
   }
 
   public void testTailMapClearThrough() {
-    final SortedMap<K, V> map;
+    SortedMap<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
index aa1d6d5..7944aaa 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
@@ -105,12 +105,12 @@
    * these extreme values rather than relying on their regular sort ordering.
    */
   final TestSuite createSubmapSuite(
-      final FeatureSpecificTestSuiteBuilder<
+      FeatureSpecificTestSuiteBuilder<
               ?, ? extends OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>>>
           parentBuilder,
-      final Bound from,
-      final Bound to) {
-    final TestSortedMapGenerator<K, V> delegate =
+      Bound from,
+      Bound to) {
+    TestSortedMapGenerator<K, V> delegate =
         (TestSortedMapGenerator<K, V>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>();
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
index 5092661..2835769 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
@@ -34,7 +34,7 @@
 @GwtIncompatible
 public class SortedSetTestSuiteBuilder<E> extends SetTestSuiteBuilder<E> {
   public static <E> SortedSetTestSuiteBuilder<E> using(TestSortedSetGenerator<E> generator) {
-    SortedSetTestSuiteBuilder<E> builder = new SortedSetTestSuiteBuilder<E>();
+    SortedSetTestSuiteBuilder<E> builder = new SortedSetTestSuiteBuilder<>();
     builder.usingGenerator(generator);
     return builder;
   }
@@ -78,12 +78,11 @@
    * these extreme values rather than relying on their regular sort ordering.
    */
   final TestSuite createSubsetSuite(
-      final FeatureSpecificTestSuiteBuilder<
-              ?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
+      FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
           parentBuilder,
-      final Bound from,
-      final Bound to) {
-    final TestSortedSetGenerator<E> delegate =
+      Bound from,
+      Bound to) {
+    TestSortedSetGenerator<E> delegate =
         (TestSortedSetGenerator<E>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>(parentBuilder.getFeatures());
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java b/android/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java
index 95cbc0b..2d11a08 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java
@@ -139,12 +139,12 @@
    */
   static TesterRequirements buildTesterRequirements(Class<?> testerClass)
       throws ConflictingRequirementsException {
-    final TesterRequirements declaredRequirements = buildDeclaredTesterRequirements(testerClass);
+    TesterRequirements declaredRequirements = buildDeclaredTesterRequirements(testerClass);
     Class<?> baseClass = testerClass.getSuperclass();
     if (baseClass == null) {
       return declaredRequirements;
     } else {
-      final TesterRequirements clonedBaseRequirements =
+      TesterRequirements clonedBaseRequirements =
           new TesterRequirements(getTesterRequirements(baseClass));
       return incorporateRequirements(clonedBaseRequirements, declaredRequirements, testerClass);
     }
@@ -176,8 +176,8 @@
   private static TesterRequirements buildTesterRequirements(Annotation testerAnnotation)
       throws ConflictingRequirementsException {
     Class<? extends Annotation> annotationClass = testerAnnotation.annotationType();
-    final Feature<?>[] presentFeatures;
-    final Feature<?>[] absentFeatures;
+    Feature<?>[] presentFeatures;
+    Feature<?>[] absentFeatures;
     try {
       presentFeatures = (Feature[]) annotationClass.getMethod("value").invoke(testerAnnotation);
       absentFeatures = (Feature[]) annotationClass.getMethod("absent").invoke(testerAnnotation);
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java b/android/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java
index 7b7801d..7f649e7 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java
@@ -48,8 +48,8 @@
   /** @return an array of the proper size with {@code null} as the key of the middle element. */
   protected Entry<K, V>[] createArrayWithNullKey() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullKeyLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullKeyLocation];
+    int nullKeyLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullKeyLocation];
     array[nullKeyLocation] = Helpers.mapEntry(null, oldEntry.getValue());
     return array;
   }
@@ -57,8 +57,8 @@
   /** @return an array of the proper size with {@code null} as the value of the middle element. */
   protected Entry<K, V>[] createArrayWithNullValue() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullValueLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullValueLocation];
+    int nullValueLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullValueLocation];
     array[nullValueLocation] = Helpers.mapEntry(oldEntry.getKey(), null);
     return array;
   }
@@ -69,7 +69,7 @@
    */
   protected Entry<K, V>[] createArrayWithNullKeyAndValue() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullValueLocation = getNullLocation();
+    int nullValueLocation = getNullLocation();
     array[nullValueLocation] = Helpers.mapEntry(null, null);
     return array;
   }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java b/android/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java
index bbeefd2..35579a0 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java
@@ -159,9 +159,9 @@
     public BiMapValueSetGenerator(
         OneSizeTestContainerGenerator<BiMap<K, V>, Entry<K, V>> mapGenerator) {
       this.mapGenerator = mapGenerator;
-      final SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
+      SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
       this.samples =
-          new SampleElements<V>(
+          new SampleElements<>(
               mapSamples.e0().getValue(),
               mapSamples.e1().getValue(),
               mapSamples.e2().getValue(),
@@ -194,7 +194,7 @@
 
     @Override
     public V[] createArray(int length) {
-      final V[] vs =
+      V[] vs =
           ((TestBiMapGenerator<K, V>) mapGenerator.getInnerGenerator()).createValueArray(length);
       return vs;
     }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java b/android/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
index bb84ea1..35063e8 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
@@ -54,7 +54,7 @@
       for (Entry<String, String> entry : entries) {
         builder.put(entry.getKey(), entry.getValue());
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
   }
 
@@ -86,7 +86,7 @@
       for (UnhashableObject value : elements) {
         builder.put(key++, value);
       }
-      return builder.build().values();
+      return builder.buildOrThrow().values();
     }
   }
 
@@ -97,7 +97,7 @@
       for (int i = 0; i < elements.length; i++) {
         builder.put(elements[i], i);
       }
-      return builder.build().keySet().asList();
+      return builder.buildOrThrow().keySet().asList();
     }
   }
 
@@ -108,7 +108,7 @@
       for (int i = 0; i < elements.length; i++) {
         builder.put(i, elements[i]);
       }
-      return builder.build().values().asList();
+      return builder.buildOrThrow().values().asList();
     }
   }
 
@@ -144,7 +144,7 @@
         Entry<String, Integer> entry = (Entry<String, Integer>) o;
         builder.put(entry);
       }
-      return builder.build().entrySet().asList();
+      return builder.buildOrThrow().entrySet().asList();
     }
   }
 
@@ -210,7 +210,7 @@
         Integer value = Iterables.getOnlyElement(entry.getValue());
         builder.put(entry.getKey(), value);
       }
-      return builder.build().asMultimap().asMap();
+      return builder.buildOrThrow().asMultimap().asMap();
     }
 
     @Override
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java b/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java
index b65cd96..ce8e283 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java
@@ -82,7 +82,7 @@
   @SuppressWarnings("unchecked")
   // Needed to stop Eclipse whining
   private void resetWithHole() {
-    List<E> container = new ArrayList<E>();
+    List<E> container = new ArrayList<>();
     container.addAll(Collections.nCopies(a.getCount(), a.getElement()));
     container.addAll(Collections.nCopies(c.getCount(), c.getElement()));
     super.resetContainer(getSubjectGenerator().create(container.toArray()));
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java b/android/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java
index 49187dd..6e79957 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java
@@ -58,7 +58,7 @@
 
   @MapFeature.Require(SUPPORTS_REMOVE)
   public void testAsMapRemoveImplementsSet() {
-    List<K> keys = new ArrayList<K>(multimap().keySet());
+    List<K> keys = new ArrayList<>(multimap().keySet());
     for (K key : keys) {
       resetCollection();
       assertTrue(multimap().asMap().remove(key) instanceof Set);
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
index dafd521..b44494b 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
@@ -56,7 +56,7 @@
 @GwtIncompatible
 public class SortedMultisetTestSuiteBuilder<E> extends MultisetTestSuiteBuilder<E> {
   public static <E> SortedMultisetTestSuiteBuilder<E> using(TestMultisetGenerator<E> generator) {
-    SortedMultisetTestSuiteBuilder<E> result = new SortedMultisetTestSuiteBuilder<E>();
+    SortedMultisetTestSuiteBuilder<E> result = new SortedMultisetTestSuiteBuilder<>();
     result.usingGenerator(generator);
     return result;
   }
@@ -138,8 +138,8 @@
   }
 
   private TestSuite createSubMultisetSuite(
-      SortedMultisetTestSuiteBuilder<E> parentBuilder, final Bound from, final Bound to) {
-    final TestMultisetGenerator<E> delegate =
+      SortedMultisetTestSuiteBuilder<E> parentBuilder, Bound from, Bound to) {
+    TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
     Set<Feature<?>> features = new HashSet<>();
@@ -152,15 +152,15 @@
     }
 
     SortedMultiset<E> emptyMultiset = (SortedMultiset<E>) delegate.create();
-    final Comparator<? super E> comparator = emptyMultiset.comparator();
+    Comparator<? super E> comparator = emptyMultiset.comparator();
     SampleElements<E> samples = delegate.samples();
     @SuppressWarnings("unchecked")
     List<E> samplesList =
         Arrays.asList(samples.e0(), samples.e1(), samples.e2(), samples.e3(), samples.e4());
 
     Collections.sort(samplesList, comparator);
-    final E firstInclusive = samplesList.get(0);
-    final E lastInclusive = samplesList.get(samplesList.size() - 1);
+    E firstInclusive = samplesList.get(0);
+    E lastInclusive = samplesList.get(samplesList.size() - 1);
 
     return SortedMultisetTestSuiteBuilder.using(
             new ForwardingTestMultisetGenerator<E>(delegate) {
@@ -187,7 +187,7 @@
                 }
 
                 // the regular values should be visible after filtering
-                List<E> allEntries = new ArrayList<E>();
+                List<E> allEntries = new ArrayList<>();
                 allEntries.addAll(extremeValues);
                 allEntries.addAll(normalValues);
                 SortedMultiset<E> multiset =
@@ -234,7 +234,7 @@
   }
 
   private TestSuite createDescendingSuite(SortedMultisetTestSuiteBuilder<E> parentBuilder) {
-    final TestMultisetGenerator<E> delegate =
+    TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
     Set<Feature<?>> features = new HashSet<>();
@@ -263,7 +263,7 @@
   }
 
   private TestSuite createReserializedSuite(SortedMultisetTestSuiteBuilder<E> parentBuilder) {
-    final TestMultisetGenerator<E> delegate =
+    TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
     Set<Feature<?>> features = new HashSet<>(parentBuilder.getFeatures());
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java b/android/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java
index 1c00f09..e95b74f 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java
@@ -52,7 +52,7 @@
 
   @MapFeature.Require(SUPPORTS_REMOVE)
   public void testAsMapRemoveImplementsSortedSet() {
-    List<K> keys = new ArrayList<K>(multimap().keySet());
+    List<K> keys = new ArrayList<>(multimap().keySet());
     for (K key : keys) {
       resetCollection();
       SortedSet<V> valueSet = (SortedSet<V>) multimap().asMap().remove(key);
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java b/android/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java
index 005746f..40b2c85 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java
@@ -201,7 +201,7 @@
    * @param sampleElement an element of the same type as that contained by {@code multiset}. {@code
    *     multiset} may or may not have {@code sampleElement} as a member.
    */
-  public static <E> void assertMultisetIsUnmodifiable(Multiset<E> multiset, final E sampleElement) {
+  public static <E> void assertMultisetIsUnmodifiable(Multiset<E> multiset, E sampleElement) {
     Multiset<E> copy = LinkedHashMultiset.create(multiset);
     assertCollectionsAreEquivalent(multiset, copy);
 
@@ -264,7 +264,7 @@
    *     multimap} may or may not have {@code sampleValue} as a key.
    */
   public static <K, V> void assertMultimapIsUnmodifiable(
-      Multimap<K, V> multimap, final K sampleKey, final V sampleValue) {
+      Multimap<K, V> multimap, K sampleKey, V sampleValue) {
     List<Entry<K, V>> originalEntries =
         Collections.unmodifiableList(Lists.newArrayList(multimap.entries()));
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java b/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
index b170497..1699fe1 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
@@ -51,7 +51,7 @@
 @Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
 public class CollectionIteratorTester<E> extends AbstractCollectionTester<E> {
   public void testIterator() {
-    List<E> iteratorElements = new ArrayList<E>();
+    List<E> iteratorElements = new ArrayList<>();
     for (E element : collection) { // uses iterator()
       iteratorElements.add(element);
     }
@@ -60,7 +60,7 @@
 
   @CollectionFeature.Require(KNOWN_ORDER)
   public void testIterationOrdering() {
-    List<E> iteratorElements = new ArrayList<E>();
+    List<E> iteratorElements = new ArrayList<>();
     for (E element : collection) { // uses iterator()
       iteratorElements.add(element);
     }
@@ -72,7 +72,7 @@
   @CollectionSize.Require(absent = ZERO)
   public void testIterator_nullElement() {
     initCollectionWithNullElement();
-    List<E> iteratorElements = new ArrayList<E>();
+    List<E> iteratorElements = new ArrayList<>();
     for (E element : collection) { // uses iterator()
       iteratorElements.add(element);
     }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java b/android/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java
index 3901616..8b056b4 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java
@@ -218,7 +218,7 @@
 
   @CollectionSize.Require(SEVERAL)
   public void testDescendingNavigation() {
-    List<E> descending = new ArrayList<E>();
+    List<E> descending = new ArrayList<>();
     for (Iterator<E> i = navigableSet.descendingIterator(); i.hasNext(); ) {
       descending.add(i.next());
     }
diff --git a/android/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java b/android/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java
index 3920afe..31ac201 100644
--- a/android/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java
+++ b/android/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.escape.Escapers.computeReplacement;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.CharEscaper;
 import com.google.common.escape.Escaper;
@@ -32,7 +31,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 public final class EscaperAsserts {
   private EscaperAsserts() {}
diff --git a/android/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java b/android/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java
index 962b15f..1e31bbf 100644
--- a/android/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java
+++ b/android/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java
@@ -116,12 +116,7 @@
    * @since 19.0
    */
   public static final Predicate<Class<?>> UNDERSCORE_IN_NAME =
-      new Predicate<Class<?>>() {
-        @Override
-        public boolean apply(Class<?> c) {
-          return c.getSimpleName().contains("_");
-        }
-      };
+      (Class<?> c) -> c.getSimpleName().contains("_");
 
   /* The names of the expected method that tests null checks. */
   private static final ImmutableList<String> NULL_TEST_METHOD_NAMES =
@@ -152,12 +147,7 @@
   private final ClassSanityTester tester = new ClassSanityTester();
   private Visibility visibility = Visibility.PACKAGE;
   private Predicate<Class<?>> classFilter =
-      new Predicate<Class<?>>() {
-        @Override
-        public boolean apply(Class<?> cls) {
-          return visibility.isVisible(cls.getModifiers());
-        }
-      };
+      (Class<?> cls) -> visibility.isVisible(cls.getModifiers());
 
   /**
    * Restricts the sanity tests for public API only. By default, package-private API are also
@@ -415,8 +405,8 @@
 
   abstract static class Chopper {
 
-    final Chopper or(final Chopper you) {
-      final Chopper i = this;
+    final Chopper or(Chopper you) {
+      Chopper i = this;
       return new Chopper() {
         @Override
         Optional<String> chop(String str) {
@@ -427,7 +417,7 @@
 
     abstract Optional<String> chop(String str);
 
-    static Chopper suffix(final String suffix) {
+    static Chopper suffix(String suffix) {
       return new Chopper() {
         @Override
         Optional<String> chop(String str) {
diff --git a/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java b/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
index 01904d6..26f4df4 100644
--- a/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
+++ b/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Charsets;
@@ -74,6 +73,7 @@
 import com.google.common.primitives.Primitives;
 import com.google.common.primitives.UnsignedInteger;
 import com.google.common.primitives.UnsignedLong;
+import com.google.errorprone.annotations.Keep;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -142,7 +142,7 @@
 import java.util.regex.MatchResult;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Supplies an arbitrary "default" instance for a wide range of types, often useful in testing
@@ -166,7 +166,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @GwtIncompatible
 public final class ArbitraryInstances {
 
@@ -327,7 +326,7 @@
   }
 
   @SuppressWarnings("unchecked") // it's a subtype map
-  @NullableDecl
+  @CheckForNull
   private static <T> Class<? extends T> getImplementation(Class<T> type) {
     return (Class<? extends T>) implementations.get(type);
   }
@@ -338,7 +337,7 @@
    * Returns an arbitrary instance for {@code type}, or {@code null} if no arbitrary instance can be
    * determined.
    */
-  @NullableDecl
+  @CheckForNull
   public static <T> T get(Class<T> type) {
     T defaultValue = DEFAULTS.getInstance(type);
     if (defaultValue != null) {
@@ -386,7 +385,7 @@
     }
   }
 
-  @NullableDecl
+  @CheckForNull
   private static <T> T arbitraryConstantInstanceOrNull(Class<T> type) {
     Field[] fields = type.getDeclaredFields();
     Arrays.sort(fields, BY_FIELD_NAME);
@@ -430,6 +429,7 @@
     }
 
     public static final class DeterministicRandom extends Random {
+      @Keep
       public DeterministicRandom() {
         super(0);
       }
diff --git a/android/guava-testlib/src/com/google/common/testing/ClassSanityTester.java b/android/guava-testlib/src/com/google/common/testing/ClassSanityTester.java
index 55f167e..0931785 100644
--- a/android/guava-testlib/src/com/google/common/testing/ClassSanityTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/ClassSanityTester.java
@@ -50,9 +50,9 @@
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tester that runs automated sanity tests for any given class. A typical use case is to test static
@@ -334,7 +334,7 @@
    * @return The instantiated instance, or {@code null} if the class has no non-private constructor
    *     or factory method to be constructed.
    */
-  @NullableDecl
+  @CheckForNull
   <T> T instantiate(Class<T> cls)
       throws ParameterNotInstantiableException, IllegalAccessException, InvocationTargetException,
           FactoryMethodReturnsNullException {
@@ -383,7 +383,7 @@
    *     class, preventing its methods from being accessible.
    * @throws InvocationTargetException if a static method threw exception.
    */
-  @NullableDecl
+  @CheckForNull
   private <T> T instantiate(Invokable<?, ? extends T> factory)
       throws ParameterNotInstantiableException, InvocationTargetException, IllegalAccessException {
     return invoke(factory, getDummyArguments(factory));
@@ -664,7 +664,7 @@
     return generator;
   }
 
-  @NullableDecl
+  @CheckForNull
   private static Object generateDummyArg(Parameter param, FreshValueGenerator generator)
       throws ParameterNotInstantiableException {
     if (isNullable(param)) {
@@ -761,7 +761,7 @@
     return instance;
   }
 
-  @NullableDecl
+  @CheckForNull
   private static <T> T invoke(Invokable<?, ? extends T> factory, List<?> args)
       throws InvocationTargetException, IllegalAccessException {
     T returnValue = factory.invoke(null, args.toArray());
diff --git a/android/guava-testlib/src/com/google/common/testing/EqualsTester.java b/android/guava-testlib/src/com/google/common/testing/EqualsTester.java
index 2c8e08b..9c93c9a 100644
--- a/android/guava-testlib/src/com/google/common/testing/EqualsTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/EqualsTester.java
@@ -20,7 +20,6 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Equivalence;
 import com.google.common.collect.ImmutableList;
@@ -74,7 +73,6 @@
  * @author Jige Yu
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public final class EqualsTester {
   private static final int REPETITIONS = 3;
@@ -122,7 +120,7 @@
       assertTrue(
           item + " must not be Object#equals to an arbitrary object of another class",
           !item.equals(NotAnInstance.EQUAL_TO_NOTHING));
-      assertEquals(item + " must be Object#equals to itself", item, item);
+      assertTrue(item + " must be Object#equals to itself", item.equals(item));
       assertEquals(
           "the Object#hashCode of " + item + " must be consistent",
           item.hashCode(),
diff --git a/android/guava-testlib/src/com/google/common/testing/EquivalenceTester.java b/android/guava-testlib/src/com/google/common/testing/EquivalenceTester.java
index ce1dc98..8de2625 100644
--- a/android/guava-testlib/src/com/google/common/testing/EquivalenceTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/EquivalenceTester.java
@@ -20,7 +20,6 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Equivalence;
 import com.google.common.collect.ImmutableList;
@@ -49,7 +48,6 @@
  * @author Gregory Kick
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public final class EquivalenceTester<T> {
   private static final int REPETITIONS = 3;
@@ -60,12 +58,11 @@
 
   private EquivalenceTester(Equivalence<? super T> equivalence) {
     this.equivalence = checkNotNull(equivalence);
-    this.delegate =
-        new RelationshipTester<T>(equivalence, "equivalent", "hash", new ItemReporter());
+    this.delegate = new RelationshipTester<>(equivalence, "equivalent", "hash", new ItemReporter());
   }
 
   public static <T> EquivalenceTester<T> of(Equivalence<? super T> equivalence) {
-    return new EquivalenceTester<T>(equivalence);
+    return new EquivalenceTester<>(equivalence);
   }
 
   /**
diff --git a/android/guava-testlib/src/com/google/common/testing/FakeTicker.java b/android/guava-testlib/src/com/google/common/testing/FakeTicker.java
index 698db6a..5736353 100644
--- a/android/guava-testlib/src/com/google/common/testing/FakeTicker.java
+++ b/android/guava-testlib/src/com/google/common/testing/FakeTicker.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Ticker;
 import java.util.concurrent.TimeUnit;
@@ -35,7 +34,6 @@
  * @author Jige Yu
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public class FakeTicker extends Ticker {
 
diff --git a/android/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java b/android/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java
index 4ee461e..605d3a0 100644
--- a/android/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java
@@ -22,7 +22,6 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.fail;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Function;
 import com.google.common.base.Throwables;
@@ -53,7 +52,6 @@
  * @author Ben Yu
  * @since 14.0
  */
-@Beta
 @GwtIncompatible
 public final class ForwardingWrapperTester {
 
@@ -129,7 +127,7 @@
 
   private static <T> void testExceptionPropagation(
       Class<T> interfaceType, Method method, Function<? super T, ? extends T> wrapperFunction) {
-    final RuntimeException exception = new RuntimeException();
+    RuntimeException exception = new RuntimeException();
     T proxy =
         Reflection.newProxy(
             interfaceType,
@@ -175,7 +173,7 @@
 
   private static Object[] getParameterValues(Method method) {
     FreshValueGenerator paramValues = new FreshValueGenerator();
-    final List<Object> passedArgs = Lists.newArrayList();
+    List<Object> passedArgs = Lists.newArrayList();
     for (Class<?> paramType : method.getParameterTypes()) {
       passedArgs.add(paramValues.generateFresh(paramType));
     }
diff --git a/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java b/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
index 9110490..259f50c 100644
--- a/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
+++ b/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
@@ -118,7 +118,7 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Pattern;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Generates fresh instances of types that are different from each other (if possible).
@@ -137,7 +137,7 @@
         builder.put(method.getReturnType(), method);
       }
     }
-    GENERATORS = builder.build();
+    GENERATORS = builder.buildOrThrow();
   }
 
   private static final ImmutableMap<Class<?>, Method> EMPTY_GENERATORS;
@@ -149,7 +149,7 @@
         builder.put(method.getReturnType(), method);
       }
     }
-    EMPTY_GENERATORS = builder.build();
+    EMPTY_GENERATORS = builder.buildOrThrow();
   }
 
   private final AtomicInteger freshness = new AtomicInteger(1);
@@ -175,7 +175,7 @@
    *   <li>null if no value can be generated.
    * </ul>
    */
-  @NullableDecl
+  @CheckForNull
   final Object generateFresh(TypeToken<?> type) {
     Object generated = generate(type);
     if (generated != null) {
@@ -184,7 +184,7 @@
     return generated;
   }
 
-  @NullableDecl
+  @CheckForNull
   final <T> T generateFresh(Class<T> type) {
     return Primitives.wrap(type).cast(generateFresh(TypeToken.of(type)));
   }
@@ -299,7 +299,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof FreshInvocationHandler) {
         FreshInvocationHandler that = (FreshInvocationHandler) obj;
         return identity == that.identity;
@@ -647,29 +647,29 @@
   }
 
   @Generates
-  static <E> Iterable<E> generateIterable(@NullableDecl E freshElement) {
+  static <E> Iterable<E> generateIterable(@CheckForNull E freshElement) {
     return generateList(freshElement);
   }
 
   @Generates
-  static <E> Collection<E> generateCollection(@NullableDecl E freshElement) {
+  static <E> Collection<E> generateCollection(@CheckForNull E freshElement) {
     return generateList(freshElement);
   }
 
   @Generates
-  static <E> List<E> generateList(@NullableDecl E freshElement) {
+  static <E> List<E> generateList(@CheckForNull E freshElement) {
     return generateArrayList(freshElement);
   }
 
   @Generates
-  static <E> ArrayList<E> generateArrayList(@NullableDecl E freshElement) {
+  static <E> ArrayList<E> generateArrayList(@CheckForNull E freshElement) {
     ArrayList<E> list = Lists.newArrayList();
     list.add(freshElement);
     return list;
   }
 
   @Generates
-  static <E> LinkedList<E> generateLinkedList(@NullableDecl E freshElement) {
+  static <E> LinkedList<E> generateLinkedList(@CheckForNull E freshElement) {
     LinkedList<E> list = Lists.newLinkedList();
     list.add(freshElement);
     return list;
@@ -686,17 +686,17 @@
   }
 
   @Generates
-  static <E> Set<E> generateSet(@NullableDecl E freshElement) {
+  static <E> Set<E> generateSet(@CheckForNull E freshElement) {
     return generateHashSet(freshElement);
   }
 
   @Generates
-  static <E> HashSet<E> generateHashSet(@NullableDecl E freshElement) {
+  static <E> HashSet<E> generateHashSet(@CheckForNull E freshElement) {
     return generateLinkedHashSet(freshElement);
   }
 
   @Generates
-  static <E> LinkedHashSet<E> generateLinkedHashSet(@NullableDecl E freshElement) {
+  static <E> LinkedHashSet<E> generateLinkedHashSet(@CheckForNull E freshElement) {
     LinkedHashSet<E> set = Sets.newLinkedHashSet();
     set.add(freshElement);
     return set;
@@ -731,19 +731,19 @@
   }
 
   @Generates
-  static <E> Multiset<E> generateMultiset(@NullableDecl E freshElement) {
+  static <E> Multiset<E> generateMultiset(@CheckForNull E freshElement) {
     return generateHashMultiset(freshElement);
   }
 
   @Generates
-  static <E> HashMultiset<E> generateHashMultiset(@NullableDecl E freshElement) {
+  static <E> HashMultiset<E> generateHashMultiset(@CheckForNull E freshElement) {
     HashMultiset<E> multiset = HashMultiset.create();
     multiset.add(freshElement);
     return multiset;
   }
 
   @Generates
-  static <E> LinkedHashMultiset<E> generateLinkedHashMultiset(@NullableDecl E freshElement) {
+  static <E> LinkedHashMultiset<E> generateLinkedHashMultiset(@CheckForNull E freshElement) {
     LinkedHashMultiset<E> multiset = LinkedHashMultiset.create();
     multiset.add(freshElement);
     return multiset;
@@ -773,18 +773,18 @@
   }
 
   @Generates
-  static <K, V> Map<K, V> generateMap(@NullableDecl K key, @NullableDecl V value) {
+  static <K, V> Map<K, V> generateMap(@CheckForNull K key, @CheckForNull V value) {
     return generateHashdMap(key, value);
   }
 
   @Generates
-  static <K, V> HashMap<K, V> generateHashdMap(@NullableDecl K key, @NullableDecl V value) {
+  static <K, V> HashMap<K, V> generateHashdMap(@CheckForNull K key, @CheckForNull V value) {
     return generateLinkedHashMap(key, value);
   }
 
   @Generates
   static <K, V> LinkedHashMap<K, V> generateLinkedHashMap(
-      @NullableDecl K key, @NullableDecl V value) {
+      @CheckForNull K key, @CheckForNull V value) {
     LinkedHashMap<K, V> map = Maps.newLinkedHashMap();
     map.put(key, value);
     return map;
@@ -809,19 +809,19 @@
 
   @Generates
   static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap(
-      K key, @NullableDecl V value) {
+      K key, @CheckForNull V value) {
     return generateNavigableMap(key, value);
   }
 
   @Generates
   static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap(
-      K key, @NullableDecl V value) {
+      K key, @CheckForNull V value) {
     return generateTreeMap(key, value);
   }
 
   @Generates
   static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap(
-      K key, @NullableDecl V value) {
+      K key, @CheckForNull V value) {
     TreeMap<K, V> map = Maps.newTreeMap();
     map.put(key, value);
     return map;
@@ -834,7 +834,7 @@
   }
 
   @Generates
-  static <K, V> Multimap<K, V> generateMultimap(@NullableDecl K key, @NullableDecl V value) {
+  static <K, V> Multimap<K, V> generateMultimap(@CheckForNull K key, @CheckForNull V value) {
     return generateListMultimap(key, value);
   }
 
@@ -845,13 +845,13 @@
 
   @Generates
   static <K, V> ListMultimap<K, V> generateListMultimap(
-      @NullableDecl K key, @NullableDecl V value) {
+      @CheckForNull K key, @CheckForNull V value) {
     return generateArrayListMultimap(key, value);
   }
 
   @Generates
   static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap(
-      @NullableDecl K key, @NullableDecl V value) {
+      @CheckForNull K key, @CheckForNull V value) {
     ArrayListMultimap<K, V> multimap = ArrayListMultimap.create();
     multimap.put(key, value);
     return multimap;
@@ -863,13 +863,13 @@
   }
 
   @Generates
-  static <K, V> SetMultimap<K, V> generateSetMultimap(@NullableDecl K key, @NullableDecl V value) {
+  static <K, V> SetMultimap<K, V> generateSetMultimap(@CheckForNull K key, @CheckForNull V value) {
     return generateLinkedHashMultimap(key, value);
   }
 
   @Generates
   static <K, V> HashMultimap<K, V> generateHashMultimap(
-      @NullableDecl K key, @NullableDecl V value) {
+      @CheckForNull K key, @CheckForNull V value) {
     HashMultimap<K, V> multimap = HashMultimap.create();
     multimap.put(key, value);
     return multimap;
@@ -877,7 +877,7 @@
 
   @Generates
   static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap(
-      @NullableDecl K key, @NullableDecl V value) {
+      @CheckForNull K key, @CheckForNull V value) {
     LinkedHashMultimap<K, V> multimap = LinkedHashMultimap.create();
     multimap.put(key, value);
     return multimap;
@@ -889,12 +889,12 @@
   }
 
   @Generates
-  static <K, V> BiMap<K, V> generateBimap(@NullableDecl K key, @NullableDecl V value) {
+  static <K, V> BiMap<K, V> generateBimap(@CheckForNull K key, @CheckForNull V value) {
     return generateHashBiMap(key, value);
   }
 
   @Generates
-  static <K, V> HashBiMap<K, V> generateHashBiMap(@NullableDecl K key, @NullableDecl V value) {
+  static <K, V> HashBiMap<K, V> generateHashBiMap(@CheckForNull K key, @CheckForNull V value) {
     HashBiMap<K, V> bimap = HashBiMap.create();
     bimap.put(key, value);
     return bimap;
@@ -907,13 +907,13 @@
 
   @Generates
   static <R, C, V> Table<R, C, V> generateTable(
-      @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) {
+      @CheckForNull R row, @CheckForNull C column, @CheckForNull V value) {
     return generateHashBasedTable(row, column, value);
   }
 
   @Generates
   static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable(
-      @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) {
+      @CheckForNull R row, @CheckForNull C column, @CheckForNull V value) {
     HashBasedTable<R, C, V> table = HashBasedTable.create();
     table.put(row, column, value);
     return table;
diff --git a/android/guava-testlib/src/com/google/common/testing/GcFinalization.java b/android/guava-testlib/src/com/google/common/testing/GcFinalization.java
index 015afea..da6aa22 100644
--- a/android/guava-testlib/src/com/google/common/testing/GcFinalization.java
+++ b/android/guava-testlib/src/com/google/common/testing/GcFinalization.java
@@ -18,7 +18,6 @@
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.DoNotMock;
 import com.google.j2objc.annotations.J2ObjCIncompatible;
@@ -103,7 +102,6 @@
  * @author Martin Buchholz
  * @since 11.0
  */
-@Beta
 @GwtIncompatible
 @J2ObjCIncompatible // gc
 public final class GcFinalization {
@@ -138,8 +136,8 @@
     if (future.isDone()) {
       return;
     }
-    final long timeoutSeconds = timeoutSeconds();
-    final long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
+    long timeoutSeconds = timeoutSeconds();
+    long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
     do {
       System.runFinalization();
       if (future.isDone()) {
@@ -170,8 +168,8 @@
     if (predicate.isDone()) {
       return;
     }
-    final long timeoutSeconds = timeoutSeconds();
-    final long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
+    long timeoutSeconds = timeoutSeconds();
+    long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
     do {
       System.runFinalization();
       if (predicate.isDone()) {
@@ -198,8 +196,8 @@
     if (latch.getCount() == 0) {
       return;
     }
-    final long timeoutSeconds = timeoutSeconds();
-    final long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
+    long timeoutSeconds = timeoutSeconds();
+    long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
     do {
       System.runFinalization();
       if (latch.getCount() == 0) {
@@ -222,13 +220,14 @@
    * Creates a garbage object that counts down the latch in its finalizer. Sequestered into a
    * separate method to make it somewhat more likely to be unreachable.
    */
-  private static void createUnreachableLatchFinalizer(final CountDownLatch latch) {
-    new Object() {
-      @Override
-      protected void finalize() {
-        latch.countDown();
-      }
-    };
+  private static void createUnreachableLatchFinalizer(CountDownLatch latch) {
+    Object unused =
+        new Object() {
+          @Override
+          protected void finalize() {
+            latch.countDown();
+          }
+        };
   }
 
   /**
@@ -263,7 +262,7 @@
    *
    * @throws RuntimeException if timed out or interrupted while waiting
    */
-  public static void awaitClear(final WeakReference<?> ref) {
+  public static void awaitClear(WeakReference<?> ref) {
     awaitDone(
         new FinalizationPredicate() {
           @Override
@@ -296,9 +295,9 @@
    * @since 12.0
    */
   public static void awaitFullGc() {
-    final CountDownLatch finalizerRan = new CountDownLatch(1);
+    CountDownLatch finalizerRan = new CountDownLatch(1);
     WeakReference<Object> ref =
-        new WeakReference<Object>(
+        new WeakReference<>(
             new Object() {
               @Override
               protected void finalize() {
diff --git a/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java b/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java
index e32a950..4c24c65 100644
--- a/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Converter;
 import com.google.common.base.Objects;
@@ -45,9 +44,9 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
+import javax.annotation.CheckForNull;
 import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A test utility that verifies that your methods and constructors throw {@link
@@ -66,7 +65,6 @@
  * @author Kevin Bourrillion
  * @since 10.0
  */
-@Beta
 @GwtIncompatible
 public final class NullPointerTester {
 
@@ -176,7 +174,7 @@
    *
    * @param instance the instance to invoke {@code method} on, or null if {@code method} is static
    */
-  public void testMethod(@NullableDecl Object instance, Method method) {
+  public void testMethod(@CheckForNull Object instance, Method method) {
     Class<?>[] types = method.getParameterTypes();
     for (int nullIndex = 0; nullIndex < types.length; nullIndex++) {
       testMethodParameter(instance, method, nullIndex);
@@ -208,7 +206,7 @@
    * @param instance the instance to invoke {@code method} on, or null if {@code method} is static
    */
   public void testMethodParameter(
-      @NullableDecl final Object instance, final Method method, int paramIndex) {
+      @CheckForNull final Object instance, final Method method, int paramIndex) {
     method.setAccessible(true);
     testParameter(instance, invokable(instance, method), paramIndex, method.getDeclaringClass());
   }
@@ -461,7 +459,7 @@
     }.newProxy(type);
   }
 
-  private static Invokable<?, ?> invokable(@NullableDecl Object instance, Method method) {
+  private static Invokable<?, ?> invokable(@CheckForNull Object instance, Method method) {
     if (instance == null) {
       return Invokable.from(method);
     } else {
diff --git a/android/guava-testlib/src/com/google/common/testing/RelationshipTester.java b/android/guava-testlib/src/com/google/common/testing/RelationshipTester.java
index 5adf010..d5b9b6a 100644
--- a/android/guava-testlib/src/com/google/common/testing/RelationshipTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/RelationshipTester.java
@@ -147,7 +147,7 @@
   }
 
   private Item<T> getItem(int groupNumber, int itemNumber) {
-    return new Item<T>(groups.get(groupNumber).get(itemNumber), groupNumber, itemNumber);
+    return new Item<>(groups.get(groupNumber).get(itemNumber), groupNumber, itemNumber);
   }
 
   static final class Item<T> {
diff --git a/android/guava-testlib/src/com/google/common/testing/SerializableTester.java b/android/guava-testlib/src/com/google/common/testing/SerializableTester.java
index 6298076..c4e6d23 100644
--- a/android/guava-testlib/src/com/google/common/testing/SerializableTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/SerializableTester.java
@@ -16,7 +16,6 @@
 
 package com.google.common.testing;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
@@ -32,7 +31,6 @@
  * @author Mike Bostock
  * @since 10.0
  */
-@Beta
 @GwtCompatible // but no-op!
 public final class SerializableTester {
   private SerializableTester() {}
@@ -52,7 +50,6 @@
    * @throws RuntimeException if the specified object was not successfully serialized or
    *     deserialized
    */
-  @SuppressWarnings("unchecked")
   public static <T> T reserialize(T object) {
     return Platform.reserialize(object);
   }
diff --git a/android/guava-testlib/src/com/google/common/testing/TestLogHandler.java b/android/guava-testlib/src/com/google/common/testing/TestLogHandler.java
index c03093b..263f890 100644
--- a/android/guava-testlib/src/com/google/common/testing/TestLogHandler.java
+++ b/android/guava-testlib/src/com/google/common/testing/TestLogHandler.java
@@ -16,14 +16,13 @@
 
 package com.google.common.testing;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.logging.Handler;
 import java.util.logging.LogRecord;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Tests may use this to intercept messages that are logged by the code under test. Example:
@@ -52,7 +51,6 @@
  * @author Kevin Bourrillion
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public class TestLogHandler extends Handler {
   /** We will keep a private list of all logged records */
@@ -60,7 +58,7 @@
 
   /** Adds the most recently logged record to our list. */
   @Override
-  public synchronized void publish(@NullableDecl LogRecord record) {
+  public synchronized void publish(@CheckForNull LogRecord record) {
     list.add(record);
   }
 
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java
index 2ba7515..b5bec2c 100644
--- a/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java
+++ b/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java
@@ -16,6 +16,9 @@
 
 package com.google.common.util.concurrent.testing;
 
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -68,21 +71,18 @@
     assertFalse(future.isDone());
     assertFalse(future.isCancelled());
 
-    final CountDownLatch successLatch = new CountDownLatch(1);
-    final Throwable[] badness = new Throwable[1];
+    CountDownLatch successLatch = new CountDownLatch(1);
+    Throwable[] badness = new Throwable[1];
 
     // Wait on the future in a separate thread.
     new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  assertSame(Boolean.TRUE, future.get());
-                  successLatch.countDown();
-                } catch (Throwable t) {
-                  t.printStackTrace();
-                  badness[0] = t;
-                }
+            () -> {
+              try {
+                assertSame(Boolean.TRUE, future.get());
+                successLatch.countDown();
+              } catch (Throwable t) {
+                t.printStackTrace();
+                badness[0] = t;
               }
             })
         .start();
@@ -90,7 +90,7 @@
     // Release the future value.
     latch.countDown();
 
-    assertTrue(successLatch.await(10, TimeUnit.SECONDS));
+    assertTrue(successLatch.await(10, SECONDS));
 
     if (badness[0] != null) {
       throw badness[0];
@@ -105,7 +105,7 @@
 
     // The task thread waits for the latch, so we expect a timeout here.
     try {
-      future.get(20, TimeUnit.MILLISECONDS);
+      future.get(20, MILLISECONDS);
       fail("Should have timed out trying to get the value.");
     } catch (TimeoutException expected) {
     } finally {
@@ -123,20 +123,17 @@
     assertFalse(future.isDone());
     assertFalse(future.isCancelled());
 
-    final CountDownLatch successLatch = new CountDownLatch(1);
+    CountDownLatch successLatch = new CountDownLatch(1);
 
     // Run cancellation in a separate thread as an extra thread-safety test.
     new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  future.get();
-                } catch (CancellationException expected) {
-                  successLatch.countDown();
-                } catch (Exception ignored) {
-                  // All other errors are ignored, we expect a cancellation.
-                }
+            () -> {
+              try {
+                future.get();
+              } catch (CancellationException expected) {
+                successLatch.countDown();
+              } catch (Exception ignored) {
+                // All other errors are ignored, we expect a cancellation.
               }
             })
         .start();
@@ -149,37 +146,27 @@
     assertTrue(future.isDone());
     assertTrue(future.isCancelled());
 
-    assertTrue(successLatch.await(200, TimeUnit.MILLISECONDS));
+    assertTrue(successLatch.await(200, MILLISECONDS));
 
     latch.countDown();
   }
 
   public void testListenersNotifiedOnError() throws Exception {
-    final CountDownLatch successLatch = new CountDownLatch(1);
-    final CountDownLatch listenerLatch = new CountDownLatch(1);
+    CountDownLatch successLatch = new CountDownLatch(1);
+    CountDownLatch listenerLatch = new CountDownLatch(1);
 
     ExecutorService exec = Executors.newCachedThreadPool();
 
-    future.addListener(
-        new Runnable() {
-          @Override
-          public void run() {
-            listenerLatch.countDown();
-          }
-        },
-        exec);
+    future.addListener(listenerLatch::countDown, exec);
 
     new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  future.get();
-                } catch (CancellationException expected) {
-                  successLatch.countDown();
-                } catch (Exception ignored) {
-                  // No success latch count down.
-                }
+            () -> {
+              try {
+                future.get();
+              } catch (CancellationException expected) {
+                successLatch.countDown();
+              } catch (Exception ignored) {
+                // No success latch count down.
               }
             })
         .start();
@@ -189,13 +176,13 @@
     assertTrue(future.isCancelled());
     assertTrue(future.isDone());
 
-    assertTrue(successLatch.await(200, TimeUnit.MILLISECONDS));
-    assertTrue(listenerLatch.await(200, TimeUnit.MILLISECONDS));
+    assertTrue(successLatch.await(200, MILLISECONDS));
+    assertTrue(listenerLatch.await(200, MILLISECONDS));
 
     latch.countDown();
 
     exec.shutdown();
-    exec.awaitTermination(100, TimeUnit.MILLISECONDS);
+    exec.awaitTermination(100, MILLISECONDS);
   }
 
   /**
@@ -209,7 +196,7 @@
     ExecutorService exec = Executors.newCachedThreadPool();
 
     int listenerCount = 20;
-    final CountDownLatch listenerLatch = new CountDownLatch(listenerCount);
+    CountDownLatch listenerLatch = new CountDownLatch(listenerCount);
 
     // Test that listeners added both before and after the value is available
     // get called correctly.
@@ -217,31 +204,17 @@
 
       // Right in the middle start up a thread to close the latch.
       if (i == 10) {
-        new Thread(
-                new Runnable() {
-                  @Override
-                  public void run() {
-                    latch.countDown();
-                  }
-                })
-            .start();
+        new Thread(() -> latch.countDown()).start();
       }
 
-      future.addListener(
-          new Runnable() {
-            @Override
-            public void run() {
-              listenerLatch.countDown();
-            }
-          },
-          exec);
+      future.addListener(listenerLatch::countDown, exec);
     }
 
     assertSame(Boolean.TRUE, future.get());
     // Wait for the listener latch to complete.
-    listenerLatch.await(500, TimeUnit.MILLISECONDS);
+    listenerLatch.await(500, MILLISECONDS);
 
     exec.shutdown();
-    exec.awaitTermination(500, TimeUnit.MILLISECONDS);
+    exec.awaitTermination(500, MILLISECONDS);
   }
 }
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java
index fc3ed21..a2fe4f4 100644
--- a/android/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java
+++ b/android/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java
@@ -17,13 +17,13 @@
 package com.google.common.util.concurrent.testing;
 
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
 import junit.framework.Assert;
 
 /**
@@ -59,7 +59,7 @@
    */
   public void assertSuccess(Object expectedData) throws Throwable {
     // Verify that the listener executed in a reasonable amount of time.
-    Assert.assertTrue(countDownLatch.await(1L, TimeUnit.SECONDS));
+    Assert.assertTrue(countDownLatch.await(1L, SECONDS));
 
     try {
       Assert.assertEquals(expectedData, future.get());
@@ -75,7 +75,7 @@
    */
   public void assertException(Throwable expectedCause) throws Exception {
     // Verify that the listener executed in a reasonable amount of time.
-    Assert.assertTrue(countDownLatch.await(1L, TimeUnit.SECONDS));
+    Assert.assertTrue(countDownLatch.await(1L, SECONDS));
 
     try {
       future.get();
@@ -88,6 +88,6 @@
   public void assertTimeout() throws Exception {
     // Verify that the listener does not get called in a reasonable amount of
     // time.
-    Assert.assertFalse(countDownLatch.await(1L, TimeUnit.SECONDS));
+    Assert.assertFalse(countDownLatch.await(1L, SECONDS));
   }
 }
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java
index c232218..25b7ef7 100644
--- a/android/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java
+++ b/android/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java
@@ -140,11 +140,11 @@
 
   @Override
   public <V> ListenableScheduledFuture<V> schedule(
-      final Callable<V> callable, long delay, TimeUnit unit) {
+      Callable<V> callable, long delay, TimeUnit unit) {
     Preconditions.checkNotNull(callable, "callable must not be null!");
     Preconditions.checkNotNull(unit, "unit must not be null!");
     ListenableFuture<V> delegateFuture = submit(callable);
-    return new ImmediateScheduledFuture<V>(delegateFuture);
+    return new ImmediateScheduledFuture<>(delegateFuture);
   }
 
   private static class ImmediateScheduledFuture<V> extends SimpleForwardingListenableFuture<V>
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java
index 4212430..dc2c40d 100644
--- a/android/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java
+++ b/android/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java
@@ -16,6 +16,8 @@
 
 package com.google.common.util.concurrent.testing;
 
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.ImmutableList;
@@ -153,7 +155,7 @@
         implements ListenableScheduledFuture<V> {
 
       static <V> NeverScheduledFuture<V> create() {
-        return new NeverScheduledFuture<V>();
+        return new NeverScheduledFuture<>();
       }
 
       @Override
@@ -163,7 +165,7 @@
 
       @Override
       public int compareTo(Delayed other) {
-        return Longs.compare(getDelay(TimeUnit.NANOSECONDS), other.getDelay(TimeUnit.NANOSECONDS));
+        return Longs.compare(getDelay(NANOSECONDS), other.getDelay(NANOSECONDS));
       }
     }
   }
diff --git a/android/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java b/android/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java
index dc0fe37..4d617d6 100644
--- a/android/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java
+++ b/android/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java
@@ -27,7 +27,7 @@
 /** @author Max Ross */
 public class FeatureSpecificTestSuiteBuilderTest extends TestCase {
 
-  static boolean testWasRun;
+  private static boolean testWasRun;
 
   @Override
   protected void setUp() throws Exception {
@@ -52,7 +52,7 @@
   }
 
   public void testLifecycle() {
-    final boolean setUp[] = {false};
+    boolean[] setUp = {false};
     Runnable setUpRunnable =
         new Runnable() {
           @Override
@@ -61,7 +61,7 @@
           }
         };
 
-    final boolean tearDown[] = {false};
+    boolean[] tearDown = {false};
     Runnable tearDownRunnable =
         new Runnable() {
           @Override
diff --git a/android/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java b/android/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
index 586eb28..be1752d 100644
--- a/android/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
@@ -34,9 +34,9 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit tests for {@link ClassSanityTester}.
@@ -58,7 +58,7 @@
         // oneConstantOnly doesn't matter since it's not nullable and can be only 1 value.
         @SuppressWarnings("unused") OneConstantEnum oneConstantOnly,
         // noConstant doesn't matter since it can only be null
-        @SuppressWarnings("unused") @NullableDecl NoConstantEnum noConstant) {
+        @SuppressWarnings("unused") @CheckForNull NoConstantEnum noConstant) {
       return new GoodEquals(a, b);
     }
     // instance method ignored
@@ -106,7 +106,7 @@
   private static class BadEqualsFactory {
     /** oneConstantOnly matters now since it can be either null or the constant. */
     @SuppressWarnings("unused") // Called by reflection
-    public static Object bad(String a, int b, @NullableDecl OneConstantEnum oneConstantOnly) {
+    public static Object bad(String a, int b, @CheckForNull OneConstantEnum oneConstantOnly) {
       return new GoodEquals(a, b);
     }
   }
@@ -287,7 +287,7 @@
   }
 
   public static class FactoryThatReturnsNullAndAnnotated {
-    @NullableDecl
+    @CheckForNull
     public static Object bad() {
       return null;
     }
@@ -616,7 +616,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof HasAnInterface) {
         HasAnInterface that = (HasAnInterface) obj;
         return i.equals(that.i);
@@ -673,7 +673,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       // In general getClass().isInstance() is bad for equals.
       // But here we fully control the subclasses to ensure symmetry.
       if (getClass().isInstance(obj)) {
@@ -753,13 +753,13 @@
 
     // keep trying
     @SuppressWarnings("unused")
-    @NullableDecl
+    @CheckForNull
     public static GoodEquals createMayReturnNull(int a, int b) {
       return null;
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof GoodEquals) {
         GoodEquals that = (GoodEquals) obj;
         return a.equals(that.a) && b == that.b;
@@ -778,12 +778,12 @@
 
     public BadEquals() {} // ignored by testEquals() since it has less parameters.
 
-    public static BadEquals create(@SuppressWarnings("unused") @NullableDecl String s) {
+    public static BadEquals create(@SuppressWarnings("unused") @CheckForNull String s) {
       return new BadEquals();
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       return obj instanceof BadEquals;
     }
 
@@ -1122,7 +1122,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       return obj instanceof BadEqualsWithParameterizedType;
     }
 
@@ -1156,12 +1156,12 @@
     void primitiveOnly(int i) {}
 
     @SuppressWarnings("unused") // reflected
-    void nullableOnly(@NullableDecl String s) {}
+    void nullableOnly(@CheckForNull String s) {}
 
     public void noParameter() {}
 
     @SuppressWarnings("unused") // reflected
-    void primitiveAndNullable(@NullableDecl String s, int i) {}
+    void primitiveAndNullable(@CheckForNull String s, int i) {}
   }
 
   static class FactoryMethodReturnsNullButNotAnnotated {
@@ -1175,7 +1175,7 @@
   static class FactoryMethodReturnsNullAndAnnotated {
     private FactoryMethodReturnsNullAndAnnotated() {}
 
-    @NullableDecl
+    @CheckForNull
     public static FactoryMethodReturnsNullAndAnnotated returnsNull() {
       return null;
     }
@@ -1189,7 +1189,7 @@
       this.name = name;
     }
 
-    static FactoryMethodAcceptsNull create(@NullableDecl String name) {
+    static FactoryMethodAcceptsNull create(@CheckForNull String name) {
       return new FactoryMethodAcceptsNull(name);
     }
   }
@@ -1211,7 +1211,7 @@
 
     final String name;
 
-    public ConstructorAcceptsNull(@NullableDecl String name) {
+    public ConstructorAcceptsNull(@CheckForNull String name) {
       this.name = name;
     }
   }
@@ -1237,7 +1237,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof ConstructorParameterMapOfNotInstantiable) {
         return m.equals(((ConstructorParameterMapOfNotInstantiable) obj).m);
       } else {
@@ -1258,7 +1258,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       throw new UnsupportedOperationException();
     }
 
diff --git a/android/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java b/android/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java
index d612b2c..865c198 100644
--- a/android/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java
@@ -237,7 +237,7 @@
     void replay() {
       checkRecording();
       equivalentExpectations = equivalentExpectationsBuilder.build();
-      hashExpectations = hashExpectationsBuilder.build();
+      hashExpectations = hashExpectationsBuilder.buildOrThrow();
     }
 
     @Override
diff --git a/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java b/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
index d1dc49b..218edef 100644
--- a/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
@@ -44,9 +44,9 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit test for {@link NullPointerTester}.
@@ -86,11 +86,11 @@
       // null?  no problem
     }
 
-    public static void staticOneArgJsr305NullableCorrectlyDoesNotThrowNPE(@NullableDecl String s) {
+    public static void staticOneArgJsr305NullableCorrectlyDoesNotThrowNPE(@CheckForNull String s) {
       // null?  no problem
     }
 
-    public static void staticOneArgNullableCorrectlyDoesNotThrowNPE(@NullableDecl String s) {
+    public static void staticOneArgNullableCorrectlyDoesNotThrowNPE(@CheckForNull String s) {
       // null?  no problem
     }
 
@@ -99,7 +99,7 @@
       throw new FooException(); // ok, as long as it's not NullPointerException
     }
 
-    public static void staticOneArgNullableCorrectlyThrowsOtherThanNPE(@NullableDecl String s) {
+    public static void staticOneArgNullableCorrectlyThrowsOtherThanNPE(@CheckForNull String s) {
       throw new FooException(); // ok, as long as it's not NullPointerException
     }
 
@@ -107,7 +107,7 @@
       checkNotNull(s); // doesn't check if you said you'd accept null, but you don't
     }
 
-    public static void staticOneArgNullableThrowsNPE(@NullableDecl String s) {
+    public static void staticOneArgNullableThrowsNPE(@CheckForNull String s) {
       checkNotNull(s); // doesn't check if you said you'd accept null, but you don't
     }
 
@@ -128,7 +128,7 @@
       // null?  no problem
     }
 
-    public void oneArgNullableCorrectlyDoesNotThrowNPE(@NullableDecl String s) {
+    public void oneArgNullableCorrectlyDoesNotThrowNPE(@CheckForNull String s) {
       // null?  no problem
     }
 
@@ -137,7 +137,7 @@
       throw new FooException(); // ok, as long as it's not NullPointerException
     }
 
-    public void oneArgNullableCorrectlyThrowsOtherThanNPE(@NullableDecl String s) {
+    public void oneArgNullableCorrectlyThrowsOtherThanNPE(@CheckForNull String s) {
       throw new FooException(); // ok, as long as it's not NullPointerException
     }
 
@@ -145,7 +145,7 @@
       checkNotNull(s); // doesn't check if you said you'd accept null, but you don't
     }
 
-    public void oneArgNullableThrowsNPE(@NullableDecl String s) {
+    public void oneArgNullableThrowsNPE(@CheckForNull String s) {
       checkNotNull(s); // doesn't check if you said you'd accept null, but you don't
     }
   }
@@ -347,19 +347,19 @@
 
     /** Two-arg method with the second param Nullable. */
     @SuppressWarnings("GoodTime") // false positive; b/122617528
-    public void normalNullable(String first, @NullableDecl Integer second) {
+    public void normalNullable(String first, @CheckForNull Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the first param Nullable. */
     @SuppressWarnings("GoodTime") // false positive; b/122617528
-    public void nullableNormal(@NullableDecl String first, Integer second) {
+    public void nullableNormal(@CheckForNull String first, Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the both params Nullable. */
     @SuppressWarnings("GoodTime") // false positive; b/122617528
-    public void nullableNullable(@NullableDecl String first, @NullableDecl Integer second) {
+    public void nullableNullable(@CheckForNull String first, @CheckForNull Integer second) {
       reactToNullParameters(first, second);
     }
 
@@ -473,9 +473,9 @@
       checkNotNull(s);
     }
 
-    public void oneNullableArg(@NullableDecl String s) {}
+    public void oneNullableArg(@CheckForNull String s) {}
 
-    public void oneNullableArgThrows(@NullableDecl String s) {
+    public void oneNullableArgThrows(@CheckForNull String s) {
       doThrow(s);
     }
 
@@ -484,31 +484,31 @@
       i.intValue();
     }
 
-    public void twoMixedArgs(String s, @NullableDecl Integer i) {
+    public void twoMixedArgs(String s, @CheckForNull Integer i) {
       checkNotNull(s);
     }
 
-    public void twoMixedArgs(@NullableDecl Integer i, String s) {
+    public void twoMixedArgs(@CheckForNull Integer i, String s) {
       checkNotNull(s);
     }
 
-    public void twoMixedArgsThrows(String s, @NullableDecl Integer i) {
+    public void twoMixedArgsThrows(String s, @CheckForNull Integer i) {
       checkNotNull(s);
       doThrow(i);
     }
 
-    public void twoMixedArgsThrows(@NullableDecl Integer i, String s) {
+    public void twoMixedArgsThrows(@CheckForNull Integer i, String s) {
       checkNotNull(s);
       doThrow(i);
     }
 
-    public void twoNullableArgs(@NullableDecl String s, @NullableDecl Integer i) {}
+    public void twoNullableArgs(@CheckForNull String s, @CheckForNull Integer i) {}
 
-    public void twoNullableArgsThrowsFirstArg(@NullableDecl String s, @NullableDecl Integer i) {
+    public void twoNullableArgsThrowsFirstArg(@CheckForNull String s, @CheckForNull Integer i) {
       doThrow(s);
     }
 
-    public void twoNullableArgsThrowsSecondArg(@NullableDecl String s, @NullableDecl Integer i) {
+    public void twoNullableArgsThrowsSecondArg(@CheckForNull String s, @CheckForNull Integer i) {
       doThrow(i);
     }
 
@@ -516,9 +516,9 @@
       checkNotNull(s);
     }
 
-    public static void staticOneNullableArg(@NullableDecl String s) {}
+    public static void staticOneNullableArg(@CheckForNull String s) {}
 
-    public static void staticOneNullableArgThrows(@NullableDecl String s) {
+    public static void staticOneNullableArgThrows(@CheckForNull String s) {
       doThrow(s);
     }
   }
@@ -551,7 +551,7 @@
 
   private static class PassOneNullableArgThrowsNPE extends PassObject {
     @Override
-    public void oneNullableArg(@NullableDecl String s) {
+    public void oneNullableArg(@CheckForNull String s) {
       checkNotNull(s); // ok to throw NPE
     }
   }
@@ -610,7 +610,7 @@
 
   private static class FailTwoMixedArgsFirstArgDoesntThrowNPE extends PassObject {
     @Override
-    public void twoMixedArgs(String s, @NullableDecl Integer i) {
+    public void twoMixedArgs(String s, @CheckForNull Integer i) {
       // Fail: missing NPE for s
     }
   }
@@ -621,7 +621,7 @@
 
   private static class FailTwoMixedArgsFirstArgThrowsWrongType extends PassObject {
     @Override
-    public void twoMixedArgs(String s, @NullableDecl Integer i) {
+    public void twoMixedArgs(String s, @CheckForNull Integer i) {
       doThrow(s); // Fail:  throwing non-NPE exception for null s
     }
   }
@@ -632,7 +632,7 @@
 
   private static class PassTwoMixedArgsNullableArgThrowsNPE extends PassObject {
     @Override
-    public void twoMixedArgs(String s, @NullableDecl Integer i) {
+    public void twoMixedArgs(String s, @CheckForNull Integer i) {
       checkNotNull(s);
       i.intValue(); // ok to throw NPE?
     }
@@ -644,7 +644,7 @@
 
   private static class PassTwoMixedArgSecondNullableArgThrowsOther extends PassObject {
     @Override
-    public void twoMixedArgs(String s, @NullableDecl Integer i) {
+    public void twoMixedArgs(String s, @CheckForNull Integer i) {
       checkNotNull(s);
       doThrow(i); // ok to throw non-NPE exception for null i
     }
@@ -656,7 +656,7 @@
 
   private static class FailTwoMixedArgsSecondArgDoesntThrowNPE extends PassObject {
     @Override
-    public void twoMixedArgs(@NullableDecl Integer i, String s) {
+    public void twoMixedArgs(@CheckForNull Integer i, String s) {
       // Fail: missing NPE for null s
     }
   }
@@ -667,7 +667,7 @@
 
   private static class FailTwoMixedArgsSecondArgThrowsWrongType extends PassObject {
     @Override
-    public void twoMixedArgs(@NullableDecl Integer i, String s) {
+    public void twoMixedArgs(@CheckForNull Integer i, String s) {
       doThrow(s); // Fail:  throwing non-NPE exception for null s
     }
   }
@@ -678,7 +678,7 @@
 
   private static class PassTwoNullableArgsFirstThrowsNPE extends PassObject {
     @Override
-    public void twoNullableArgs(@NullableDecl String s, @NullableDecl Integer i) {
+    public void twoNullableArgs(@CheckForNull String s, @CheckForNull Integer i) {
       checkNotNull(s); // ok to throw NPE?
     }
   }
@@ -689,7 +689,7 @@
 
   private static class PassTwoNullableArgsFirstThrowsOther extends PassObject {
     @Override
-    public void twoNullableArgs(@NullableDecl String s, @NullableDecl Integer i) {
+    public void twoNullableArgs(@CheckForNull String s, @CheckForNull Integer i) {
       doThrow(s); // ok to throw non-NPE exception for null s
     }
   }
@@ -700,7 +700,7 @@
 
   private static class PassTwoNullableArgsSecondThrowsNPE extends PassObject {
     @Override
-    public void twoNullableArgs(@NullableDecl String s, @NullableDecl Integer i) {
+    public void twoNullableArgs(@CheckForNull String s, @CheckForNull Integer i) {
       i.intValue(); // ok to throw NPE?
     }
   }
@@ -711,7 +711,7 @@
 
   private static class PassTwoNullableArgsSecondThrowsOther extends PassObject {
     @Override
-    public void twoNullableArgs(@NullableDecl String s, @NullableDecl Integer i) {
+    public void twoNullableArgs(@CheckForNull String s, @CheckForNull Integer i) {
       doThrow(i); // ok to throw non-NPE exception for null i
     }
   }
@@ -722,7 +722,7 @@
 
   private static class PassTwoNullableArgsNeitherThrowsAnything extends PassObject {
     @Override
-    public void twoNullableArgs(@NullableDecl String s, @NullableDecl Integer i) {
+    public void twoNullableArgs(@CheckForNull String s, @CheckForNull Integer i) {
       // ok to do nothing
     }
   }
@@ -768,7 +768,7 @@
 
   private static class SubclassThatOverridesBadSuperclassMethod extends BaseClassThatFailsToThrow {
     @Override
-    public void oneArg(@NullableDecl String s) {}
+    public void oneArg(@CheckForNull String s) {}
   }
 
   public void testSubclassThatOverridesBadSuperclassMethod() {
@@ -777,7 +777,7 @@
 
   @SuppressWarnings("unused") // for NullPointerTester
   private static class SubclassOverridesTheWrongMethod extends BaseClassThatFailsToThrow {
-    public void oneArg(@NullableDecl CharSequence s) {}
+    public void oneArg(@CheckForNull CharSequence s) {}
   }
 
   public void testSubclassOverridesTheWrongMethod() {
@@ -801,7 +801,7 @@
 
   private static class SubclassThatTriesToOverrideBadStaticMethod
       extends ClassThatFailsToThrowForStatic {
-    static void staticOneArg(@NullableDecl String s) {}
+    static void staticOneArg(@CheckForNull String s) {}
   }
 
   public void testSubclassThatTriesToOverrideBadStaticMethod() {
@@ -814,7 +814,7 @@
 
   @SuppressWarnings("unused") // used by reflection
   private static class CanCreateDefault {
-    public void foo(@NullableDecl HardToCreate ignored, String required) {
+    public void foo(@CheckForNull HardToCreate ignored, String required) {
       checkNotNull(required);
     }
   }
@@ -877,7 +877,7 @@
 
   @SuppressWarnings("unused") // used by reflection
   private static class PrivateClassWithPrivateConstructor {
-    private PrivateClassWithPrivateConstructor(@NullableDecl Integer argument) {}
+    private PrivateClassWithPrivateConstructor(@CheckForNull Integer argument) {}
   }
 
   public void testPrivateClass() {
diff --git a/android/guava-tests/benchmark/com/google/common/collect/ConcurrentHashMultisetBenchmark.java b/android/guava-tests/benchmark/com/google/common/collect/ConcurrentHashMultisetBenchmark.java
index 5b713f2..086a634 100644
--- a/android/guava-tests/benchmark/com/google/common/collect/ConcurrentHashMultisetBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/collect/ConcurrentHashMultisetBenchmark.java
@@ -37,7 +37,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Benchmarks for {@link ConcurrentHashMultiset}.
@@ -192,7 +192,7 @@
      * @return the nonnegative number of occurrences of the element
      */
     @Override
-    public int count(@NullableDecl Object element) {
+    public int count(@CheckForNull Object element) {
       try {
         return unbox(countMap.get(element));
       } catch (NullPointerException | ClassCastException e) {
@@ -295,7 +295,7 @@
      * @throws IllegalArgumentException if {@code occurrences} is negative
      */
     @Override
-    public int remove(@NullableDecl Object element, int occurrences) {
+    public int remove(@CheckForNull Object element, int occurrences) {
       if (occurrences == 0) {
         return count(element);
       }
@@ -330,7 +330,7 @@
      * @param element the element whose occurrences should all be removed
      * @return the number of occurrences successfully removed, possibly zero
      */
-    private int removeAllOccurrences(@NullableDecl Object element) {
+    private int removeAllOccurrences(@CheckForNull Object element) {
       try {
         return unbox(countMap.remove(element));
       } catch (NullPointerException | ClassCastException e) {
@@ -349,7 +349,7 @@
      * @param occurrences the number of occurrences of {@code element} to remove
      * @return {@code true} if the removal was possible (including if {@code occurrences} is zero)
      */
-    public boolean removeExactly(@NullableDecl Object element, int occurrences) {
+    public boolean removeExactly(@CheckForNull Object element, int occurrences) {
       if (occurrences == 0) {
         return true;
       }
@@ -543,7 +543,7 @@
     }
 
     /** We use a special form of unboxing that treats null as zero. */
-    private static int unbox(@NullableDecl Integer i) {
+    private static int unbox(@CheckForNull Integer i) {
       return (i == null) ? 0 : i;
     }
   }
diff --git a/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java b/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
index f10b94e..cd8e24b 100644
--- a/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
@@ -139,7 +139,7 @@
         for (Element element : keys) {
           builder.put(element, element);
         }
-        return builder.build();
+        return builder.buildOrThrow();
       }
     },
     ImmutableSorted {
diff --git a/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java b/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
index c9df774..22053c8 100644
--- a/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
@@ -38,7 +38,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /** Benchmarks for {@link ExecutionList}. */
 @VmOptions({"-Xms8g", "-Xmx8g"})
@@ -488,7 +488,7 @@
     private static final class RunnableExecutorPair {
       final Runnable runnable;
       final Executor executor;
-      @NullableDecl RunnableExecutorPair next;
+      @CheckForNull RunnableExecutorPair next;
 
       RunnableExecutorPair(Runnable runnable, Executor executor, RunnableExecutorPair next) {
         this.runnable = runnable;
@@ -563,7 +563,7 @@
     private static final class RunnableExecutorPair {
       Runnable runnable;
       Executor executor;
-      @NullableDecl RunnableExecutorPair next;
+      @CheckForNull RunnableExecutorPair next;
 
       RunnableExecutorPair(Runnable runnable, Executor executor) {
         this.runnable = runnable;
@@ -669,7 +669,7 @@
       final Runnable runnable;
       final Executor executor;
       // Volatile because this is written on one thread and read on another with no synchronization.
-      @NullableDecl volatile RunnableExecutorPair next;
+      @CheckForNull volatile RunnableExecutorPair next;
 
       RunnableExecutorPair(Runnable runnable, Executor executor) {
         this.runnable = runnable;
diff --git a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
index 61f735d..2233fb4 100644
--- a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
+++ b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
@@ -25,7 +25,7 @@
 import java.util.NoSuchElementException;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A bounded {@linkplain BlockingQueue blocking queue} backed by an array. This queue orders
@@ -388,7 +388,7 @@
    * @return {@code true} if this queue changed as a result of the call
    */
   @Override
-  public boolean remove(@NullableDecl Object o) {
+  public boolean remove(@CheckForNull Object o) {
     if (o == null) return false;
     final E[] items = this.items;
     final Monitor monitor = this.monitor;
@@ -418,7 +418,7 @@
    * @return {@code true} if this queue contains the specified element
    */
   @Override
-  public boolean contains(@NullableDecl Object o) {
+  public boolean contains(@CheckForNull Object o) {
     if (o == null) return false;
     final E[] items = this.items;
     final Monitor monitor = this.monitor;
diff --git a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
index 086253d..f61885b 100644
--- a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
+++ b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
@@ -30,7 +30,7 @@
 import java.util.SortedSet;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An unbounded {@linkplain BlockingQueue blocking queue} that uses the same ordering rules as class
@@ -124,7 +124,7 @@
    * @throws IllegalArgumentException if {@code initialCapacity} is less than 1
    */
   public MonitorBasedPriorityBlockingQueue(
-      int initialCapacity, @NullableDecl Comparator<? super E> comparator) {
+      int initialCapacity, @CheckForNull Comparator<? super E> comparator) {
     q = new PriorityQueue<E>(initialCapacity, comparator);
   }
 
@@ -303,7 +303,7 @@
    * @return {@code true} if this queue changed as a result of the call
    */
   @Override
-  public boolean remove(@NullableDecl Object o) {
+  public boolean remove(@CheckForNull Object o) {
     final Monitor monitor = this.monitor;
     monitor.enter();
     try {
@@ -322,7 +322,7 @@
    * @return {@code true} if this queue contains the specified element
    */
   @Override
-  public boolean contains(@NullableDecl Object o) {
+  public boolean contains(@CheckForNull Object o) {
     final Monitor monitor = this.monitor;
     monitor.enter();
     try {
diff --git a/android/guava-tests/pom.xml b/android/guava-tests/pom.xml
index 7f57d87..13a8d8d 100644
--- a/android/guava-tests/pom.xml
+++ b/android/guava-tests/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>31.0.1-android</version>
+    <version>31.1-android</version>
   </parent>
   <artifactId>guava-tests</artifactId>
   <name>Guava Unit Tests</name>
@@ -26,10 +26,6 @@
       <artifactId>jsr305</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.checkerframework</groupId>
-      <artifactId>checker-compat-qual</artifactId>
-    </dependency>
-    <dependency>
       <groupId>com.google.errorprone</groupId>
       <artifactId>error_prone_annotations</artifactId>
     </dependency>
diff --git a/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java b/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
index da732bf..ddb7d70 100644
--- a/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
+++ b/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
@@ -205,7 +205,7 @@
   // hasNext/next), but we'll cop out for now, knowing that
   // next() both start by invoking hasNext() anyway.
 
-  /** Throws a undeclared checked exception. */
+  /** Throws an undeclared checked exception. */
   private static void sneakyThrow(Throwable t) {
     class SneakyThrower<T extends Throwable> {
       @SuppressWarnings("unchecked") // intentionally unsafe for test
diff --git a/android/guava-tests/test/com/google/common/base/AsciiTest.java b/android/guava-tests/test/com/google/common/base/AsciiTest.java
index d3a1f8f..9e6b0e4 100644
--- a/android/guava-tests/test/com/google/common/base/AsciiTest.java
+++ b/android/guava-tests/test/com/google/common/base/AsciiTest.java
@@ -54,8 +54,8 @@
   public void testCharsIgnored() {
     for (char c : IGNORED.toCharArray()) {
       String str = String.valueOf(c);
-      assertTrue(str, c == Ascii.toLowerCase(c));
-      assertTrue(str, c == Ascii.toUpperCase(c));
+      assertEquals(str, c, Ascii.toLowerCase(c));
+      assertEquals(str, c, Ascii.toUpperCase(c));
       assertFalse(str, Ascii.isLowerCase(c));
       assertFalse(str, Ascii.isUpperCase(c));
     }
@@ -98,27 +98,26 @@
   }
 
   public void testTruncateIllegalArguments() {
-    String truncated = null;
     try {
-      truncated = Ascii.truncate("foobar", 2, "...");
+      Ascii.truncate("foobar", 2, "...");
       fail();
     } catch (IllegalArgumentException expected) {
     }
 
     try {
-      truncated = Ascii.truncate("foobar", 8, "1234567890");
+      Ascii.truncate("foobar", 8, "1234567890");
       fail();
     } catch (IllegalArgumentException expected) {
     }
 
     try {
-      truncated = Ascii.truncate("foobar", -1, "...");
+      Ascii.truncate("foobar", -1, "...");
       fail();
     } catch (IllegalArgumentException expected) {
     }
 
     try {
-      truncated = Ascii.truncate("foobar", -1, "");
+      Ascii.truncate("foobar", -1, "");
       fail();
     } catch (IllegalArgumentException expected) {
     }
diff --git a/android/guava-tests/test/com/google/common/base/CharMatcherTest.java b/android/guava-tests/test/com/google/common/base/CharMatcherTest.java
index 5412882..49bdbba 100644
--- a/android/guava-tests/test/com/google/common/base/CharMatcherTest.java
+++ b/android/guava-tests/test/com/google/common/base/CharMatcherTest.java
@@ -386,7 +386,7 @@
     assertSame(s, matcher.replaceFrom(s, 'z'));
     assertSame(s, matcher.replaceFrom(s, "ZZ"));
     assertSame(s, matcher.trimFrom(s));
-    assertSame(0, matcher.countIn(s));
+    assertEquals(0, matcher.countIn(s));
   }
 
   private void reallyTestMatchThenNoMatch(CharMatcher matcher, String s) {
diff --git a/android/guava-tests/test/com/google/common/cache/CacheBuilderFactory.java b/android/guava-tests/test/com/google/common/cache/CacheBuilderFactory.java
index 04b6f1e..948b4b5 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheBuilderFactory.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheBuilderFactory.java
@@ -26,7 +26,7 @@
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Helper class for creating {@link CacheBuilder} instances with all combinations of several sets of
@@ -120,7 +120,7 @@
   private static final Function<Object, Optional<?>> NULLABLE_TO_OPTIONAL =
       new Function<Object, Optional<?>>() {
         @Override
-        public Optional<?> apply(@NullableDecl Object obj) {
+        public Optional<?> apply(@CheckForNull Object obj) {
           return Optional.fromNullable(obj);
         }
       };
diff --git a/android/guava-tests/test/com/google/common/cache/CacheTesting.java b/android/guava-tests/test/com/google/common/cache/CacheTesting.java
index 255a894..4c58ed5 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheTesting.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheTesting.java
@@ -44,7 +44,7 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReferenceArray;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A collection of utilities for {@link Cache} testing.
@@ -367,7 +367,7 @@
   }
 
   interface Receiver<T> {
-    void accept(@NullableDecl T object);
+    void accept(@CheckForNull T object);
   }
 
   /**
diff --git a/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java b/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
index 3c4529c..b8ec7df 100644
--- a/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
@@ -232,7 +232,7 @@
 
   private Throwable popLoggedThrowable() {
     List<LogRecord> logRecords = logHandler.getStoredLogRecords();
-    assertSame(1, logRecords.size());
+    assertEquals(1, logRecords.size());
     LogRecord logRecord = logRecords.get(0);
     logHandler.clear();
     return logRecord.getThrown();
diff --git a/android/guava-tests/test/com/google/common/cache/TestingCacheLoaders.java b/android/guava-tests/test/com/google/common/cache/TestingCacheLoaders.java
index 8507e68..6cc0260 100644
--- a/android/guava-tests/test/com/google/common/cache/TestingCacheLoaders.java
+++ b/android/guava-tests/test/com/google/common/cache/TestingCacheLoaders.java
@@ -23,7 +23,7 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Utility {@link CacheLoader} implementations intended for use in testing.
@@ -57,7 +57,7 @@
   }
 
   /** Returns a {@link CacheLoader} that returns the given {@code constant} for every request. */
-  static <K, V> ConstantLoader<K, V> constantLoader(@NullableDecl V constant) {
+  static <K, V> ConstantLoader<K, V> constantLoader(@CheckForNull V constant) {
     return new ConstantLoader<>(constant);
   }
 
diff --git a/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java b/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
index 3592210..a76907c 100644
--- a/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
+++ b/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
@@ -250,6 +250,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testCantRemove() {
     Iterator<Integer> iter =
         new AbstractIterator<Integer>() {
diff --git a/android/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java b/android/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java
index 11c66a7..63c17de 100644
--- a/android/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java
+++ b/android/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java
@@ -61,7 +61,8 @@
 
   public void testEquals() {
     Entry<String, Integer> foo1 = entry("foo", 1);
-    assertEquals(foo1, foo1);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(foo1.equals(foo1));
     assertEquals(control("foo", 1), foo1);
     assertEquals(control("bar", 2), entry("bar", 2));
     assertFalse(control("foo", 1).equals(entry("foo", 2)));
diff --git a/android/guava-tests/test/com/google/common/collect/FluentIterableTest.java b/android/guava-tests/test/com/google/common/collect/FluentIterableTest.java
index e623f31..b8427b1 100644
--- a/android/guava-tests/test/com/google/common/collect/FluentIterableTest.java
+++ b/android/guava-tests/test/com/google/common/collect/FluentIterableTest.java
@@ -38,9 +38,9 @@
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit test for {@link FluentIterable}.
@@ -850,7 +850,7 @@
               .uniqueIndex(
                   new Function<Integer, Object>() {
                     @Override
-                    public Object apply(@NullableDecl Integer input) {
+                    public Object apply(@CheckForNull Integer input) {
                       return String.valueOf(input);
                     }
                   });
diff --git a/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java b/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
index cc5d739..cf2ed0d 100644
--- a/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
@@ -170,7 +170,7 @@
                     for (Entry<String, String> entry : entries) {
                       builder.put(entry.getKey(), entry.getValue());
                     }
-                    return new StandardImplForwardingMap<>(builder.build());
+                    return new StandardImplForwardingMap<>(builder.buildOrThrow());
                   }
                 })
             .named("ForwardingMap[ImmutableMap] with standard implementations")
diff --git a/android/guava-tests/test/com/google/common/collect/ForwardingSortedMultisetTest.java b/android/guava-tests/test/com/google/common/collect/ForwardingSortedMultisetTest.java
index d0673f1..2b77cd5 100644
--- a/android/guava-tests/test/com/google/common/collect/ForwardingSortedMultisetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ForwardingSortedMultisetTest.java
@@ -27,10 +27,10 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.NavigableSet;
+import javax.annotation.CheckForNull;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tests for {@link ForwardingSortedMultiset}.
@@ -93,12 +93,12 @@
     }
 
     @Override
-    public int count(@NullableDecl Object element) {
+    public int count(@CheckForNull Object element) {
       return standardCount(element);
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return standardEquals(object);
     }
 
@@ -123,7 +123,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return standardContains(object);
     }
 
@@ -143,7 +143,7 @@
     }
 
     @Override
-    public boolean remove(@NullableDecl Object object) {
+    public boolean remove(@CheckForNull Object object) {
       return standardRemove(object);
     }
 
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
index e0dd1ef..e01b094 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
@@ -323,6 +323,7 @@
       }
     }
 
+    @SuppressWarnings("AlwaysThrows")
     public void testPuttingTheSameKeyTwiceThrowsOnBuild() {
       Builder<String, Integer> builder =
           new Builder<String, Integer>()
@@ -556,6 +557,7 @@
       }
     }
 
+    @SuppressWarnings("AlwaysThrows")
     public void testOfWithDuplicateKey() {
       try {
         ImmutableBiMap.of("one", 1, "one", 1);
@@ -640,7 +642,7 @@
                   .put("three", 3)
                   .put("four", 4)
                   .put("five", 5)
-                  .build());
+                  .buildOrThrow());
       assertMapEquals(bimap, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
       assertMapEquals(bimap.inverse(), 1, "one", 2, "two", 3, "three", 4, "four", 5, "five");
     }
@@ -652,13 +654,14 @@
               .put("two", 2)
               .put("uno", 1)
               .put("dos", 2)
-              .build();
+              .buildOrThrow();
 
       try {
         ImmutableBiMap.copyOf(map);
         fail();
       } catch (IllegalArgumentException expected) {
-        assertThat(expected.getMessage()).contains("1");
+        assertThat(expected.getMessage()).containsMatch("1|2");
+        // We don't specify which of the two dups should be reported.
       }
     }
 
@@ -689,6 +692,7 @@
 
   public static class BiMapSpecificTests extends TestCase {
 
+    @SuppressWarnings("DoNotCall")
     public void testForcePut() {
       BiMap<String, Integer> bimap = ImmutableBiMap.copyOf(ImmutableMap.of("one", 1, "two", 2));
       try {
@@ -748,11 +752,11 @@
   }
 
   private static <K, V> void assertMapEquals(Map<K, V> map, Object... alternatingKeysAndValues) {
-    int i = 0;
-    for (Entry<K, V> entry : map.entrySet()) {
-      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
-      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+    Map<Object, Object> expected = new LinkedHashMap<>();
+    for (int i = 0; i < alternatingKeysAndValues.length; i += 2) {
+      expected.put(alternatingKeysAndValues[i], alternatingKeysAndValues[i + 1]);
     }
+    assertThat(map).containsExactlyEntriesIn(expected).inOrder();
   }
 
   /** No-op test so that the class has at least one method, making Maven's test runner happy. */
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
index f4da971..898d2a4 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
@@ -57,6 +57,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -68,6 +70,7 @@
  * @author Jesse Wilson
  */
 @GwtCompatible(emulated = true)
+@SuppressWarnings("AlwaysThrows")
 public class ImmutableMapTest extends TestCase {
 
   @GwtIncompatible // suite
@@ -178,7 +181,7 @@
       throw new UnsupportedOperationException();
     }
 
-    private static final Joiner joiner = Joiner.on(", ");
+    private static final Joiner JOINER = Joiner.on(", ");
 
     @Override
     protected void assertMoreInvariants(Map<K, V> map) {
@@ -187,10 +190,10 @@
         assertEquals(entry.getKey() + "=" + entry.getValue(), entry.toString());
       }
 
-      assertEquals("{" + joiner.join(map.entrySet()) + "}", map.toString());
-      assertEquals("[" + joiner.join(map.entrySet()) + "]", map.entrySet().toString());
-      assertEquals("[" + joiner.join(map.keySet()) + "]", map.keySet().toString());
-      assertEquals("[" + joiner.join(map.values()) + "]", map.values().toString());
+      assertEquals("{" + JOINER.join(map.entrySet()) + "}", map.toString());
+      assertEquals("[" + JOINER.join(map.entrySet()) + "]", map.entrySet().toString());
+      assertEquals("[" + JOINER.join(map.keySet()) + "]", map.keySet().toString());
+      assertEquals("[" + JOINER.join(map.values()) + "]", map.values().toString());
 
       assertEquals(MinimalSet.from(map.entrySet()), map.entrySet());
       assertEquals(Sets.newHashSet(map.keySet()), map.keySet());
@@ -318,12 +321,13 @@
 
   public static class CreationTests extends TestCase {
     public void testEmptyBuilder() {
-      ImmutableMap<String, Integer> map = new Builder<String, Integer>().build();
+      ImmutableMap<String, Integer> map = new Builder<String, Integer>().buildOrThrow();
       assertEquals(Collections.<String, Integer>emptyMap(), map);
     }
 
     public void testSingletonBuilder() {
-      ImmutableMap<String, Integer> map = new Builder<String, Integer>().put("one", 1).build();
+      ImmutableMap<String, Integer> map =
+          new Builder<String, Integer>().put("one", 1).buildOrThrow();
       assertMapEquals(map, "one", 1);
     }
 
@@ -335,7 +339,7 @@
               .put("three", 3)
               .put("four", 4)
               .put("five", 5)
-              .build();
+              .buildOrThrow();
       assertMapEquals(map, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
     }
 
@@ -348,7 +352,7 @@
       }
       Object[] builderArrayAfterPuts = builder.alternatingKeysAndValues;
       RegularImmutableMap<Integer, Integer> map =
-          (RegularImmutableMap<Integer, Integer>) builder.build();
+          (RegularImmutableMap<Integer, Integer>) builder.buildOrThrow();
       Object[] mapInternalArray = map.alternatingKeysAndValues;
       assertSame(builderArray, builderArrayAfterPuts);
       assertSame(builderArray, mapInternalArray);
@@ -363,16 +367,16 @@
               .put("five", 5)
               .put("four", 4)
               .put("two", 2)
-              .build();
+              .buildOrThrow();
       assertMapEquals(map, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
     }
 
     public void testBuilder_orderEntriesByValueAfterExactSizeBuild() {
       Builder<String, Integer> builder =
           new Builder<String, Integer>(2).put("four", 4).put("one", 1);
-      ImmutableMap<String, Integer> keyOrdered = builder.build();
+      ImmutableMap<String, Integer> keyOrdered = builder.buildOrThrow();
       ImmutableMap<String, Integer> valueOrdered =
-          builder.orderEntriesByValue(Ordering.natural()).build();
+          builder.orderEntriesByValue(Ordering.natural()).buildOrThrow();
       assertMapEquals(keyOrdered, "four", 4, "one", 1);
       assertMapEquals(valueOrdered, "one", 1, "four", 4);
     }
@@ -387,9 +391,45 @@
       }
     }
 
+    @GwtIncompatible // we haven't implemented this
+    public void testBuilder_orderEntriesByValue_keepingLast() {
+      ImmutableMap.Builder<String, Integer> builder =
+          new Builder<String, Integer>()
+              .orderEntriesByValue(Ordering.natural())
+              .put("three", 3)
+              .put("one", 1)
+              .put("five", 5)
+              .put("four", 3)
+              .put("four", 5)
+              .put("four", 4) // this should win because it's last
+              .put("two", 2);
+      assertMapEquals(
+          builder.buildKeepingLast(), "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
+      try {
+        builder.buildOrThrow();
+        fail("Expected exception from duplicate keys");
+      } catch (IllegalArgumentException expected) {
+      }
+    }
+
+    @GwtIncompatible // we haven't implemented this
+    public void testBuilder_orderEntriesByValue_keepingLast_builderSizeFieldPreserved() {
+      ImmutableMap.Builder<String, Integer> builder =
+          new Builder<String, Integer>()
+              .orderEntriesByValue(Ordering.natural())
+              .put("one", 1)
+              .put("one", 1);
+      assertMapEquals(builder.buildKeepingLast(), "one", 1);
+      try {
+        builder.buildOrThrow();
+        fail("Expected exception from duplicate keys");
+      } catch (IllegalArgumentException expected) {
+      }
+    }
+
     public void testBuilder_withImmutableEntry() {
       ImmutableMap<String, Integer> map =
-          new Builder<String, Integer>().put(Maps.immutableEntry("one", 1)).build();
+          new Builder<String, Integer>().put(Maps.immutableEntry("one", 1)).buildOrThrow();
       assertMapEquals(map, "one", 1);
     }
 
@@ -430,12 +470,14 @@
 
       builder.put(entry);
       holder.string = "two";
-      assertMapEquals(builder.build(), "one", 1);
+      assertMapEquals(builder.buildOrThrow(), "one", 1);
     }
 
     public void testBuilderPutAllWithEmptyMap() {
       ImmutableMap<String, Integer> map =
-          new Builder<String, Integer>().putAll(Collections.<String, Integer>emptyMap()).build();
+          new Builder<String, Integer>()
+              .putAll(Collections.<String, Integer>emptyMap())
+              .buildOrThrow();
       assertEquals(Collections.<String, Integer>emptyMap(), map);
     }
 
@@ -449,14 +491,14 @@
       moreToPut.put("five", 5);
 
       ImmutableMap<String, Integer> map =
-          new Builder<String, Integer>().putAll(toPut).putAll(moreToPut).build();
+          new Builder<String, Integer>().putAll(toPut).putAll(moreToPut).buildOrThrow();
       assertMapEquals(map, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
     }
 
     public void testBuilderReuse() {
       Builder<String, Integer> builder = new Builder<>();
-      ImmutableMap<String, Integer> mapOne = builder.put("one", 1).put("two", 2).build();
-      ImmutableMap<String, Integer> mapTwo = builder.put("three", 3).put("four", 4).build();
+      ImmutableMap<String, Integer> mapOne = builder.put("one", 1).put("two", 2).buildOrThrow();
+      ImmutableMap<String, Integer> mapTwo = builder.put("three", 3).put("four", 4).buildOrThrow();
 
       assertMapEquals(mapOne, "one", 1, "two", 2);
       assertMapEquals(mapTwo, "one", 1, "two", 2, "three", 3, "four", 4);
@@ -470,7 +512,7 @@
       } catch (NullPointerException expected) {
       }
       builder.put("foo", 2);
-      assertMapEquals(builder.build(), "foo", 2);
+      assertMapEquals(builder.buildOrThrow(), "foo", 2);
     }
 
     public void testBuilderPutImmutableEntryWithNullKeyFailsAtomically() {
@@ -481,7 +523,7 @@
       } catch (NullPointerException expected) {
       }
       builder.put("foo", 2);
-      assertMapEquals(builder.build(), "foo", 2);
+      assertMapEquals(builder.buildOrThrow(), "foo", 2);
     }
 
     // for GWT compatibility
@@ -513,7 +555,7 @@
       } catch (NullPointerException expected) {
       }
       builder.put("foo", 2);
-      assertMapEquals(builder.build(), "foo", 2);
+      assertMapEquals(builder.buildOrThrow(), "foo", 2);
     }
 
     public void testBuilderPutNullKey() {
@@ -556,15 +598,108 @@
       Builder<String, Integer> builder =
           new Builder<String, Integer>()
               .put("one", 1)
-              .put("one", 1); // throwing on this line would be even better
+              .put("one", 1); // throwing on this line might be better but it's too late to change
 
       try {
-        builder.build();
+        builder.buildOrThrow();
         fail();
       } catch (IllegalArgumentException expected) {
       }
     }
 
+    public void testBuildKeepingLast_allowsOverwrite() {
+      Builder<Integer, String> builder =
+          new Builder<Integer, String>()
+              .put(1, "un")
+              .put(2, "deux")
+              .put(70, "soixante-dix")
+              .put(70, "septante")
+              .put(70, "seventy")
+              .put(1, "one")
+              .put(2, "two");
+      ImmutableMap<Integer, String> map = builder.buildKeepingLast();
+      assertMapEquals(map, 1, "one", 2, "two", 70, "seventy");
+    }
+
+    public void testBuildKeepingLast_smallTableSameHash() {
+      String key1 = "QED";
+      String key2 = "R&D";
+      assertThat(key1.hashCode()).isEqualTo(key2.hashCode());
+      ImmutableMap<String, Integer> map =
+          ImmutableMap.<String, Integer>builder()
+              .put(key1, 1)
+              .put(key2, 2)
+              .put(key1, 3)
+              .put(key2, 4)
+              .buildKeepingLast();
+      assertMapEquals(map, key1, 3, key2, 4);
+    }
+
+    // The java7 branch has different code depending on whether the entry indexes fit in a byte,
+    // short, or int. The small table in testBuildKeepingLast_allowsOverwrite will test the byte
+    // case. This method tests the short case.
+    public void testBuildKeepingLast_shortTable() {
+      Builder<Integer, String> builder = ImmutableMap.builder();
+      Map<Integer, String> expected = new LinkedHashMap<>();
+      for (int i = 0; i < 1000; i++) {
+        // Truncate to even key, so we have put(0, "0") then put(0, "1"). Half the entries are
+        // duplicates.
+        Integer key = i & ~1;
+        String value = String.valueOf(i);
+        builder.put(key, value);
+        expected.put(key, value);
+      }
+      ImmutableMap<Integer, String> map = builder.buildKeepingLast();
+      assertThat(map).hasSize(500);
+      assertThat(map).containsExactlyEntriesIn(expected).inOrder();
+    }
+
+    // This method tests the int case.
+    public void testBuildKeepingLast_bigTable() {
+      Builder<Integer, String> builder = ImmutableMap.builder();
+      Map<Integer, String> expected = new LinkedHashMap<>();
+      for (int i = 0; i < 200_000; i++) {
+        // Truncate to even key, so we have put(0, "0") then put(0, "1"). Half the entries are
+        // duplicates.
+        Integer key = i & ~1;
+        String value = String.valueOf(i);
+        builder.put(key, value);
+        expected.put(key, value);
+      }
+      ImmutableMap<Integer, String> map = builder.buildKeepingLast();
+      assertThat(map).hasSize(100_000);
+      assertThat(map).containsExactlyEntriesIn(expected).inOrder();
+    }
+
+    @GwtIncompatible // Pattern, Matcher
+    public void testBuilder_keepingLast_thenOrThrow() {
+      ImmutableMap.Builder<String, Integer> builder =
+          new Builder<String, Integer>()
+              .put("three", 3)
+              .put("one", 1)
+              .put("five", 5)
+              .put("four", 3)
+              .put("four", 5)
+              .put("four", 4) // this should win because it's last
+              .put("two", 2);
+      assertMapEquals(
+          builder.buildKeepingLast(), "three", 3, "one", 1, "five", 5, "four", 4, "two", 2);
+      try {
+        builder.buildOrThrow();
+        fail("Expected exception from duplicate keys");
+      } catch (IllegalArgumentException expected) {
+        // We don't really care which values the exception message contains, but they should be
+        // different from each other. If buildKeepingLast() collapsed duplicates, that might end up
+        // not being true.
+        Pattern pattern =
+            Pattern.compile("Multiple entries with same key: four=(.*) and four=(.*)");
+        assertThat(expected).hasMessageThat().matches(pattern);
+        Matcher matcher = pattern.matcher(expected.getMessage());
+        assertThat(matcher.matches()).isTrue();
+        assertThat(matcher.group(1)).isNotEqualTo(matcher.group(2));
+      }
+    }
+
     public void testOf() {
       assertMapEquals(ImmutableMap.of("one", 1), "one", 1);
       assertMapEquals(ImmutableMap.of("one", 1, "two", 2), "one", 1, "two", 2);
@@ -877,12 +1012,11 @@
   }
 
   private static <K, V> void assertMapEquals(Map<K, V> map, Object... alternatingKeysAndValues) {
-    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
-    int i = 0;
-    for (Entry<K, V> entry : map.entrySet()) {
-      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
-      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+    Map<Object, Object> expected = new LinkedHashMap<>();
+    for (int i = 0; i < alternatingKeysAndValues.length; i += 2) {
+      expected.put(alternatingKeysAndValues[i], alternatingKeysAndValues[i + 1]);
     }
+    assertThat(map).containsExactlyEntriesIn(expected).inOrder();
   }
 
   private static class IntHolder implements Serializable {
@@ -982,50 +1116,53 @@
   public void testEquals() {
     new EqualsTester()
         .addEqualityGroup(
-            ImmutableMap.of(), ImmutableMap.builder().build(), ImmutableMap.ofEntries(), map())
+            ImmutableMap.of(),
+            ImmutableMap.builder().buildOrThrow(),
+            ImmutableMap.ofEntries(),
+            map())
         .addEqualityGroup(
             ImmutableMap.of(1, 1),
-            ImmutableMap.builder().put(1, 1).build(),
+            ImmutableMap.builder().put(1, 1).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1)),
             map(1, 1))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2),
-            ImmutableMap.builder().put(1, 1).put(2, 2).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2)),
             map(1, 1, 2, 2))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 3),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3)),
             map(1, 1, 2, 2, 3, 3))
         .addEqualityGroup(
             ImmutableMap.of(1, 4, 2, 2, 3, 3),
-            ImmutableMap.builder().put(1, 4).put(2, 2).put(3, 3).build(),
+            ImmutableMap.builder().put(1, 4).put(2, 2).put(3, 3).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 4), entry(2, 2), entry(3, 3)),
             map(1, 4, 2, 2, 3, 3))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 4, 3, 3),
-            ImmutableMap.builder().put(1, 1).put(2, 4).put(3, 3).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 4).put(3, 3).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 4), entry(3, 3)),
             map(1, 1, 2, 4, 3, 3))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 4),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 4).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 4).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 4)),
             map(1, 1, 2, 2, 3, 4))
         .addEqualityGroup(
             ImmutableMap.of(1, 2, 2, 3, 3, 1),
-            ImmutableMap.builder().put(1, 2).put(2, 3).put(3, 1).build(),
+            ImmutableMap.builder().put(1, 2).put(2, 3).put(3, 1).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 2), entry(2, 3), entry(3, 1)),
             map(1, 2, 2, 3, 3, 1))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4)),
             map(1, 1, 2, 2, 3, 3, 4, 4))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).put(5, 5).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).put(5, 5).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4), entry(5, 5)),
             map(1, 1, 2, 2, 3, 3, 4, 4, 5, 5))
         .testEquals();
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
index 5ca1f58..4c2bf3f 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
@@ -312,6 +312,7 @@
     assertEquals(expectedComplement, rangeSet.complement());
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testAddUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
@@ -327,6 +328,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testAddAllUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
@@ -342,6 +344,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testRemoveUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
@@ -357,6 +360,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testRemoveAllUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
index 850a8e7..4a9178b 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
@@ -56,6 +56,7 @@
  * @author Jared Levy
  */
 @GwtCompatible(emulated = true)
+@SuppressWarnings("AlwaysThrows")
 public class ImmutableSortedMapTest extends TestCase {
   // TODO: Avoid duplicating code in ImmutableMapTest
 
@@ -875,12 +876,11 @@
   }
 
   private static <K, V> void assertMapEquals(Map<K, V> map, Object... alternatingKeysAndValues) {
-    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
-    int i = 0;
-    for (Entry<K, V> entry : map.entrySet()) {
-      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
-      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+    Map<Object, Object> expected = new LinkedHashMap<>();
+    for (int i = 0; i < alternatingKeysAndValues.length; i += 2) {
+      expected.put(alternatingKeysAndValues[i], alternatingKeysAndValues[i + 1]);
     }
+    assertThat(map).containsExactlyEntriesIn(expected).inOrder();
   }
 
   private static class IntHolder implements Serializable {
diff --git a/android/guava-tests/test/com/google/common/collect/IteratorsTest.java b/android/guava-tests/test/com/google/common/collect/IteratorsTest.java
index 15f7ccc..e71c8bd 100644
--- a/android/guava-tests/test/com/google/common/collect/IteratorsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/IteratorsTest.java
@@ -74,6 +74,7 @@
     return suite;
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testEmptyIterator() {
     Iterator<String> iterator = Iterators.emptyIterator();
     assertFalse(iterator.hasNext());
@@ -89,6 +90,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testEmptyListIterator() {
     ListIterator<String> iterator = Iterators.emptyListIterator();
     assertFalse(iterator.hasNext());
@@ -1119,6 +1121,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testForArrayTypical() {
     String[] array = {"foo", "bar"};
     Iterator<String> iterator = Iterators.forArray(array);
@@ -1205,6 +1208,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testForEnumerationSingleton() {
     Enumeration<Integer> enumer = enumerate(1);
     Iterator<Integer> iter = Iterators.forEnumeration(enumer);
diff --git a/android/guava-tests/test/com/google/common/collect/ListsTest.java b/android/guava-tests/test/com/google/common/collect/ListsTest.java
index ef90e54..33736d6 100644
--- a/android/guava-tests/test/com/google/common/collect/ListsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ListsTest.java
@@ -619,14 +619,14 @@
 
   public void testCartesianProduct_indexOf() {
     List<List<Integer>> actual = Lists.cartesianProduct(list(1, 2), list(3, 4));
-    assertEquals(actual.indexOf(list(1, 3)), 0);
-    assertEquals(actual.indexOf(list(1, 4)), 1);
-    assertEquals(actual.indexOf(list(2, 3)), 2);
-    assertEquals(actual.indexOf(list(2, 4)), 3);
-    assertEquals(actual.indexOf(list(3, 1)), -1);
+    assertEquals(0, actual.indexOf(list(1, 3)));
+    assertEquals(1, actual.indexOf(list(1, 4)));
+    assertEquals(2, actual.indexOf(list(2, 3)));
+    assertEquals(3, actual.indexOf(list(2, 4)));
+    assertEquals(-1, actual.indexOf(list(3, 1)));
 
-    assertEquals(actual.indexOf(list(1)), -1);
-    assertEquals(actual.indexOf(list(1, 1, 1)), -1);
+    assertEquals(-1, actual.indexOf(list(1)));
+    assertEquals(-1, actual.indexOf(list(1, 1, 1)));
   }
 
   public void testCartesianProduct_lastIndexOf() {
diff --git a/android/guava-tests/test/com/google/common/collect/MapMakerTest.java b/android/guava-tests/test/com/google/common/collect/MapMakerTest.java
index 4b54f0d..9669ded 100644
--- a/android/guava-tests/test/com/google/common/collect/MapMakerTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MapMakerTest.java
@@ -57,31 +57,28 @@
    * anywhere else
    */
 
-  /** Tests for the builder. */
-  public static class MakerTest extends TestCase {
-    public void testInitialCapacity_negative() {
-      MapMaker maker = new MapMaker();
-      try {
-        maker.initialCapacity(-1);
-        fail();
-      } catch (IllegalArgumentException expected) {
-      }
+  public void testInitialCapacity_negative() {
+    MapMaker maker = new MapMaker();
+    try {
+      maker.initialCapacity(-1);
+      fail();
+    } catch (IllegalArgumentException expected) {
     }
+  }
 
-    // TODO(cpovirk): enable when ready
-    public void xtestInitialCapacity_setTwice() {
-      MapMaker maker = new MapMaker().initialCapacity(16);
-      try {
-        // even to the same value is not allowed
-        maker.initialCapacity(16);
-        fail();
-      } catch (IllegalArgumentException expected) {
-      }
+  // TODO(cpovirk): enable when ready (apparently after a change to our GWT emulation)
+  public void xtestInitialCapacity_setTwice() {
+    MapMaker maker = new MapMaker().initialCapacity(16);
+    try {
+      // even to the same value is not allowed
+      maker.initialCapacity(16);
+      fail();
+    } catch (IllegalStateException expected) {
     }
+  }
 
-    public void testReturnsPlainConcurrentHashMapWhenPossible() {
-      Map<?, ?> map = new MapMaker().initialCapacity(5).makeMap();
-      assertTrue(map instanceof ConcurrentHashMap);
-    }
+  public void testReturnsPlainConcurrentHashMapWhenPossible() {
+    Map<?, ?> map = new MapMaker().initialCapacity(5).makeMap();
+    assertTrue(map instanceof ConcurrentHashMap);
   }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/MapsCollectionTest.java b/android/guava-tests/test/com/google/common/collect/MapsCollectionTest.java
index 54aa1aa..9aa8e66 100644
--- a/android/guava-tests/test/com/google/common/collect/MapsCollectionTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MapsCollectionTest.java
@@ -49,10 +49,10 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Test suites for wrappers in {@code Maps}.
@@ -561,7 +561,7 @@
   static final Predicate<String> FILTER_KEYS =
       new Predicate<String>() {
         @Override
-        public boolean apply(@NullableDecl String string) {
+        public boolean apply(@CheckForNull String string) {
           return !"banana".equals(string) && !"eggplant".equals(string);
         }
       };
@@ -569,7 +569,7 @@
   static final Predicate<String> FILTER_VALUES =
       new Predicate<String>() {
         @Override
-        public boolean apply(@NullableDecl String string) {
+        public boolean apply(@CheckForNull String string) {
           return !"toast".equals(string) && !"spam".equals(string);
         }
       };
diff --git a/android/guava-tests/test/com/google/common/collect/MapsTest.java b/android/guava-tests/test/com/google/common/collect/MapsTest.java
index 76394c8..d0f9838 100644
--- a/android/guava-tests/test/com/google/common/collect/MapsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MapsTest.java
@@ -1153,8 +1153,8 @@
     biMap.put("two", 2);
     Converter<String, Integer> converter = Maps.asConverter(biMap);
 
-    assertSame(1, converter.convert("one"));
-    assertSame(2, converter.convert("two"));
+    assertEquals((Integer) 1, converter.convert("one"));
+    assertEquals((Integer) 2, converter.convert("two"));
     try {
       converter.convert("three");
       fail();
@@ -1163,9 +1163,9 @@
 
     biMap.put("three", 3);
 
-    assertSame(1, converter.convert("one"));
-    assertSame(2, converter.convert("two"));
-    assertSame(3, converter.convert("three"));
+    assertEquals((Integer) 1, converter.convert("one"));
+    assertEquals((Integer) 2, converter.convert("two"));
+    assertEquals((Integer) 3, converter.convert("three"));
   }
 
   public void testAsConverter_withNullMapping() throws Exception {
diff --git a/android/guava-tests/test/com/google/common/collect/MapsTransformValuesTest.java b/android/guava-tests/test/com/google/common/collect/MapsTransformValuesTest.java
index d81f546..b4382db 100644
--- a/android/guava-tests/test/com/google/common/collect/MapsTransformValuesTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MapsTransformValuesTest.java
@@ -25,7 +25,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Tests for {@link Maps#transformValues}.
@@ -156,7 +156,7 @@
             underlying,
             new Function<String, Boolean>() {
               @Override
-              public Boolean apply(@NullableDecl String from) {
+              public Boolean apply(@CheckForNull String from) {
                 return from == null;
               }
             });
@@ -274,7 +274,7 @@
             underlying,
             new Function<Boolean, Boolean>() {
               @Override
-              public Boolean apply(@NullableDecl Boolean from) {
+              public Boolean apply(@CheckForNull Boolean from) {
                 return (from == null) ? true : null;
               }
             });
diff --git a/android/guava-tests/test/com/google/common/collect/MapsTransformValuesUnmodifiableIteratorTest.java b/android/guava-tests/test/com/google/common/collect/MapsTransformValuesUnmodifiableIteratorTest.java
index 81a2d93..1073951 100644
--- a/android/guava-tests/test/com/google/common/collect/MapsTransformValuesUnmodifiableIteratorTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MapsTransformValuesUnmodifiableIteratorTest.java
@@ -25,7 +25,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Tests for {@link Maps#transformValues} when the backing map's views have iterators that don't
@@ -232,7 +232,7 @@
             underlying,
             new Function<String, Boolean>() {
               @Override
-              public Boolean apply(@NullableDecl String from) {
+              public Boolean apply(@CheckForNull String from) {
                 return from == null;
               }
             });
@@ -350,7 +350,7 @@
             underlying,
             new Function<Boolean, Boolean>() {
               @Override
-              public Boolean apply(@NullableDecl Boolean from) {
+              public Boolean apply(@CheckForNull Boolean from) {
                 return (from == null) ? true : null;
               }
             });
diff --git a/android/guava-tests/test/com/google/common/collect/MultimapsTest.java b/android/guava-tests/test/com/google/common/collect/MultimapsTest.java
index 1a8f84e..02ea574 100644
--- a/android/guava-tests/test/com/google/common/collect/MultimapsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MultimapsTest.java
@@ -55,8 +55,8 @@
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit test for {@code Multimaps}.
@@ -267,8 +267,8 @@
   private static void checkUnmodifiableMultimap(
       Multimap<String, Integer> multimap,
       boolean permitsDuplicates,
-      @NullableDecl String nullKey,
-      @NullableDecl Integer nullValue) {
+      @CheckForNull String nullKey,
+      @CheckForNull Integer nullValue) {
     Multimap<String, Integer> unmodifiable =
         prepareUnmodifiableTests(multimap, permitsDuplicates, nullKey, nullValue);
 
@@ -297,8 +297,8 @@
   private static Multimap<String, Integer> prepareUnmodifiableTests(
       Multimap<String, Integer> multimap,
       boolean permitsDuplicates,
-      @NullableDecl String nullKey,
-      @NullableDecl Integer nullValue) {
+      @CheckForNull String nullKey,
+      @CheckForNull Integer nullValue) {
     multimap.clear();
     multimap.put("foo", 1);
     multimap.put("foo", 2);
@@ -610,7 +610,8 @@
     assertEquals("[3, 1, 4]", ummodifiable.get(Color.BLUE).toString());
 
     Collection<Integer> collection = multimap.get(Color.BLUE);
-    assertEquals(collection, collection);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(collection.equals(collection));
 
     assertFalse(multimap.keySet() instanceof SortedSet);
     assertFalse(multimap.asMap() instanceof SortedMap);
diff --git a/android/guava-tests/test/com/google/common/collect/OrderingTest.java b/android/guava-tests/test/com/google/common/collect/OrderingTest.java
index b449a29..7c4acc9 100644
--- a/android/guava-tests/test/com/google/common/collect/OrderingTest.java
+++ b/android/guava-tests/test/com/google/common/collect/OrderingTest.java
@@ -40,8 +40,8 @@
 import java.util.List;
 import java.util.Random;
 import java.util.RandomAccess;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit tests for {@code Ordering}.
@@ -1030,7 +1030,7 @@
             scenario.ordering.onResultOf(
                 new Function<Integer, T>() {
                   @Override
-                  public T apply(@NullableDecl Integer from) {
+                  public T apply(@CheckForNull Integer from) {
                     return scenario.strictlyOrderedList.get(from);
                   }
                 });
diff --git a/android/guava-tests/test/com/google/common/collect/RangeTest.java b/android/guava-tests/test/com/google/common/collect/RangeTest.java
index 9a2cd74..e8578bf 100644
--- a/android/guava-tests/test/com/google/common/collect/RangeTest.java
+++ b/android/guava-tests/test/com/google/common/collect/RangeTest.java
@@ -20,6 +20,7 @@
 import static com.google.common.collect.BoundType.OPEN;
 import static com.google.common.collect.DiscreteDomain.integers;
 import static com.google.common.testing.SerializableTester.reserializeAndAssert;
+import static com.google.common.truth.Truth.assertThat;
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
@@ -349,11 +350,14 @@
       range.intersection(Range.open(3, 5));
       fail();
     } catch (IllegalArgumentException expected) {
+      // TODO(kevinb): convert the rest of this file to Truth someday
+      assertThat(expected).hasMessageThat().contains("connected");
     }
     try {
       range.intersection(Range.closed(0, 2));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
   }
 
@@ -368,11 +372,13 @@
       range.intersection(Range.lessThan(3));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
     try {
       range.intersection(Range.greaterThan(4));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
 
     range = Range.closed(3, 4);
@@ -395,11 +401,13 @@
       range.intersection(Range.atLeast(4));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
     try {
       range.intersection(Range.atMost(2));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
   }
 
@@ -411,6 +419,7 @@
       range.intersection(Range.closed(0, 2));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
 
     // adjacent below
@@ -451,6 +460,7 @@
       range.intersection(Range.closed(10, 12));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
   }
 
diff --git a/android/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java b/android/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java
index b6c2358..b0f9e16 100644
--- a/android/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java
+++ b/android/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java
@@ -30,7 +30,8 @@
    */
   public void testDoesntCheckForNull() {
     ImmutableSet<Integer> set = ImmutableSet.of(1, 2, 3);
-    new RegularImmutableAsList<Integer>(set, new Object[] {null, null, null});
+    ImmutableList<Integer> unused =
+        new RegularImmutableAsList<Integer>(set, new Object[] {null, null, null});
     // shouldn't throw!
   }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/SetOperationsTest.java b/android/guava-tests/test/com/google/common/collect/SetOperationsTest.java
index 7a1ec3a..9a26f29 100644
--- a/android/guava-tests/test/com/google/common/collect/SetOperationsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SetOperationsTest.java
@@ -291,92 +291,90 @@
             .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES)
             .createTestSuite());
 
-    suite.addTestSuite(MoreTests.class);
+    suite.addTestSuite(SetOperationsTest.class);
     return suite;
   }
 
-  public static class MoreTests extends TestCase {
-    Set<String> friends;
-    Set<String> enemies;
+  Set<String> friends;
+  Set<String> enemies;
 
-    @Override
-    public void setUp() {
-      friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      enemies = Sets.newHashSet("Dick", "Harry", "Tom");
-    }
+  @Override
+  public void setUp() {
+    friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  }
 
-    public void testUnion() {
-      Set<String> all = Sets.union(friends, enemies);
-      assertEquals(5, all.size());
+  public void testUnion() {
+    Set<String> all = Sets.union(friends, enemies);
+    assertEquals(5, all.size());
 
-      ImmutableSet<String> immut = Sets.union(friends, enemies).immutableCopy();
-      HashSet<String> mut = Sets.union(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.union(friends, enemies).immutableCopy();
+    HashSet<String> mut = Sets.union(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Buck");
-      assertEquals(6, all.size());
-      assertEquals(5, immut.size());
-      assertEquals(5, mut.size());
-    }
+    enemies.add("Buck");
+    assertEquals(6, all.size());
+    assertEquals(5, immut.size());
+    assertEquals(5, mut.size());
+  }
 
-    public void testIntersection() {
-      Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  public void testIntersection() {
+    Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
 
-      Set<String> frenemies = Sets.intersection(friends, enemies);
-      assertEquals(1, frenemies.size());
+    Set<String> frenemies = Sets.intersection(friends, enemies);
+    assertEquals(1, frenemies.size());
 
-      ImmutableSet<String> immut = Sets.intersection(friends, enemies).immutableCopy();
-      HashSet<String> mut = Sets.intersection(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.intersection(friends, enemies).immutableCopy();
+    HashSet<String> mut = Sets.intersection(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Joe");
-      assertEquals(2, frenemies.size());
-      assertEquals(1, immut.size());
-      assertEquals(1, mut.size());
-    }
+    enemies.add("Joe");
+    assertEquals(2, frenemies.size());
+    assertEquals(1, immut.size());
+    assertEquals(1, mut.size());
+  }
 
-    public void testDifference() {
-      Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  public void testDifference() {
+    Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
 
-      Set<String> goodFriends = Sets.difference(friends, enemies);
-      assertEquals(2, goodFriends.size());
+    Set<String> goodFriends = Sets.difference(friends, enemies);
+    assertEquals(2, goodFriends.size());
 
-      ImmutableSet<String> immut = Sets.difference(friends, enemies).immutableCopy();
-      HashSet<String> mut = Sets.difference(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.difference(friends, enemies).immutableCopy();
+    HashSet<String> mut = Sets.difference(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Dave");
-      assertEquals(1, goodFriends.size());
-      assertEquals(2, immut.size());
-      assertEquals(2, mut.size());
-    }
+    enemies.add("Dave");
+    assertEquals(1, goodFriends.size());
+    assertEquals(2, immut.size());
+    assertEquals(2, mut.size());
+  }
 
-    public void testSymmetricDifference() {
-      Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  public void testSymmetricDifference() {
+    Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
 
-      Set<String> symmetricDifferenceFriendsFirst = Sets.symmetricDifference(friends, enemies);
-      assertEquals(4, symmetricDifferenceFriendsFirst.size());
+    Set<String> symmetricDifferenceFriendsFirst = Sets.symmetricDifference(friends, enemies);
+    assertEquals(4, symmetricDifferenceFriendsFirst.size());
 
-      Set<String> symmetricDifferenceEnemiesFirst = Sets.symmetricDifference(enemies, friends);
-      assertEquals(4, symmetricDifferenceEnemiesFirst.size());
+    Set<String> symmetricDifferenceEnemiesFirst = Sets.symmetricDifference(enemies, friends);
+    assertEquals(4, symmetricDifferenceEnemiesFirst.size());
 
-      assertEquals(symmetricDifferenceFriendsFirst, symmetricDifferenceEnemiesFirst);
+    assertEquals(symmetricDifferenceFriendsFirst, symmetricDifferenceEnemiesFirst);
 
-      ImmutableSet<String> immut = Sets.symmetricDifference(friends, enemies).immutableCopy();
-      HashSet<String> mut =
-          Sets.symmetricDifference(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.symmetricDifference(friends, enemies).immutableCopy();
+    HashSet<String> mut =
+        Sets.symmetricDifference(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Dave");
-      assertEquals(3, symmetricDifferenceFriendsFirst.size());
-      assertEquals(4, immut.size());
-      assertEquals(4, mut.size());
+    enemies.add("Dave");
+    assertEquals(3, symmetricDifferenceFriendsFirst.size());
+    assertEquals(4, immut.size());
+    assertEquals(4, mut.size());
 
-      immut = Sets.symmetricDifference(enemies, friends).immutableCopy();
-      mut = Sets.symmetricDifference(enemies, friends).copyInto(new HashSet<String>());
-      friends.add("Harry");
-      assertEquals(2, symmetricDifferenceEnemiesFirst.size());
-      assertEquals(3, immut.size());
-      assertEquals(3, mut.size());
-    }
+    immut = Sets.symmetricDifference(enemies, friends).immutableCopy();
+    mut = Sets.symmetricDifference(enemies, friends).copyInto(new HashSet<String>());
+    friends.add("Harry");
+    assertEquals(2, symmetricDifferenceEnemiesFirst.size());
+    assertEquals(3, immut.size());
+    assertEquals(3, mut.size());
   }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/SetsTest.java b/android/guava-tests/test/com/google/common/collect/SetsTest.java
index 8aa8d83..d7799ce 100644
--- a/android/guava-tests/test/com/google/common/collect/SetsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SetsTest.java
@@ -73,10 +73,10 @@
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.concurrent.CopyOnWriteArraySet;
+import javax.annotation.CheckForNull;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit test for {@code Sets}.
@@ -325,6 +325,7 @@
     D
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testImmutableEnumSet() {
     Set<SomeEnum> units = Sets.immutableEnumSet(SomeEnum.D, SomeEnum.B);
 
@@ -1076,7 +1077,7 @@
    * same as the given comparator.
    */
   private static <E> void verifySortedSetContents(
-      SortedSet<E> set, Iterable<E> iterable, @NullableDecl Comparator<E> comparator) {
+      SortedSet<E> set, Iterable<E> iterable, @CheckForNull Comparator<E> comparator) {
     assertSame(comparator, set.comparator());
     verifySetContents(set, iterable);
   }
diff --git a/android/guava-tests/test/com/google/common/collect/SimpleAbstractMultisetTest.java b/android/guava-tests/test/com/google/common/collect/SimpleAbstractMultisetTest.java
index 830536d..02ab44b 100644
--- a/android/guava-tests/test/com/google/common/collect/SimpleAbstractMultisetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SimpleAbstractMultisetTest.java
@@ -28,10 +28,10 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
+import javax.annotation.CheckForNull;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit test for {@link AbstractMultiset}.
@@ -106,7 +106,7 @@
     }
 
     @Override
-    public int count(@NullableDecl Object element) {
+    public int count(@CheckForNull Object element) {
       for (Entry<E> entry : entrySet()) {
         if (Objects.equal(entry.getElement(), element)) {
           return entry.getCount();
@@ -116,7 +116,7 @@
     }
 
     @Override
-    public int add(@NullableDecl E element, int occurrences) {
+    public int add(@CheckForNull E element, int occurrences) {
       checkArgument(occurrences >= 0);
       Integer frequency = backingMap.get(element);
       if (frequency == null) {
diff --git a/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java b/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
index b07802a..2e15eda 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
@@ -216,15 +216,15 @@
   }
 
   public void testEquals() {
-    create().equals(new HashMap<String, Integer>());
+    boolean unused = create().equals(new HashMap<String, Integer>());
   }
 
   public void testHashCode() {
-    create().hashCode();
+    int unused = create().hashCode();
   }
 
   public void testToString() {
-    create().toString();
+    String unused = create().toString();
   }
 
   public void testSerialization() {
diff --git a/android/guava-tests/test/com/google/common/collect/SynchronizedMultimapTest.java b/android/guava-tests/test/com/google/common/collect/SynchronizedMultimapTest.java
index 14111da..3c4f137 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedMultimapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedMultimapTest.java
@@ -30,10 +30,10 @@
 import java.util.Map.Entry;
 import java.util.RandomAccess;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tests for {@code Synchronized#multimap}.
@@ -89,7 +89,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       assertTrue(Thread.holdsLock(mutex));
       return super.equals(o);
     }
@@ -113,25 +113,25 @@
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       assertTrue(Thread.holdsLock(mutex));
       return super.containsKey(key);
     }
 
     @Override
-    public boolean containsValue(@NullableDecl Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       assertTrue(Thread.holdsLock(mutex));
       return super.containsValue(value);
     }
 
     @Override
-    public boolean containsEntry(@NullableDecl Object key, @NullableDecl Object value) {
+    public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
       assertTrue(Thread.holdsLock(mutex));
       return super.containsEntry(key, value);
     }
 
     @Override
-    public Set<V> get(@NullableDecl K key) {
+    public Set<V> get(@CheckForNull K key) {
       assertTrue(Thread.holdsLock(mutex));
       /* TODO: verify that the Collection is also synchronized? */
       return super.get(key);
@@ -144,7 +144,7 @@
     }
 
     @Override
-    public boolean putAll(@NullableDecl K key, Iterable<? extends V> values) {
+    public boolean putAll(@CheckForNull K key, Iterable<? extends V> values) {
       assertTrue(Thread.holdsLock(mutex));
       return super.putAll(key, values);
     }
@@ -156,19 +156,19 @@
     }
 
     @Override
-    public Set<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+    public Set<V> replaceValues(@CheckForNull K key, Iterable<? extends V> values) {
       assertTrue(Thread.holdsLock(mutex));
       return super.replaceValues(key, values);
     }
 
     @Override
-    public boolean remove(@NullableDecl Object key, @NullableDecl Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       assertTrue(Thread.holdsLock(mutex));
       return super.remove(key, value);
     }
 
     @Override
-    public Set<V> removeAll(@NullableDecl Object key) {
+    public Set<V> removeAll(@CheckForNull Object key) {
       assertTrue(Thread.holdsLock(mutex));
       return super.removeAll(key);
     }
diff --git a/android/guava-tests/test/com/google/common/collect/SynchronizedSetTest.java b/android/guava-tests/test/com/google/common/collect/SynchronizedSetTest.java
index 746ad3f..5ffcf5d 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedSetTest.java
@@ -27,9 +27,9 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import junit.framework.Test;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tests for {@code Synchronized#set}.
@@ -82,7 +82,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       assertTrue(Thread.holdsLock(mutex));
       return super.equals(o);
     }
@@ -94,7 +94,7 @@
     }
 
     @Override
-    public boolean add(@NullableDecl E o) {
+    public boolean add(@CheckForNull E o) {
       assertTrue(Thread.holdsLock(mutex));
       return super.add(o);
     }
@@ -112,7 +112,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       assertTrue(Thread.holdsLock(mutex));
       return super.contains(o);
     }
@@ -132,7 +132,7 @@
     /* Don't test iterator(); it may or may not hold the mutex. */
 
     @Override
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       assertTrue(Thread.holdsLock(mutex));
       return super.remove(o);
     }
diff --git a/android/guava-tests/test/com/google/common/collect/SynchronizedTableTest.java b/android/guava-tests/test/com/google/common/collect/SynchronizedTableTest.java
index f418367..e1b4544 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedTableTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedTableTest.java
@@ -20,7 +20,7 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 public class SynchronizedTableTest extends AbstractTableTest {
   private static final class TestTable<R, C, V> implements Table<R, C, V>, Serializable {
@@ -34,7 +34,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       assertTrue(Thread.holdsLock(mutex));
       return delegate.equals(o);
     }
@@ -58,7 +58,7 @@
     }
 
     @Override
-    public boolean containsValue(@NullableDecl Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       assertTrue(Thread.holdsLock(mutex));
       return delegate.containsValue(value);
     }
diff --git a/android/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java b/android/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java
index 77ecbf7..5e474aa 100644
--- a/android/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java
+++ b/android/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java
@@ -29,6 +29,7 @@
 @GwtCompatible
 public class UnmodifiableIteratorTest extends TestCase {
 
+  @SuppressWarnings("DoNotCall")
   public void testRemove() {
     final String[] array = {"a", "b", "c"};
 
diff --git a/android/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java b/android/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java
index c9d3068..36a017d 100644
--- a/android/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java
+++ b/android/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java
@@ -29,6 +29,7 @@
  */
 @GwtCompatible
 public class UnmodifiableListIteratorTest extends TestCase {
+  @SuppressWarnings("DoNotCall")
   public void testRemove() {
     Iterator<String> iterator = create();
 
@@ -41,6 +42,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testAdd() {
     ListIterator<String> iterator = create();
 
@@ -55,6 +57,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testSet() {
     ListIterator<String> iterator = create();
 
diff --git a/android/guava-tests/test/com/google/common/escape/EscapersTest.java b/android/guava-tests/test/com/google/common/escape/EscapersTest.java
index 245560a..4422320 100644
--- a/android/guava-tests/test/com/google/common/escape/EscapersTest.java
+++ b/android/guava-tests/test/com/google/common/escape/EscapersTest.java
@@ -85,7 +85,7 @@
                 .put('x', "<hello>".toCharArray())
                 .put('\uD800', "<hi>".toCharArray())
                 .put('\uDC00', "<lo>".toCharArray())
-                .build());
+                .buildOrThrow());
     UnicodeEscaper unicodeEscaper = Escapers.asUnicodeEscaper(charEscaper);
     EscaperAsserts.assertBasic(unicodeEscaper);
     assertEquals("<hello><hi><lo>", charEscaper.escape("x\uD800\uDC00"));
diff --git a/android/guava-tests/test/com/google/common/eventbus/PackageSanityTests.java b/android/guava-tests/test/com/google/common/eventbus/PackageSanityTests.java
index 5dee7ca..225e555 100644
--- a/android/guava-tests/test/com/google/common/eventbus/PackageSanityTests.java
+++ b/android/guava-tests/test/com/google/common/eventbus/PackageSanityTests.java
@@ -18,7 +18,7 @@
 
 import com.google.common.testing.AbstractPackageSanityTests;
 import java.lang.reflect.Method;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Basic sanity tests for the entire package.
@@ -41,7 +41,7 @@
     private final EventBus eventBus = new EventBus();
 
     @Subscribe
-    public void handle(@NullableDecl Object anything) {}
+    public void handle(@CheckForNull Object anything) {}
 
     Subscriber toSubscriber() throws Exception {
       return Subscriber.create(eventBus, this, subscriberMethod());
diff --git a/android/guava-tests/test/com/google/common/eventbus/StringCatcher.java b/android/guava-tests/test/com/google/common/eventbus/StringCatcher.java
index 282abe1..198fa2e 100644
--- a/android/guava-tests/test/com/google/common/eventbus/StringCatcher.java
+++ b/android/guava-tests/test/com/google/common/eventbus/StringCatcher.java
@@ -18,8 +18,8 @@
 
 import com.google.common.collect.Lists;
 import java.util.List;
+import javax.annotation.CheckForNull;
 import junit.framework.Assert;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A simple EventSubscriber mock that records Strings.
@@ -33,11 +33,11 @@
   private List<String> events = Lists.newArrayList();
 
   @Subscribe
-  public void hereHaveAString(@NullableDecl String string) {
+  public void hereHaveAString(@CheckForNull String string) {
     events.add(string);
   }
 
-  public void methodWithoutAnnotation(@NullableDecl String string) {
+  public void methodWithoutAnnotation(@CheckForNull String string) {
     Assert.fail("Event bus must not call methods without @Subscribe!");
   }
 
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/AbstractEventBusTest.java b/android/guava-tests/test/com/google/common/eventbus/outside/AbstractEventBusTest.java
new file mode 100644
index 0000000..f4af7a7
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/eventbus/outside/AbstractEventBusTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import com.google.common.eventbus.EventBus;
+import junit.framework.TestCase;
+
+/**
+ * Abstract base class for tests that EventBus finds the correct subscribers.
+ *
+ * <p>The actual tests are distributed among the other classes in this package based on whether they
+ * are annotated or abstract in the superclass.
+ *
+ * <p>This test must be outside the c.g.c.eventbus package to test correctly.
+ *
+ * @author Louis Wasserman
+ */
+abstract class AbstractEventBusTest<H> extends TestCase {
+  static final Object EVENT = new Object();
+
+  abstract H createSubscriber();
+
+  private H subscriber;
+
+  H getSubscriber() {
+    return subscriber;
+  }
+
+  @Override
+  protected void setUp() throws Exception {
+    subscriber = createSubscriber();
+    EventBus bus = new EventBus();
+    bus.register(subscriber);
+    bus.post(EVENT);
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    subscriber = null;
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/AbstractNotAnnotatedInSuperclassTest.java b/android/guava-tests/test/com/google/common/eventbus/outside/AbstractNotAnnotatedInSuperclassTest.java
new file mode 100644
index 0000000..a391fcb
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/eventbus/outside/AbstractNotAnnotatedInSuperclassTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.AbstractNotAnnotatedInSuperclassTest.SubClass;
+import java.util.List;
+
+public class AbstractNotAnnotatedInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  abstract static class SuperClass {
+    public abstract void overriddenInSubclassNowhereAnnotated(Object o);
+
+    public abstract void overriddenAndAnnotatedInSubclass(Object o);
+  }
+
+  static class SubClass extends SuperClass {
+    final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+
+    @Override
+    public void overriddenInSubclassNowhereAnnotated(Object o) {
+      overriddenInSubclassNowhereAnnotatedEvents.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testOverriddenInSubclassNowhereAnnotated() {
+    assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedAndAbstractInSuperclassTest.java b/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedAndAbstractInSuperclassTest.java
new file mode 100644
index 0000000..aea17c3
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedAndAbstractInSuperclassTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.AnnotatedAndAbstractInSuperclassTest.SubClass;
+import java.util.List;
+
+public class AnnotatedAndAbstractInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  abstract static class SuperClass {
+    @Subscribe
+    public abstract void overriddenAndAnnotatedInSubclass(Object o);
+
+    @Subscribe
+    public abstract void overriddenInSubclass(Object o);
+  }
+
+  static class SubClass extends SuperClass {
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+    final List<Object> overriddenInSubclassEvents = Lists.newArrayList();
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+
+    @Override
+    public void overriddenInSubclass(Object o) {
+      overriddenInSubclassEvents.add(o);
+    }
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testOverriddenNotAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenInSubclassEvents).contains(EVENT);
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedNotAbstractInSuperclassTest.java b/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedNotAbstractInSuperclassTest.java
new file mode 100644
index 0000000..3ec8ea4
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedNotAbstractInSuperclassTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.AnnotatedNotAbstractInSuperclassTest.SubClass;
+import java.util.List;
+
+public class AnnotatedNotAbstractInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  static class SuperClass {
+    final List<Object> notOverriddenInSubclassEvents = Lists.newArrayList();
+    final List<Object> overriddenNotAnnotatedInSubclassEvents = Lists.newArrayList();
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+    final List<Object> differentlyOverriddenNotAnnotatedInSubclassBadEvents = Lists.newArrayList();
+    final List<Object> differentlyOverriddenAnnotatedInSubclassBadEvents = Lists.newArrayList();
+
+    @Subscribe
+    public void notOverriddenInSubclass(Object o) {
+      notOverriddenInSubclassEvents.add(o);
+    }
+
+    @Subscribe
+    public void overriddenNotAnnotatedInSubclass(Object o) {
+      overriddenNotAnnotatedInSubclassEvents.add(o);
+    }
+
+    @Subscribe
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+
+    @Subscribe
+    public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
+      // the subclass overrides this and does *not* call super.dONAIS(o)
+      differentlyOverriddenNotAnnotatedInSubclassBadEvents.add(o);
+    }
+
+    @Subscribe
+    public void differentlyOverriddenAnnotatedInSubclass(Object o) {
+      // the subclass overrides this and does *not* call super.dOAIS(o)
+      differentlyOverriddenAnnotatedInSubclassBadEvents.add(o);
+    }
+  }
+
+  static class SubClass extends SuperClass {
+    final List<Object> differentlyOverriddenNotAnnotatedInSubclassGoodEvents = Lists.newArrayList();
+    final List<Object> differentlyOverriddenAnnotatedInSubclassGoodEvents = Lists.newArrayList();
+
+    @Override
+    public void overriddenNotAnnotatedInSubclass(Object o) {
+      super.overriddenNotAnnotatedInSubclass(o);
+    }
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      super.overriddenAndAnnotatedInSubclass(o);
+    }
+
+    @Override
+    public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
+      differentlyOverriddenNotAnnotatedInSubclassGoodEvents.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void differentlyOverriddenAnnotatedInSubclass(Object o) {
+      differentlyOverriddenAnnotatedInSubclassGoodEvents.add(o);
+    }
+  }
+
+  public void testNotOverriddenInSubclass() {
+    assertThat(getSubscriber().notOverriddenInSubclassEvents).contains(EVENT);
+  }
+
+  public void testOverriddenNotAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenNotAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testDifferentlyOverriddenNotAnnotatedInSubclass() {
+    assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassGoodEvents)
+        .contains(EVENT);
+    assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassBadEvents).isEmpty();
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testDifferentlyOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassGoodEvents).contains(EVENT);
+    assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassBadEvents).isEmpty();
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedSubscriberFinderTests.java b/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedSubscriberFinderTests.java
deleted file mode 100644
index a1cbb59..0000000
--- a/android/guava-tests/test/com/google/common/eventbus/outside/AnnotatedSubscriberFinderTests.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Copyright (C) 2012 The Guava Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.common.eventbus.outside;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Lists;
-import com.google.common.eventbus.EventBus;
-import com.google.common.eventbus.Subscribe;
-import java.util.List;
-import junit.framework.TestCase;
-
-/**
- * Test that EventBus finds the correct subscribers.
- *
- * <p>This test must be outside the c.g.c.eventbus package to test correctly.
- *
- * @author Louis Wasserman
- */
-public class AnnotatedSubscriberFinderTests {
-
-  private static final Object EVENT = new Object();
-
-  abstract static class AbstractEventBusTest<H> extends TestCase {
-    abstract H createSubscriber();
-
-    private H subscriber;
-
-    H getSubscriber() {
-      return subscriber;
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-      subscriber = createSubscriber();
-      EventBus bus = new EventBus();
-      bus.register(subscriber);
-      bus.post(EVENT);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-      subscriber = null;
-    }
-  }
-
-  /*
-   * We break the tests up based on whether they are annotated or abstract in the superclass.
-   */
-  public static class BaseSubscriberFinderTest
-      extends AbstractEventBusTest<BaseSubscriberFinderTest.Subscriber> {
-    static class Subscriber {
-      final List<Object> nonSubscriberEvents = Lists.newArrayList();
-      final List<Object> subscriberEvents = Lists.newArrayList();
-
-      public void notASubscriber(Object o) {
-        nonSubscriberEvents.add(o);
-      }
-
-      @Subscribe
-      public void subscriber(Object o) {
-        subscriberEvents.add(o);
-      }
-    }
-
-    public void testNonSubscriber() {
-      assertThat(getSubscriber().nonSubscriberEvents).isEmpty();
-    }
-
-    public void testSubscriber() {
-      assertThat(getSubscriber().subscriberEvents).contains(EVENT);
-    }
-
-    @Override
-    Subscriber createSubscriber() {
-      return new Subscriber();
-    }
-  }
-
-  public static class AnnotatedAndAbstractInSuperclassTest
-      extends AbstractEventBusTest<AnnotatedAndAbstractInSuperclassTest.SubClass> {
-    abstract static class SuperClass {
-      @Subscribe
-      public abstract void overriddenAndAnnotatedInSubclass(Object o);
-
-      @Subscribe
-      public abstract void overriddenInSubclass(Object o);
-    }
-
-    static class SubClass extends SuperClass {
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-      final List<Object> overriddenInSubclassEvents = Lists.newArrayList();
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-
-      @Override
-      public void overriddenInSubclass(Object o) {
-        overriddenInSubclassEvents.add(o);
-      }
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testOverriddenNotAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenInSubclassEvents).contains(EVENT);
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class AnnotatedNotAbstractInSuperclassTest
-      extends AbstractEventBusTest<AnnotatedNotAbstractInSuperclassTest.SubClass> {
-    static class SuperClass {
-      final List<Object> notOverriddenInSubclassEvents = Lists.newArrayList();
-      final List<Object> overriddenNotAnnotatedInSubclassEvents = Lists.newArrayList();
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-      final List<Object> differentlyOverriddenNotAnnotatedInSubclassBadEvents =
-          Lists.newArrayList();
-      final List<Object> differentlyOverriddenAnnotatedInSubclassBadEvents = Lists.newArrayList();
-
-      @Subscribe
-      public void notOverriddenInSubclass(Object o) {
-        notOverriddenInSubclassEvents.add(o);
-      }
-
-      @Subscribe
-      public void overriddenNotAnnotatedInSubclass(Object o) {
-        overriddenNotAnnotatedInSubclassEvents.add(o);
-      }
-
-      @Subscribe
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-
-      @Subscribe
-      public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
-        // the subclass overrides this and does *not* call super.dONAIS(o)
-        differentlyOverriddenNotAnnotatedInSubclassBadEvents.add(o);
-      }
-
-      @Subscribe
-      public void differentlyOverriddenAnnotatedInSubclass(Object o) {
-        // the subclass overrides this and does *not* call super.dOAIS(o)
-        differentlyOverriddenAnnotatedInSubclassBadEvents.add(o);
-      }
-    }
-
-    static class SubClass extends SuperClass {
-      final List<Object> differentlyOverriddenNotAnnotatedInSubclassGoodEvents =
-          Lists.newArrayList();
-      final List<Object> differentlyOverriddenAnnotatedInSubclassGoodEvents = Lists.newArrayList();
-
-      @Override
-      public void overriddenNotAnnotatedInSubclass(Object o) {
-        super.overriddenNotAnnotatedInSubclass(o);
-      }
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        super.overriddenAndAnnotatedInSubclass(o);
-      }
-
-      @Override
-      public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
-        differentlyOverriddenNotAnnotatedInSubclassGoodEvents.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void differentlyOverriddenAnnotatedInSubclass(Object o) {
-        differentlyOverriddenAnnotatedInSubclassGoodEvents.add(o);
-      }
-    }
-
-    public void testNotOverriddenInSubclass() {
-      assertThat(getSubscriber().notOverriddenInSubclassEvents).contains(EVENT);
-    }
-
-    public void testOverriddenNotAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenNotAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testDifferentlyOverriddenNotAnnotatedInSubclass() {
-      assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassGoodEvents)
-          .contains(EVENT);
-      assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassBadEvents).isEmpty();
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testDifferentlyOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassGoodEvents)
-          .contains(EVENT);
-      assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassBadEvents).isEmpty();
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class AbstractNotAnnotatedInSuperclassTest
-      extends AbstractEventBusTest<AbstractNotAnnotatedInSuperclassTest.SubClass> {
-    abstract static class SuperClass {
-      public abstract void overriddenInSubclassNowhereAnnotated(Object o);
-
-      public abstract void overriddenAndAnnotatedInSubclass(Object o);
-    }
-
-    static class SubClass extends SuperClass {
-      final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-
-      @Override
-      public void overriddenInSubclassNowhereAnnotated(Object o) {
-        overriddenInSubclassNowhereAnnotatedEvents.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testOverriddenInSubclassNowhereAnnotated() {
-      assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class NeitherAbstractNorAnnotatedInSuperclassTest
-      extends AbstractEventBusTest<NeitherAbstractNorAnnotatedInSuperclassTest.SubClass> {
-    static class SuperClass {
-      final List<Object> neitherOverriddenNorAnnotatedEvents = Lists.newArrayList();
-      final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-
-      public void neitherOverriddenNorAnnotated(Object o) {
-        neitherOverriddenNorAnnotatedEvents.add(o);
-      }
-
-      public void overriddenInSubclassNowhereAnnotated(Object o) {
-        overriddenInSubclassNowhereAnnotatedEvents.add(o);
-      }
-
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-    }
-
-    static class SubClass extends SuperClass {
-      @Override
-      public void overriddenInSubclassNowhereAnnotated(Object o) {
-        super.overriddenInSubclassNowhereAnnotated(o);
-      }
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        super.overriddenAndAnnotatedInSubclass(o);
-      }
-    }
-
-    public void testNeitherOverriddenNorAnnotated() {
-      assertThat(getSubscriber().neitherOverriddenNorAnnotatedEvents).isEmpty();
-    }
-
-    public void testOverriddenInSubclassNowhereAnnotated() {
-      assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class DeepInterfaceTest
-      extends AbstractEventBusTest<DeepInterfaceTest.SubscriberClass> {
-    interface Interface1 {
-      @Subscribe
-      void annotatedIn1(Object o);
-
-      @Subscribe
-      void annotatedIn1And2(Object o);
-
-      @Subscribe
-      void annotatedIn1And2AndClass(Object o);
-
-      void declaredIn1AnnotatedIn2(Object o);
-
-      void declaredIn1AnnotatedInClass(Object o);
-
-      void nowhereAnnotated(Object o);
-    }
-
-    interface Interface2 extends Interface1 {
-      @Override
-      @Subscribe
-      void declaredIn1AnnotatedIn2(Object o);
-
-      @Override
-      @Subscribe
-      void annotatedIn1And2(Object o);
-
-      @Override
-      @Subscribe
-      void annotatedIn1And2AndClass(Object o);
-
-      void declaredIn2AnnotatedInClass(Object o);
-
-      @Subscribe
-      void annotatedIn2(Object o);
-    }
-
-    static class SubscriberClass implements Interface2 {
-      final List<Object> annotatedIn1Events = Lists.newArrayList();
-      final List<Object> annotatedIn1And2Events = Lists.newArrayList();
-      final List<Object> annotatedIn1And2AndClassEvents = Lists.newArrayList();
-      final List<Object> declaredIn1AnnotatedIn2Events = Lists.newArrayList();
-      final List<Object> declaredIn1AnnotatedInClassEvents = Lists.newArrayList();
-      final List<Object> declaredIn2AnnotatedInClassEvents = Lists.newArrayList();
-      final List<Object> annotatedIn2Events = Lists.newArrayList();
-      final List<Object> nowhereAnnotatedEvents = Lists.newArrayList();
-
-      @Override
-      public void annotatedIn1(Object o) {
-        annotatedIn1Events.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void declaredIn1AnnotatedInClass(Object o) {
-        declaredIn1AnnotatedInClassEvents.add(o);
-      }
-
-      @Override
-      public void declaredIn1AnnotatedIn2(Object o) {
-        declaredIn1AnnotatedIn2Events.add(o);
-      }
-
-      @Override
-      public void annotatedIn1And2(Object o) {
-        annotatedIn1And2Events.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void annotatedIn1And2AndClass(Object o) {
-        annotatedIn1And2AndClassEvents.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void declaredIn2AnnotatedInClass(Object o) {
-        declaredIn2AnnotatedInClassEvents.add(o);
-      }
-
-      @Override
-      public void annotatedIn2(Object o) {
-        annotatedIn2Events.add(o);
-      }
-
-      @Override
-      public void nowhereAnnotated(Object o) {
-        nowhereAnnotatedEvents.add(o);
-      }
-    }
-
-    public void testAnnotatedIn1() {
-      assertThat(getSubscriber().annotatedIn1Events).contains(EVENT);
-    }
-
-    public void testAnnotatedIn2() {
-      assertThat(getSubscriber().annotatedIn2Events).contains(EVENT);
-    }
-
-    public void testAnnotatedIn1And2() {
-      assertThat(getSubscriber().annotatedIn1And2Events).contains(EVENT);
-    }
-
-    public void testAnnotatedIn1And2AndClass() {
-      assertThat(getSubscriber().annotatedIn1And2AndClassEvents).contains(EVENT);
-    }
-
-    public void testDeclaredIn1AnnotatedIn2() {
-      assertThat(getSubscriber().declaredIn1AnnotatedIn2Events).contains(EVENT);
-    }
-
-    public void testDeclaredIn1AnnotatedInClass() {
-      assertThat(getSubscriber().declaredIn1AnnotatedInClassEvents).contains(EVENT);
-    }
-
-    public void testDeclaredIn2AnnotatedInClass() {
-      assertThat(getSubscriber().declaredIn2AnnotatedInClassEvents).contains(EVENT);
-    }
-
-    public void testNowhereAnnotated() {
-      assertThat(getSubscriber().nowhereAnnotatedEvents).isEmpty();
-    }
-
-    @Override
-    SubscriberClass createSubscriber() {
-      return new SubscriberClass();
-    }
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/BaseSubscriberFinderTest.java b/android/guava-tests/test/com/google/common/eventbus/outside/BaseSubscriberFinderTest.java
new file mode 100644
index 0000000..461fb79
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/eventbus/outside/BaseSubscriberFinderTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.BaseSubscriberFinderTest.Subscriber;
+import java.util.List;
+
+public class BaseSubscriberFinderTest extends AbstractEventBusTest<Subscriber> {
+  static class Subscriber {
+    final List<Object> nonSubscriberEvents = Lists.newArrayList();
+    final List<Object> subscriberEvents = Lists.newArrayList();
+
+    public void notASubscriber(Object o) {
+      nonSubscriberEvents.add(o);
+    }
+
+    @Subscribe
+    public void subscriber(Object o) {
+      subscriberEvents.add(o);
+    }
+  }
+
+  public void testNonSubscriber() {
+    assertThat(getSubscriber().nonSubscriberEvents).isEmpty();
+  }
+
+  public void testSubscriber() {
+    assertThat(getSubscriber().subscriberEvents).contains(EVENT);
+  }
+
+  @Override
+  Subscriber createSubscriber() {
+    return new Subscriber();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/DeepInterfaceTest.java b/android/guava-tests/test/com/google/common/eventbus/outside/DeepInterfaceTest.java
new file mode 100644
index 0000000..4fefbc1
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/eventbus/outside/DeepInterfaceTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.DeepInterfaceTest.SubscriberClass;
+import java.util.List;
+
+public class DeepInterfaceTest extends AbstractEventBusTest<SubscriberClass> {
+  interface Interface1 {
+    @Subscribe
+    void annotatedIn1(Object o);
+
+    @Subscribe
+    void annotatedIn1And2(Object o);
+
+    @Subscribe
+    void annotatedIn1And2AndClass(Object o);
+
+    void declaredIn1AnnotatedIn2(Object o);
+
+    void declaredIn1AnnotatedInClass(Object o);
+
+    void nowhereAnnotated(Object o);
+  }
+
+  interface Interface2 extends Interface1 {
+    @Override
+    @Subscribe
+    void declaredIn1AnnotatedIn2(Object o);
+
+    @Override
+    @Subscribe
+    void annotatedIn1And2(Object o);
+
+    @Override
+    @Subscribe
+    void annotatedIn1And2AndClass(Object o);
+
+    void declaredIn2AnnotatedInClass(Object o);
+
+    @Subscribe
+    void annotatedIn2(Object o);
+  }
+
+  static class SubscriberClass implements Interface2 {
+    final List<Object> annotatedIn1Events = Lists.newArrayList();
+    final List<Object> annotatedIn1And2Events = Lists.newArrayList();
+    final List<Object> annotatedIn1And2AndClassEvents = Lists.newArrayList();
+    final List<Object> declaredIn1AnnotatedIn2Events = Lists.newArrayList();
+    final List<Object> declaredIn1AnnotatedInClassEvents = Lists.newArrayList();
+    final List<Object> declaredIn2AnnotatedInClassEvents = Lists.newArrayList();
+    final List<Object> annotatedIn2Events = Lists.newArrayList();
+    final List<Object> nowhereAnnotatedEvents = Lists.newArrayList();
+
+    @Override
+    public void annotatedIn1(Object o) {
+      annotatedIn1Events.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void declaredIn1AnnotatedInClass(Object o) {
+      declaredIn1AnnotatedInClassEvents.add(o);
+    }
+
+    @Override
+    public void declaredIn1AnnotatedIn2(Object o) {
+      declaredIn1AnnotatedIn2Events.add(o);
+    }
+
+    @Override
+    public void annotatedIn1And2(Object o) {
+      annotatedIn1And2Events.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void annotatedIn1And2AndClass(Object o) {
+      annotatedIn1And2AndClassEvents.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void declaredIn2AnnotatedInClass(Object o) {
+      declaredIn2AnnotatedInClassEvents.add(o);
+    }
+
+    @Override
+    public void annotatedIn2(Object o) {
+      annotatedIn2Events.add(o);
+    }
+
+    @Override
+    public void nowhereAnnotated(Object o) {
+      nowhereAnnotatedEvents.add(o);
+    }
+  }
+
+  public void testAnnotatedIn1() {
+    assertThat(getSubscriber().annotatedIn1Events).contains(EVENT);
+  }
+
+  public void testAnnotatedIn2() {
+    assertThat(getSubscriber().annotatedIn2Events).contains(EVENT);
+  }
+
+  public void testAnnotatedIn1And2() {
+    assertThat(getSubscriber().annotatedIn1And2Events).contains(EVENT);
+  }
+
+  public void testAnnotatedIn1And2AndClass() {
+    assertThat(getSubscriber().annotatedIn1And2AndClassEvents).contains(EVENT);
+  }
+
+  public void testDeclaredIn1AnnotatedIn2() {
+    assertThat(getSubscriber().declaredIn1AnnotatedIn2Events).contains(EVENT);
+  }
+
+  public void testDeclaredIn1AnnotatedInClass() {
+    assertThat(getSubscriber().declaredIn1AnnotatedInClassEvents).contains(EVENT);
+  }
+
+  public void testDeclaredIn2AnnotatedInClass() {
+    assertThat(getSubscriber().declaredIn2AnnotatedInClassEvents).contains(EVENT);
+  }
+
+  public void testNowhereAnnotated() {
+    assertThat(getSubscriber().nowhereAnnotatedEvents).isEmpty();
+  }
+
+  @Override
+  SubscriberClass createSubscriber() {
+    return new SubscriberClass();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/eventbus/outside/NeitherAbstractNorAnnotatedInSuperclassTest.java b/android/guava-tests/test/com/google/common/eventbus/outside/NeitherAbstractNorAnnotatedInSuperclassTest.java
new file mode 100644
index 0000000..a2aca55
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/eventbus/outside/NeitherAbstractNorAnnotatedInSuperclassTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.NeitherAbstractNorAnnotatedInSuperclassTest.SubClass;
+import java.util.List;
+
+public class NeitherAbstractNorAnnotatedInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  static class SuperClass {
+    final List<Object> neitherOverriddenNorAnnotatedEvents = Lists.newArrayList();
+    final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+
+    public void neitherOverriddenNorAnnotated(Object o) {
+      neitherOverriddenNorAnnotatedEvents.add(o);
+    }
+
+    public void overriddenInSubclassNowhereAnnotated(Object o) {
+      overriddenInSubclassNowhereAnnotatedEvents.add(o);
+    }
+
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+  }
+
+  static class SubClass extends SuperClass {
+    @Override
+    public void overriddenInSubclassNowhereAnnotated(Object o) {
+      super.overriddenInSubclassNowhereAnnotated(o);
+    }
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      super.overriddenAndAnnotatedInSubclass(o);
+    }
+  }
+
+  public void testNeitherOverriddenNorAnnotated() {
+    assertThat(getSubscriber().neitherOverriddenNorAnnotatedEvents).isEmpty();
+  }
+
+  public void testOverriddenInSubclassNowhereAnnotated() {
+    assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java b/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
index f69b578..d99be09 100644
--- a/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
+++ b/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
@@ -36,8 +36,8 @@
 import java.util.List;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tests for SimpleGenericBloomFilter and derived BloomFilter views.
@@ -408,7 +408,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return (object instanceof CustomFunnel);
     }
 
@@ -506,7 +506,10 @@
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     bf.writeTo(out);
 
-    assertEquals(bf, BloomFilter.readFrom(new ByteArrayInputStream(out.toByteArray()), funnel));
+    BloomFilter<byte[]> read =
+        BloomFilter.readFrom(new ByteArrayInputStream(out.toByteArray()), funnel);
+    assertThat(read).isEqualTo(bf);
+    assertThat(read.expectedFpp()).isGreaterThan(0);
   }
 
   /**
diff --git a/android/guava-tests/test/com/google/common/hash/Fingerprint2011Test.java b/android/guava-tests/test/com/google/common/hash/Fingerprint2011Test.java
new file mode 100644
index 0000000..effa632
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/hash/Fingerprint2011Test.java
@@ -0,0 +1,233 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package com.google.common.hash;
+
+import static com.google.common.base.Charsets.ISO_8859_1;
+import static com.google.common.base.Charsets.UTF_8;
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.UnsignedLong;
+import java.util.Arrays;
+import junit.framework.TestCase;
+
+/**
+ * Unit test for Fingerprint2011.
+ *
+ * @author kylemaddison@google.com (Kyle Maddison)
+ */
+public class Fingerprint2011Test extends TestCase {
+
+  // Length of the sample string to produce
+  private static final int MAX_BYTES = 1000;
+
+  // Map from sample string lengths to the fingerprint
+  private static final ImmutableSortedMap<Integer, Long> LENGTH_FINGERPRINTS =
+      new ImmutableSortedMap.Builder<Integer, Long>(Ordering.natural())
+          .put(1000, 0x433109b33e13e6edL)
+          .put(800, 0x5f2f123bfc815f81L)
+          .put(640, 0x6396fc6a67293cf4L)
+          .put(512, 0x45c01b4934ddbbbeL)
+          .put(409, 0xfcd19b617551db45L)
+          .put(327, 0x4eee69e12854871eL)
+          .put(261, 0xab753446a3bbd532L)
+          .put(208, 0x54242fe06a291c3fL)
+          .put(166, 0x4f7acff7703a635bL)
+          .put(132, 0xa784bd0a1f22cc7fL)
+          .put(105, 0xf19118e187456638L)
+          .put(84, 0x3e2e58f9196abfe5L)
+          .put(67, 0xd38ae3dec0107aeaL)
+          .put(53, 0xea3033885868e10eL)
+          .put(42, 0x1394a146d0d7e04bL)
+          .put(33, 0x9962499315d2e8daL)
+          .put(26, 0x0849f5cfa85489b5L)
+          .put(20, 0x83b395ff19bf2171L)
+          .put(16, 0x9d33dd141bd55d9aL)
+          .put(12, 0x196248eb0b02466aL)
+          .put(9, 0x1cf73a50ff120336L)
+          .put(7, 0xb451c339457dbf51L)
+          .put(5, 0x681982c5e7b74064L)
+          .put(4, 0xc5ce47450ca6c021L)
+          .put(3, 0x9fcc3c3fde4d5ff7L)
+          .put(2, 0x090966a836e5fa4bL)
+          .put(1, 0x8199675ecaa6fe64L)
+          .put(0, 0x23ad7c904aa665e3L)
+          .build();
+  private static final HashFunction HASH_FN = Hashing.fingerprint2011();
+
+  // If this test fails, all bets are off
+  public void testReallySimpleFingerprints() {
+    assertEquals(8473225671271759044L, fingerprint("test".getBytes(UTF_8)));
+    // 32 characters long
+    assertEquals(7345148637025587076L, fingerprint(Strings.repeat("test", 8).getBytes(UTF_8)));
+    // 256 characters long
+    assertEquals(4904844928629814570L, fingerprint(Strings.repeat("test", 64).getBytes(UTF_8)));
+  }
+
+  public void testStringsConsistency() {
+    for (String s : Arrays.asList("", "some", "test", "strings", "to", "try")) {
+      assertEquals(HASH_FN.newHasher().putUnencodedChars(s).hash(), HASH_FN.hashUnencodedChars(s));
+    }
+  }
+
+  public void testUtf8() {
+    char[] charsA = new char[128];
+    char[] charsB = new char[128];
+
+    for (int i = 0; i < charsA.length; i++) {
+      if (i < 100) {
+        charsA[i] = 'a';
+        charsB[i] = 'a';
+      } else {
+        // Both two-byte characters, but must be different
+        charsA[i] = (char) (0x0180 + i);
+        charsB[i] = (char) (0x0280 + i);
+      }
+    }
+
+    String stringA = new String(charsA);
+    String stringB = new String(charsB);
+    assertThat(stringA).isNotEqualTo(stringB);
+    assertThat(HASH_FN.hashUnencodedChars(stringA))
+        .isNotEqualTo(HASH_FN.hashUnencodedChars(stringB));
+    assertThat(fingerprint(stringA.getBytes(UTF_8)))
+        .isNotEqualTo(fingerprint(stringB.getBytes(UTF_8)));
+
+    // ISO 8859-1 only has 0-255 (ubyte) representation so throws away UTF-8 characters
+    // greater than 127 (ie with their top bit set).
+    // Don't attempt to do this in real code.
+    assertEquals(
+        fingerprint(stringA.getBytes(ISO_8859_1)), fingerprint(stringB.getBytes(ISO_8859_1)));
+  }
+
+  public void testMumurHash64() {
+    byte[] bytes = "test".getBytes(UTF_8);
+    assertEquals(
+        1618900948208871284L, Fingerprint2011.murmurHash64WithSeed(bytes, 0, bytes.length, 1));
+
+    bytes = "test test test".getBytes(UTF_8);
+    assertEquals(
+        UnsignedLong.valueOf("12313169684067793560").longValue(),
+        Fingerprint2011.murmurHash64WithSeed(bytes, 0, bytes.length, 1));
+  }
+
+  public void testPutNonChars() {
+    Hasher hasher = HASH_FN.newHasher();
+    // Expected data is 0x0100010100000000
+    hasher
+        .putBoolean(true)
+        .putBoolean(true)
+        .putBoolean(false)
+        .putBoolean(true)
+        .putBoolean(false)
+        .putBoolean(false)
+        .putBoolean(false)
+        .putBoolean(false);
+    final long hashCode = hasher.hash().asLong();
+
+    hasher = HASH_FN.newHasher();
+    hasher
+        .putByte((byte) 0x01)
+        .putByte((byte) 0x01)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x01)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x00);
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher
+        .putChar((char) 0x0101)
+        .putChar((char) 0x0100)
+        .putChar((char) 0x0000)
+        .putChar((char) 0x0000);
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher.putBytes(new byte[] {0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00});
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher.putLong(0x0000000001000101L);
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher
+        .putShort((short) 0x0101)
+        .putShort((short) 0x0100)
+        .putShort((short) 0x0000)
+        .putShort((short) 0x0000);
+    assertEquals(hashCode, hasher.hash().asLong());
+  }
+
+  public void testHashFloatIsStable() {
+    // This is about the best we can do for floating-point
+    Hasher hasher = HASH_FN.newHasher();
+    hasher.putFloat(0x01000101f).putFloat(0f);
+    assertEquals(0x96a4f8cc6ecbf16L, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher.putDouble(0x0000000001000101d);
+    assertEquals(0xcf54171253fdc198L, hasher.hash().asLong());
+  }
+
+  /** Convenience method to compute a fingerprint on a full bytes array. */
+  private static long fingerprint(byte[] bytes) {
+    return fingerprint(bytes, bytes.length);
+  }
+
+  /** Convenience method to compute a fingerprint on a subset of a byte array. */
+  private static long fingerprint(byte[] bytes, int length) {
+    return HASH_FN.hashBytes(bytes, 0, length).asLong();
+  }
+
+  /**
+   * Tests that the Java port of Fingerprint2011 provides the same results on buffers up to 800
+   * bytes long as the original implementation in C++. See http://cl/106539598
+   */
+  public void testMultipleLengths() {
+    int iterations = 800;
+    byte[] buf = new byte[iterations * 4];
+    int bufLen = 0;
+    long h = 0;
+    for (int i = 0; i < iterations; ++i) {
+      h ^= fingerprint(buf, i);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      h ^= fingerprint(buf, i * i % bufLen);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      h ^= fingerprint(buf, i * i * i % bufLen);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      h ^= fingerprint(buf, bufLen);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      int x0 = buf[bufLen - 1] & 0xff;
+      int x1 = buf[bufLen - 2] & 0xff;
+      int x2 = buf[bufLen - 3] & 0xff;
+      int x3 = buf[bufLen / 2] & 0xff;
+      buf[((x0 << 16) + (x1 << 8) + x2) % bufLen] ^= x3;
+      buf[((x1 << 16) + (x2 << 8) + x3) % bufLen] ^= i % 256;
+    }
+    assertEquals(0xeaa3b1c985261632L, h);
+  }
+
+  private static long remix(long h) {
+    h ^= h >>> 41;
+    h *= 949921979;
+    return h;
+  }
+
+  private static byte getChar(long h) {
+    return (byte) ('a' + ((h & 0xfffff) % 26));
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/hash/HashingTest.java b/android/guava-tests/test/com/google/common/hash/HashingTest.java
index bc3db34..aff5c25 100644
--- a/android/guava-tests/test/com/google/common/hash/HashingTest.java
+++ b/android/guava-tests/test/com/google/common/hash/HashingTest.java
@@ -125,6 +125,15 @@
         Hashing.sipHash24().toString());
   }
 
+  public void testFingerprint2011() {
+    HashTestUtils.check2BitAvalanche(Hashing.fingerprint2011(), 100, 0.4);
+    HashTestUtils.checkAvalanche(Hashing.fingerprint2011(), 100, 0.4);
+    HashTestUtils.checkNo2BitCharacteristics(Hashing.fingerprint2011());
+    HashTestUtils.checkNoFunnels(Hashing.fingerprint2011());
+    HashTestUtils.assertInvariants(Hashing.fingerprint2011());
+    assertEquals("Hashing.fingerprint2011()", Hashing.fingerprint2011().toString());
+  }
+
   @AndroidIncompatible // slow TODO(cpovirk): Maybe just reduce iterations under Android.
   public void testGoodFastHash() {
     for (int i = 1; i < 200; i += 17) {
@@ -492,6 +501,9 @@
           .put(Hashing.farmHashFingerprint64(), EMPTY_STRING, "4f40902f3b6ae19a")
           .put(Hashing.farmHashFingerprint64(), TQBFJOTLD, "34511b3bf383beab")
           .put(Hashing.farmHashFingerprint64(), TQBFJOTLDP, "737d7e5f8660653e")
+          .put(Hashing.fingerprint2011(), EMPTY_STRING, "e365a64a907cad23")
+          .put(Hashing.fingerprint2011(), TQBFJOTLD, "c9688c84e813b089")
+          .put(Hashing.fingerprint2011(), TQBFJOTLDP, "a714d70f1d569cd0")
           .build();
 
   public void testAllHashFunctionsHaveKnownHashes() throws Exception {
diff --git a/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java b/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java
index 832fb07..c2fdf02 100644
--- a/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java
+++ b/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java
@@ -35,8 +35,8 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tests for {@code BaseEncoding}.
@@ -405,7 +405,7 @@
   }
 
   private static void assertFailsToDecode(
-      BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+      BaseEncoding encoding, String cannotDecode, @CheckForNull String expectedMessage) {
     // We use this somewhat weird pattern with an enum for each assertion we want to make as a way
     // of dealing with the fact that one of the assertions is @GwtIncompatible but we don't want to
     // have to have duplicate @GwtIncompatible test methods just to make that assertion.
@@ -419,7 +419,7 @@
     DECODING_STREAM {
       @Override
       void assertFailsToDecode(
-          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+          BaseEncoding encoding, String cannotDecode, @CheckForNull String expectedMessage) {
         // Regression test for case where DecodingException was swallowed by default implementation
         // of
         // InputStream.read(byte[], int, int)
@@ -440,14 +440,14 @@
     CAN_DECODE {
       @Override
       void assertFailsToDecode(
-          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+          BaseEncoding encoding, String cannotDecode, @CheckForNull String expectedMessage) {
         assertFalse(encoding.canDecode(cannotDecode));
       }
     },
     DECODE {
       @Override
       void assertFailsToDecode(
-          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+          BaseEncoding encoding, String cannotDecode, @CheckForNull String expectedMessage) {
         try {
           encoding.decode(cannotDecode);
           fail("Expected IllegalArgumentException");
@@ -461,7 +461,7 @@
     DECODE_CHECKED {
       @Override
       void assertFailsToDecode(
-          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+          BaseEncoding encoding, String cannotDecode, @CheckForNull String expectedMessage) {
         try {
           encoding.decodeChecked(cannotDecode);
           fail("Expected DecodingException");
@@ -474,7 +474,7 @@
     };
 
     abstract void assertFailsToDecode(
-        BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage);
+        BaseEncoding encoding, String cannotDecode, @CheckForNull String expectedMessage);
   }
 
   @GwtIncompatible // Reader/Writer
diff --git a/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java b/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
index 3ae2c25..dddae1f 100644
--- a/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
+++ b/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
@@ -562,12 +562,49 @@
     // write to the output stream
     nos.write('n');
     String test = "Test string for NullOutputStream";
-    nos.write(test.getBytes());
-    nos.write(test.getBytes(), 2, 10);
+    byte[] bytes = test.getBytes(Charsets.US_ASCII);
+    nos.write(bytes);
+    nos.write(bytes, 2, 10);
+    nos.write(bytes, bytes.length - 5, 5);
     // nothing really to assert?
     assertSame(ByteStreams.nullOutputStream(), ByteStreams.nullOutputStream());
   }
 
+  public void testNullOutputStream_exceptions() throws Exception {
+    OutputStream nos = ByteStreams.nullOutputStream();
+    try {
+      nos.write(null);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+    try {
+      nos.write(null, 0, 1);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+    byte[] tenBytes = new byte[10];
+    try {
+      nos.write(tenBytes, -1, 1);
+      fail("Expected exception from negative offset");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+    try {
+      nos.write(tenBytes, 1, -1);
+      fail("Expected exception from negative length");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+    try {
+      nos.write(tenBytes, 9, 2);
+      fail("Expected exception from offset+length > array size");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+    try {
+      nos.write(tenBytes, 9, 100);
+      fail("Expected exception from offset+length > array size");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+  }
+
   public void testLimit() throws Exception {
     byte[] big = newPreFilledByteArray(5);
     InputStream bin = new ByteArrayInputStream(big);
diff --git a/android/guava-tests/test/com/google/common/io/CloserTest.java b/android/guava-tests/test/com/google/common/io/CloserTest.java
index 23037f2..38ff700 100644
--- a/android/guava-tests/test/com/google/common/io/CloserTest.java
+++ b/android/guava-tests/test/com/google/common/io/CloserTest.java
@@ -31,8 +31,8 @@
 import java.lang.reflect.Method;
 import java.util.List;
 import java.util.logging.LogRecord;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tests for {@link Closer}.
@@ -435,7 +435,7 @@
       throw new IOException();
     }
 
-    private TestCloseable(@NullableDecl Throwable throwOnClose) {
+    private TestCloseable(@CheckForNull Throwable throwOnClose) {
       this.throwOnClose = throwOnClose;
     }
 
diff --git a/android/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java b/android/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java
index f8e40df..160df41 100644
--- a/android/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java
+++ b/android/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java
@@ -92,6 +92,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testReadLine() throws IOException {
     DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
     try {
diff --git a/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java b/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java
index cf3fad4..e70370e 100644
--- a/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java
+++ b/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java
@@ -37,7 +37,7 @@
 import java.nio.CharBuffer;
 import java.util.Arrays;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * {@link SourceSinkFactory} implementations.
@@ -305,7 +305,7 @@
 
     private final byte[] initialBytes;
 
-    private FileByteSinkFactory(@NullableDecl byte[] initialBytes) {
+    private FileByteSinkFactory(@CheckForNull byte[] initialBytes) {
       this.initialBytes = initialBytes;
     }
 
@@ -375,7 +375,7 @@
 
     private final String initialString;
 
-    private FileCharSinkFactory(@NullableDecl String initialString) {
+    private FileCharSinkFactory(@CheckForNull String initialString) {
       this.initialString = initialString;
     }
 
diff --git a/android/guava-tests/test/com/google/common/io/SourceSinkTester.java b/android/guava-tests/test/com/google/common/io/SourceSinkTester.java
index 9b07355..55a302f 100644
--- a/android/guava-tests/test/com/google/common/io/SourceSinkTester.java
+++ b/android/guava-tests/test/com/google/common/io/SourceSinkTester.java
@@ -69,7 +69,7 @@
           .put("\\n at EOF", "hello\nworld\n")
           .put("\\r at EOF", "hello\nworld\r")
           .put("lorem ipsum", LOREM_IPSUM)
-          .build();
+          .buildOrThrow();
 
   protected final F factory;
   protected final T data;
diff --git a/android/guava-tests/test/com/google/common/math/IntMathTest.java b/android/guava-tests/test/com/google/common/math/IntMathTest.java
index 12b23e2..4db13ad 100644
--- a/android/guava-tests/test/com/google/common/math/IntMathTest.java
+++ b/android/guava-tests/test/com/google/common/math/IntMathTest.java
@@ -137,10 +137,11 @@
   @GwtIncompatible // BigIntegerMath // TODO(cpovirk): GWT-enable BigIntegerMath
   public void testConstantsHalfPowersOf10() {
     for (int i = 0; i < IntMath.halfPowersOf10.length; i++) {
-      assert IntMath.halfPowersOf10[i]
-          == Math.min(
+      assertEquals(
+          IntMath.halfPowersOf10[i],
+          Math.min(
               Integer.MAX_VALUE,
-              BigIntegerMath.sqrt(BigInteger.TEN.pow(2 * i + 1), FLOOR).longValue());
+              BigIntegerMath.sqrt(BigInteger.TEN.pow(2 * i + 1), FLOOR).longValue()));
     }
   }
 
diff --git a/android/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java b/android/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java
index 54d310f..ddb2064 100644
--- a/android/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java
+++ b/android/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java
@@ -53,7 +53,7 @@
       for (int index : indexes) {
         builder.put(index, singleQuantileFromSorted(index, scale, dataset));
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
 
     private double singleQuantileFromSorted(int index, int scale, double[] dataset) {
@@ -97,7 +97,7 @@
       for (int index : indexes) {
         builder.put(index, singleQuantile(index, scale, dataset));
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
   },
 
diff --git a/android/guava-tests/test/com/google/common/math/QuantilesTest.java b/android/guava-tests/test/com/google/common/math/QuantilesTest.java
index 5ac5f6e..77c7020 100644
--- a/android/guava-tests/test/com/google/common/math/QuantilesTest.java
+++ b/android/guava-tests/test/com/google/common/math/QuantilesTest.java
@@ -41,8 +41,8 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Tests for {@link Quantiles}.
@@ -92,7 +92,7 @@
       Correspondence.from(
           new BinaryPredicate<Double, Double>() {
             @Override
-            public boolean apply(@NullableDecl Double actual, @NullableDecl Double expected) {
+            public boolean apply(@CheckForNull Double actual, @CheckForNull Double expected) {
               // Test for equality to allow non-finite values to match; otherwise, use the finite
               // test.
               return actual.equals(expected)
@@ -557,7 +557,7 @@
         }
         assertThat(percentiles().indexes(index1, index2).compute(PSEUDORANDOM_DATASET))
             .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
-            .containsExactlyEntriesIn(expectedBuilder.build());
+            .containsExactlyEntriesIn(expectedBuilder.buildOrThrow());
       }
     }
   }
@@ -573,7 +573,7 @@
     Collections.shuffle(indexes, random);
     assertThat(percentiles().indexes(Ints.toArray(indexes)).compute(PSEUDORANDOM_DATASET))
         .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
-        .containsExactlyEntriesIn(expectedBuilder.build());
+        .containsExactlyEntriesIn(expectedBuilder.buildOrThrow());
   }
 
   @AndroidIncompatible // slow
@@ -589,7 +589,7 @@
     Collections.shuffle(indexes, random);
     assertThat(percentiles().indexes(Ints.toArray(indexes)).computeInPlace(dataset))
         .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
-        .containsExactlyEntriesIn(expectedBuilder.build());
+        .containsExactlyEntriesIn(expectedBuilder.buildOrThrow());
     assertThat(dataset).usingExactEquality().containsExactlyElementsIn(PSEUDORANDOM_DATASET);
   }
 
diff --git a/android/guava-tests/test/com/google/common/net/HostSpecifierTest.java b/android/guava-tests/test/com/google/common/net/HostSpecifierTest.java
index fadeff7..8112879 100644
--- a/android/guava-tests/test/com/google/common/net/HostSpecifierTest.java
+++ b/android/guava-tests/test/com/google/common/net/HostSpecifierTest.java
@@ -92,8 +92,9 @@
   }
 
   private void assertGood(String spec) throws ParseException {
-    HostSpecifier.fromValid(spec); // Throws exception if not working correctly
-    HostSpecifier.from(spec);
+    // Throws exception if not working correctly
+    HostSpecifier unused = HostSpecifier.fromValid(spec);
+    unused = HostSpecifier.from(spec);
     assertTrue(HostSpecifier.isValid(spec));
   }
 
diff --git a/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java b/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
index 7113fb4..c440ee5 100644
--- a/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
+++ b/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
@@ -232,7 +232,7 @@
 
   public void testValid() {
     for (String name : VALID_NAME) {
-      InternetDomainName.from(name);
+      InternetDomainName unused = InternetDomainName.from(name);
     }
   }
 
@@ -392,7 +392,7 @@
     // These would throw an exception if leniency were not preserved during parent() and child()
     // calls.
     InternetDomainName child = parent.child(LOTS_OF_DELTAS);
-    child.child(LOTS_OF_DELTAS);
+    InternetDomainName unused = child.child(LOTS_OF_DELTAS);
   }
 
   public void testValidTopPrivateDomain() {
diff --git a/android/guava-tests/test/com/google/common/net/PercentEscaperTest.java b/android/guava-tests/test/com/google/common/net/PercentEscaperTest.java
index 8443680..e600e4c 100644
--- a/android/guava-tests/test/com/google/common/net/PercentEscaperTest.java
+++ b/android/guava-tests/test/com/google/common/net/PercentEscaperTest.java
@@ -120,16 +120,11 @@
     }
   }
 
-  /**
-   * Tests that if space is a safe character you cannot also specify 'plusForSpace' (throws {@link
-   * IllegalArgumentException}).
-   */
   public void testBadArguments_plusforspace() {
-    try {
-      new PercentEscaper(" ", false);
-    } catch (IllegalArgumentException e) {
-      fail("Space can be a 'safe' character if plusForSpace is false");
-    }
+    // space can be a safe char if plusForSpace is false
+    PercentEscaper unused = new PercentEscaper(" ", false);
+
+    // space cannot be a safe char is plusForSpace is true
     String msg = "plusForSpace cannot be specified when space is a 'safe' character";
     try {
       new PercentEscaper(" ", true);
diff --git a/android/guava-tests/test/com/google/common/primitives/BooleansTest.java b/android/guava-tests/test/com/google/common/primitives/BooleansTest.java
index 560c337..43ec04c 100644
--- a/android/guava-tests/test/com/google/common/primitives/BooleansTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/BooleansTest.java
@@ -299,7 +299,8 @@
     assertEquals(1, Booleans.asList(ARRAY_FALSE_TRUE).lastIndexOf(true));
     List<Boolean> reference = Booleans.asList(ARRAY_FALSE);
     assertEquals(Booleans.asList(ARRAY_FALSE), reference);
-    assertEquals(reference, reference);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(reference.equals(reference));
   }
 
   public void testAsListHashcode() {
diff --git a/android/guava-tests/test/com/google/common/reflect/InvokableTest.java b/android/guava-tests/test/com/google/common/reflect/InvokableTest.java
index f116ee2..e545bdd 100644
--- a/android/guava-tests/test/com/google/common/reflect/InvokableTest.java
+++ b/android/guava-tests/test/com/google/common/reflect/InvokableTest.java
@@ -32,8 +32,8 @@
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.TypeVariable;
 import java.util.Collections;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit tests for {@link Invokable}.
@@ -520,7 +520,7 @@
 
   private class InnerWithAnnotatedConstructorParameter {
     @SuppressWarnings("unused") // called by reflection
-    InnerWithAnnotatedConstructorParameter(@NullableDecl String s) {}
+    InnerWithAnnotatedConstructorParameter(@CheckForNull String s) {}
   }
 
   public void testInnerClassWithAnnotatedConstructorParameter() {
@@ -601,7 +601,7 @@
   }
 
   public void testAnonymousClassInConstructor() {
-    new AnonymousClassInConstructor();
+    AnonymousClassInConstructor unused = new AnonymousClassInConstructor();
   }
 
   private static class AnonymousClassInConstructor {
@@ -621,7 +621,7 @@
   }
 
   public void testLocalClassInInstanceInitializer() {
-    new LocalClassInInstanceInitializer();
+    LocalClassInInstanceInitializer unused = new LocalClassInInstanceInitializer();
   }
 
   private static class LocalClassInInstanceInitializer {
@@ -633,7 +633,7 @@
   }
 
   public void testLocalClassInStaticInitializer() {
-    new LocalClassInStaticInitializer();
+    LocalClassInStaticInitializer unused = new LocalClassInStaticInitializer();
   }
 
   private static class LocalClassInStaticInitializer {
@@ -645,7 +645,8 @@
   }
 
   public void testLocalClassWithSeeminglyHiddenThisInStaticInitializer_BUG() {
-    new LocalClassWithSeeminglyHiddenThisInStaticInitializer();
+    LocalClassWithSeeminglyHiddenThisInStaticInitializer unused =
+        new LocalClassWithSeeminglyHiddenThisInStaticInitializer();
   }
 
   /**
@@ -683,7 +684,7 @@
   public void testLocalClassWithAnnotatedConstructorParameter() throws Exception {
     class LocalWithAnnotatedConstructorParameter {
       @SuppressWarnings("unused") // called by reflection
-      LocalWithAnnotatedConstructorParameter(@NullableDecl String s) {}
+      LocalWithAnnotatedConstructorParameter(@CheckForNull String s) {}
     }
     Constructor<?> constructor =
         LocalWithAnnotatedConstructorParameter.class.getDeclaredConstructors()[0];
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
index f49b962..991cada 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
@@ -359,7 +359,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testOverflowTimeout() throws Exception {
     // First, sanity check that naive multiplication would really overflow to a negative number:
     long nanosPerSecond = NANOSECONDS.convert(1, SECONDS);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractClosingFutureTest.java
similarity index 91%
rename from android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
rename to android/guava-tests/test/com/google/common/util/concurrent/AbstractClosingFutureTest.java
index f5f12db..8f0fde2 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractClosingFutureTest.java
@@ -81,7 +81,7 @@
  * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)} paths to complete a
  * {@link ClosingFuture} pipeline.
  */
-public abstract class ClosingFutureTest extends TestCase {
+public abstract class AbstractClosingFutureTest extends TestCase {
   // TODO(dpb): Use Expect once that supports JUnit 3, or we can use JUnit 4.
   final List<AssertionError> failures = new ArrayList<>();
   final StandardSubjectBuilder expect =
@@ -1616,7 +1616,7 @@
 
   /**
    * Marks the given step final and waits for it to fail. Expects the failure exception to match
-   * {@link ClosingFutureTest#exception}.
+   * {@link AbstractClosingFutureTest#exception}.
    */
   abstract void assertFinallyFailsWithException(ClosingFuture<?> closingFuture);
 
@@ -1628,191 +1628,6 @@
     assertTrue(awaitUninterruptibly(closingFuture.whenClosedCountDown(), 1, SECONDS));
   }
 
-  /** Tests for {@link ClosingFuture} that exercise {@link ClosingFuture#finishToFuture()}. */
-
-  public static class FinishToFutureTest extends ClosingFutureTest {
-
-    public void testFinishToFuture_throwsIfCalledTwice() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
-      try {
-        FluentFuture<Closeable> unused2 = closingFuture.finishToFuture();
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    public void testFinishToFuture_throwsAfterCallingFinishToValueAndCloser() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), directExecutor());
-      try {
-        FluentFuture<Closeable> unused = closingFuture.finishToFuture();
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    public void testFinishToFuture_preventsFurtherDerivation() {
-      ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
-      FluentFuture<String> unused = closingFuture.finishToFuture();
-      assertDerivingThrowsIllegalStateException(closingFuture);
-    }
-
-    @Override
-    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
-      return getUninterruptibly(closingFuture.finishToFuture());
-    }
-
-    @Override
-    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
-      assertThatFutureFailsWithException(closingFuture.finishToFuture());
-    }
-
-    @Override
-    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
-      assertThatFutureBecomesCancelled(closingFuture.finishToFuture());
-    }
-
-    @Override
-    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
-      assertThat(closingFuture.finishToFuture().cancel(false)).isTrue();
-      waitUntilClosed(closingFuture);
-      futureCancelled.countDown();
-    }
-  }
-
-  /**
-   * Tests for {@link ClosingFuture} that exercise {@link
-   * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)}.
-   */
-
-  public static class FinishToValueAndCloserTest extends ClosingFutureTest {
-
-    private final ExecutorService finishToValueAndCloserExecutor = newSingleThreadExecutor();
-    private volatile ValueAndCloser<?> valueAndCloser;
-
-    @Override
-    protected void tearDown() throws Exception {
-      super.tearDown();
-      assertWithMessage("finishToValueAndCloserExecutor was shut down")
-          .that(shutdownAndAwaitTermination(finishToValueAndCloserExecutor, 10, SECONDS))
-          .isTrue();
-    }
-
-    public void testFinishToValueAndCloser_throwsIfCalledTwice() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      closingFuture.finishToValueAndCloser(
-          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
-      try {
-        closingFuture.finishToValueAndCloser(
-            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    public void testFinishToValueAndCloser_throwsAfterCallingFinishToFuture() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
-      try {
-        closingFuture.finishToValueAndCloser(
-            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    @Override
-    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
-      return finishToValueAndCloser(closingFuture).get();
-    }
-
-    @Override
-    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
-      assertThatFutureFailsWithException(closingFuture.statusFuture());
-      ValueAndCloser<?> valueAndCloser = finishToValueAndCloser(closingFuture);
-      try {
-        valueAndCloser.get();
-        fail();
-      } catch (ExecutionException expected) {
-        assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
-      }
-      valueAndCloser.closeAsync();
-    }
-
-    @Override
-    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
-      assertThatFutureBecomesCancelled(closingFuture.statusFuture());
-    }
-
-    @Override
-    void waitUntilClosed(ClosingFuture<?> closingFuture) {
-      if (valueAndCloser != null) {
-        valueAndCloser.closeAsync();
-      }
-      super.waitUntilClosed(closingFuture);
-    }
-
-    @Override
-    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
-      assertThat(closingFuture.cancel(false)).isTrue();
-      ValueAndCloser<?> unused = finishToValueAndCloser(closingFuture);
-      waitUntilClosed(closingFuture);
-      futureCancelled.countDown();
-    }
-
-    private <V> ValueAndCloser<V> finishToValueAndCloser(ClosingFuture<V> closingFuture) {
-      final CountDownLatch valueAndCloserSet = new CountDownLatch(1);
-      closingFuture.finishToValueAndCloser(
-          new ValueAndCloserConsumer<V>() {
-            @Override
-            public void accept(ValueAndCloser<V> valueAndCloser) {
-              FinishToValueAndCloserTest.this.valueAndCloser = valueAndCloser;
-              valueAndCloserSet.countDown();
-            }
-          },
-          finishToValueAndCloserExecutor);
-      assertWithMessage("valueAndCloser was set")
-          .that(awaitUninterruptibly(valueAndCloserSet, 10, SECONDS))
-          .isTrue();
-      @SuppressWarnings("unchecked")
-      ValueAndCloser<V> valueAndCloserWithType = (ValueAndCloser<V>) valueAndCloser;
-      return valueAndCloserWithType;
-    }
-  }
-
   void assertThatFutureFailsWithException(Future<?> future) {
     try {
       getUninterruptibly(future);
@@ -1822,7 +1637,7 @@
     }
   }
 
-  private static void assertThatFutureBecomesCancelled(Future<?> future) throws ExecutionException {
+  static void assertThatFutureBecomesCancelled(Future<?> future) throws ExecutionException {
     try {
       getUninterruptibly(future);
       fail("Expected future to be canceled: " + future);
@@ -1989,7 +1804,7 @@
     }
   }
 
-  private static final class NoOpValueAndCloserConsumer<V> implements ValueAndCloserConsumer<V> {
+  static final class NoOpValueAndCloserConsumer<V> implements ValueAndCloserConsumer<V> {
     @Override
     public void accept(ValueAndCloser<V> valueAndCloser) {}
   }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
index 557fc0b..9b3f0f8 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
@@ -68,7 +68,6 @@
         thrownByExecutionThread);
   }
 
-
   public void testServiceStartStop() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     assertFalse(service.startUpCalled);
@@ -85,7 +84,6 @@
     executionThread.join();
   }
 
-
   public void testServiceStopIdempotence() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
 
@@ -102,7 +100,6 @@
     executionThread.join();
   }
 
-
   public void testServiceExitingOnItsOwn() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     service.expectedShutdownState = Service.State.RUNNING;
@@ -173,7 +170,6 @@
     }
   }
 
-
   public void testServiceThrowOnStartUp() throws Exception {
     ThrowOnStartUpService service = new ThrowOnStartUpService();
     assertFalse(service.startUpCalled);
@@ -212,7 +208,6 @@
     }
   }
 
-
   public void testServiceThrowOnRun() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
 
@@ -229,7 +224,6 @@
     assertEquals(Service.State.FAILED, service.state());
   }
 
-
   public void testServiceThrowOnRunAndThenAgainOnShutDown() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
     service.throwOnShutDown = true;
@@ -271,7 +265,6 @@
     }
   }
 
-
   public void testServiceThrowOnShutDown() throws Exception {
     ThrowOnShutDown service = new ThrowOnShutDown();
 
@@ -331,7 +324,6 @@
     protected void run() throws Exception {}
   }
 
-
   public void testStopWhileStarting_runNotCalled() throws Exception {
     final CountDownLatch started = new CountDownLatch(1);
     FakeService service =
@@ -361,7 +353,6 @@
     assertEquals(0, service.shutdownCalled);
   }
 
-
   public void testDefaultService() throws InterruptedException {
     WaitOnRunService service = new WaitOnRunService();
     service.startAsync().awaitRunning();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureBenchmarks.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureBenchmarks.java
index bf70aac..ed5e6a9 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureBenchmarks.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureBenchmarks.java
@@ -25,7 +25,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.AbstractQueuedSynchronizer;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /** Utilities for the AbstractFutureBenchmarks */
 final class AbstractFutureBenchmarks {
@@ -218,7 +218,7 @@
      * @return true if the state was successfully changed.
      */
     @CanIgnoreReturnValue
-    protected boolean set(@NullableDecl V value) {
+    protected boolean set(@CheckForNull V value) {
       boolean result = sync.set(value);
       if (result) {
         executionList.execute();
@@ -360,7 +360,7 @@
       }
 
       /** Transition to the COMPLETED state and set the value. */
-      boolean set(@NullableDecl V v) {
+      boolean set(@CheckForNull V v) {
         return complete(v, null, COMPLETED);
       }
 
@@ -384,7 +384,7 @@
        * @param t the exception to set as the result of the computation.
        * @param finalState the state to transition to.
        */
-      private boolean complete(@NullableDecl V v, @NullableDecl Throwable t, int finalState) {
+      private boolean complete(@CheckForNull V v, @CheckForNull Throwable t, int finalState) {
         boolean doCompletion = compareAndSetState(RUNNING, COMPLETING);
         if (doCompletion) {
           // If this thread successfully transitioned to COMPLETING, set the value
@@ -406,7 +406,7 @@
     }
 
     static final CancellationException cancellationExceptionWithCause(
-        @NullableDecl String message, @NullableDecl Throwable cause) {
+        @CheckForNull String message, @CheckForNull Throwable cause) {
       CancellationException exception = new CancellationException(message);
       exception.initCause(cause);
       return exception;
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java
index 6c921b5..9aee780 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java
@@ -30,6 +30,7 @@
 import junit.framework.TestCase;
 
 /** Tests for {@link AbstractFuture} with the cancellation cause system property set */
+@AndroidIncompatible // custom classloading
 
 public class AbstractFutureCancellationCauseTest extends TestCase {
 
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
index e55a31e..dc020fb 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
@@ -52,7 +52,6 @@
  *
  * @author Brian Stoler
  */
-
 public class AbstractFutureTest extends TestCase {
   public void testSuccess() throws ExecutionException, InterruptedException {
     final Object value = new Object();
@@ -292,6 +291,7 @@
    * derived from observing how much time actually passed for various operations.
    */
   @SuppressWarnings({"DeprecatedThreadMethods", "ThreadPriorityCheck"})
+  @AndroidIncompatible // Thread.suspend
   public void testToString_delayedTimeout() throws Exception {
     TimedWaiterThread thread =
         new TimedWaiterThread(new AbstractFuture<Object>() {}, 2, TimeUnit.SECONDS);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
index 7cad8b0..2df5a4f 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
@@ -36,7 +36,6 @@
 
   // Functional tests using real thread. We only verify publicly visible state.
   // Interaction assertions are done by the single-threaded unit tests.
-
   public static class FunctionalTest extends TestCase {
 
     private static class DefaultService extends AbstractIdleService {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
index a2411ad..a05a838 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
@@ -19,6 +19,8 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.util.concurrent.AbstractScheduledService.Scheduler.newFixedDelaySchedule;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.util.concurrent.AbstractScheduledService.Cancellable;
@@ -47,10 +49,9 @@
  *
  * @author Luke Sandberg
  */
-
 public class AbstractScheduledServiceTest extends TestCase {
 
-  volatile Scheduler configuration = newFixedDelaySchedule(0, 10, TimeUnit.MILLISECONDS);
+  volatile Scheduler configuration = newFixedDelaySchedule(0, 10, MILLISECONDS);
   volatile ScheduledFuture<?> future = null;
 
   volatile boolean atFixedRateCalled = false;
@@ -113,7 +114,7 @@
       service.startAsync().awaitRunning();
       fail();
     } catch (IllegalStateException e) {
-      assertEquals(service.startUpException, e.getCause());
+      assertThat(e).hasCauseThat().isEqualTo(service.startUpException);
     }
     assertEquals(0, service.numberOfTimesRunCalled.get());
     assertEquals(Service.State.FAILED, service.state());
@@ -156,7 +157,7 @@
       service.awaitTerminated();
       fail();
     } catch (IllegalStateException e) {
-      assertEquals(service.shutDownException, e.getCause());
+      assertThat(e).hasCauseThat().isEqualTo(service.shutDownException);
     }
     assertEquals(Service.State.FAILED, service.state());
   }
@@ -208,7 +209,7 @@
 
           @Override
           protected Scheduler scheduler() {
-            return newFixedDelaySchedule(0, 1, TimeUnit.MILLISECONDS);
+            return newFixedDelaySchedule(0, 1, MILLISECONDS);
           }
         };
 
@@ -217,7 +218,7 @@
     service.awaitRunning();
     service.stopAsync();
     service.awaitTerminated();
-    assertTrue(executor.get().awaitTermination(100, TimeUnit.MILLISECONDS));
+    assertTrue(executor.get().awaitTermination(100, MILLISECONDS));
   }
 
   public void testDefaultExecutorIsShutdownWhenServiceFails() throws Exception {
@@ -240,7 +241,7 @@
 
           @Override
           protected Scheduler scheduler() {
-            return newFixedDelaySchedule(0, 1, TimeUnit.MILLISECONDS);
+            return newFixedDelaySchedule(0, 1, MILLISECONDS);
           }
         };
 
@@ -250,7 +251,7 @@
     } catch (IllegalStateException expected) {
     }
 
-    assertTrue(executor.get().awaitTermination(100, TimeUnit.MILLISECONDS));
+    assertTrue(executor.get().awaitTermination(100, MILLISECONDS));
   }
 
   public void testSchedulerOnlyCalledOnce() throws Exception {
@@ -277,7 +278,7 @@
         new AbstractScheduledService() {
           @Override
           protected Scheduler scheduler() {
-            return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.NANOSECONDS);
+            return Scheduler.newFixedDelaySchedule(0, 1, NANOSECONDS);
           }
 
           @Override
@@ -294,7 +295,7 @@
           }
         };
     try {
-      service.startAsync().awaitRunning(1, TimeUnit.MILLISECONDS);
+      service.startAsync().awaitRunning(1, MILLISECONDS);
       fail("Expected timeout");
     } catch (TimeoutException e) {
       assertThat(e)
@@ -366,9 +367,9 @@
   public static class SchedulerTest extends TestCase {
     // These constants are arbitrary and just used to make sure that the correct method is called
     // with the correct parameters.
-    private static final int initialDelay = 10;
-    private static final int delay = 20;
-    private static final TimeUnit unit = TimeUnit.MILLISECONDS;
+    private static final int INITIAL_DELAY = 10;
+    private static final int DELAY = 20;
+    private static final TimeUnit UNIT = MILLISECONDS;
 
     // Unique runnable object used for comparison.
     final Runnable testRunnable =
@@ -382,14 +383,14 @@
         Runnable command, long initialDelay, long delay, TimeUnit unit) {
       assertFalse(called); // only called once.
       called = true;
-      assertEquals(SchedulerTest.initialDelay, initialDelay);
-      assertEquals(SchedulerTest.delay, delay);
-      assertEquals(SchedulerTest.unit, unit);
+      assertEquals(INITIAL_DELAY, initialDelay);
+      assertEquals(DELAY, delay);
+      assertEquals(UNIT, unit);
       assertEquals(testRunnable, command);
     }
 
     public void testFixedRateSchedule() {
-      Scheduler schedule = Scheduler.newFixedRateSchedule(initialDelay, delay, unit);
+      Scheduler schedule = Scheduler.newFixedRateSchedule(INITIAL_DELAY, DELAY, UNIT);
       Cancellable unused =
           schedule.schedule(
               null,
@@ -397,7 +398,7 @@
                 @Override
                 public ScheduledFuture<?> scheduleAtFixedRate(
                     Runnable command, long initialDelay, long period, TimeUnit unit) {
-                  assertSingleCallWithCorrectParameters(command, initialDelay, delay, unit);
+                  assertSingleCallWithCorrectParameters(command, initialDelay, period, unit);
                   return new ThrowingScheduledFuture<>();
                 }
               },
@@ -406,7 +407,7 @@
     }
 
     public void testFixedDelaySchedule() {
-      Scheduler schedule = newFixedDelaySchedule(initialDelay, delay, unit);
+      Scheduler schedule = newFixedDelaySchedule(INITIAL_DELAY, DELAY, UNIT);
       Cancellable unused =
           schedule.schedule(
               null,
@@ -440,7 +441,6 @@
       }
     }
 
-
     public void testFixedDelayScheduleFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -461,7 +461,6 @@
       service.awaitTerminated();
     }
 
-
     public void testCustomSchedulerFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -487,17 +486,16 @@
       service.awaitTerminated();
     }
 
-    private class TestCustomScheduler extends AbstractScheduledService.CustomScheduler {
+    private static class TestCustomScheduler extends AbstractScheduledService.CustomScheduler {
       public AtomicInteger scheduleCounter = new AtomicInteger(0);
 
       @Override
       protected Schedule getNextSchedule() throws Exception {
         scheduleCounter.incrementAndGet();
-        return new Schedule(0, TimeUnit.SECONDS);
+        return new Schedule(0, SECONDS);
       }
     }
 
-
     public void testCustomSchedule_startStop() throws Exception {
       final CyclicBarrier firstBarrier = new CyclicBarrier(2);
       final CyclicBarrier secondBarrier = new CyclicBarrier(2);
@@ -528,7 +526,6 @@
       future.cancel(false);
     }
 
-
     public void testCustomSchedulerServiceStop() throws Exception {
       TestAbstractScheduledCustomService service = new TestAbstractScheduledCustomService();
       service.startAsync().awaitRunning();
@@ -538,11 +535,10 @@
       service.secondBarrier.await();
       service.awaitTerminated();
       // Sleep for a while just to ensure that our task wasn't called again.
-      Thread.sleep(unit.toMillis(3 * delay));
+      Thread.sleep(UNIT.toMillis(3 * DELAY));
       assertEquals(1, service.numIterations.get());
     }
 
-
     public void testCustomScheduler_deadlock() throws InterruptedException, BrokenBarrierException {
       final CyclicBarrier inGetNextSchedule = new CyclicBarrier(2);
       // This will flakily deadlock, so run it multiple times to increase the flake likelihood
@@ -562,7 +558,7 @@
                       Thread.yield();
                       throw new RuntimeException("boom");
                     }
-                    return new Schedule(0, TimeUnit.NANOSECONDS);
+                    return new Schedule(0, NANOSECONDS);
                   }
                 };
               }
@@ -573,7 +569,6 @@
       }
     }
 
-
     public void testBig() throws Exception {
       TestAbstractScheduledCustomService service =
           new TestAbstractScheduledCustomService() {
@@ -584,7 +579,7 @@
                 protected Schedule getNextSchedule() throws Exception {
                   // Explicitly yield to increase the probability of a pathological scheduling.
                   Thread.yield();
-                  return new Schedule(0, TimeUnit.SECONDS);
+                  return new Schedule(0, SECONDS);
                 }
               };
             }
@@ -627,13 +622,12 @@
         return new CustomScheduler() {
           @Override
           protected Schedule getNextSchedule() throws Exception {
-            return new Schedule(delay, unit);
+            return new Schedule(DELAY, UNIT);
           }
         };
       }
     }
 
-
     public void testCustomSchedulerFailure() throws Exception {
       TestFailingCustomScheduledService service = new TestFailingCustomScheduledService();
       service.startAsync().awaitRunning();
@@ -644,7 +638,7 @@
       }
       Thread.sleep(1000);
       try {
-        service.stopAsync().awaitTerminated(100, TimeUnit.SECONDS);
+        service.stopAsync().awaitTerminated(100, SECONDS);
         fail();
       } catch (IllegalStateException e) {
         assertEquals(State.FAILED, service.state());
@@ -677,7 +671,7 @@
             if (numIterations.get() > 2) {
               throw new IllegalStateException("Failed");
             }
-            return new Schedule(delay, unit);
+            return new Schedule(DELAY, UNIT);
           }
         };
       }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
index e3c22a8..5f42106 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
@@ -330,7 +330,6 @@
     }
   }
 
-
   public void testAwaitTerminated() throws Exception {
     final NoOpService service = new NoOpService();
     Thread waiter =
@@ -348,7 +347,6 @@
     assertFalse(waiter.isAlive());
   }
 
-
   public void testAwaitTerminated_FailedService() throws Exception {
     final ManualSwitchedService service = new ManualSwitchedService();
     final AtomicReference<Throwable> exception = Atomics.newReference();
@@ -376,7 +374,6 @@
     assertThat(exception.get()).hasCauseThat().isEqualTo(EXCEPTION);
   }
 
-
   public void testThreadedServiceStartAndWaitStopAndWait() throws Throwable {
     ThreadedService service = new ThreadedService();
     RecordingListener listener = RecordingListener.record(service);
@@ -394,7 +391,6 @@
         listener.getStateHistory());
   }
 
-
   public void testThreadedServiceStopIdempotence() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -410,7 +406,6 @@
     throwIfSet(thrownByExecutionThread);
   }
 
-
   public void testThreadedServiceStopIdempotenceAfterWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -428,7 +423,6 @@
     throwIfSet(thrownByExecutionThread);
   }
 
-
   public void testThreadedServiceStopIdempotenceDoubleWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -661,7 +655,6 @@
     }
   }
 
-
   public void testAddListenerAfterFailureDoesntCauseDeadlock() throws InterruptedException {
     final StartFailingService service = new StartFailingService();
     service.startAsync();
@@ -681,7 +674,6 @@
     assertFalse(thread + " is deadlocked", thread.isAlive());
   }
 
-
   public void testListenerDoesntDeadlockOnStartAndWaitFromRunning() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
@@ -696,7 +688,6 @@
     service.stopAsync();
   }
 
-
   public void testListenerDoesntDeadlockOnStopAndWaitFromTerminated() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java
index 70c186d..5bb1cb7 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java
@@ -181,7 +181,6 @@
   }
 
   /** compareAndSet in one thread enables another waiting for value to succeed */
-
   public void testCompareAndSetInMultipleThreads() throws InterruptedException {
     final AtomicDoubleArray a = new AtomicDoubleArray(1);
     a.set(0, 1.0);
@@ -294,7 +293,6 @@
    * Multiple threads using same array of counters successfully update a number of times equal to
    * total count
    */
-
   public void testCountingInMultipleThreads() throws InterruptedException {
     final AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
     for (int i = 0; i < SIZE; i++) {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
index fe68e00..fc06fd4 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
@@ -13,7 +13,6 @@
 
 package com.google.common.util.concurrent;
 
-
 /** Unit test for {@link AtomicDouble}. */
 public class AtomicDoubleTest extends JSR166TestCase {
 
@@ -97,7 +96,6 @@
   }
 
   /** compareAndSet in one thread enables another waiting for value to succeed */
-
   public void testCompareAndSetInMultipleThreads() throws Exception {
     final AtomicDouble at = new AtomicDouble(1.0);
     Thread t =
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
index 4765825..b1e741a 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
@@ -16,13 +16,15 @@
 
 package com.google.common.util.concurrent;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
+
 import com.google.common.annotations.GwtIncompatible;
+import java.util.ArrayList;
 import java.util.Random;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
 import junit.framework.TestCase;
 
 /**
@@ -31,29 +33,27 @@
  * @author mike nonemacher
  */
 @GwtIncompatible // threads
-
 public class AtomicLongMapBasherTest extends TestCase {
   private final Random random = new Random(301);
 
-  public void testModify_basher() throws InterruptedException {
+  public void testModify_basher() throws Exception {
     int nTasks = 3000;
     int nThreads = 100;
     final int getsPerTask = 1000;
     final int deltaRange = 10000;
     final String key = "key";
 
-    final AtomicLong sum = new AtomicLong();
     final AtomicLongMap<String> map = AtomicLongMap.create();
 
     ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
+    ArrayList<Future<Long>> futures = new ArrayList<>();
     for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
-      Future<?> possiblyIgnoredError =
+      futures.add(
           threadPool.submit(
-              new Runnable() {
+              new Callable<Long>() {
                 @Override
-                public void run() {
-                  int threadSum = 0;
+                public Long call() {
+                  long threadSum = 0;
                   for (int j = 0; j < getsPerTask; j++) {
                     long delta = random.nextInt(deltaRange);
                     int behavior = random.nextInt(10);
@@ -106,14 +106,16 @@
                         throw new AssertionError();
                     }
                   }
-                  sum.addAndGet(threadSum);
+                  return threadSum;
                 }
-              });
+              }));
     }
-
     threadPool.shutdown();
-    assertTrue(threadPool.awaitTermination(300, TimeUnit.SECONDS));
-
-    assertEquals(sum.get(), map.get(key));
+    assertTrue(threadPool.awaitTermination(300, SECONDS));
+    long sum = 0;
+    for (Future<Long> f : futures) {
+      sum += f.get();
+    }
+    assertEquals(sum, map.get(key));
   }
 }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
index 587a4ec..878ea5e 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
@@ -52,7 +52,7 @@
     Map<String, Long> in = ImmutableMap.of("1", 1L, "2", 2L, "3", 3L);
     AtomicLongMap<String> map = AtomicLongMap.create(in);
     assertFalse(map.isEmpty());
-    assertSame(3, map.size());
+    assertEquals(3, map.size());
     assertTrue(map.containsKey("1"));
     assertTrue(map.containsKey("2"));
     assertTrue(map.containsKey("3"));
@@ -302,7 +302,7 @@
     Map<String, Long> in = ImmutableMap.of("1", 1L, "2", 2L, "3", 3L);
     AtomicLongMap<String> map = AtomicLongMap.create();
     assertTrue(map.isEmpty());
-    assertSame(0, map.size());
+    assertEquals(0, map.size());
     assertFalse(map.containsKey("1"));
     assertFalse(map.containsKey("2"));
     assertFalse(map.containsKey("3"));
@@ -312,7 +312,7 @@
 
     map.putAll(in);
     assertFalse(map.isEmpty());
-    assertSame(3, map.size());
+    assertEquals(3, map.size());
     assertTrue(map.containsKey("1"));
     assertTrue(map.containsKey("2"));
     assertTrue(map.containsKey("3"));
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToFutureTest.java
new file mode 100644
index 0000000..79288eb
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToFutureTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2017 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.util.concurrent;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+
+import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
+import com.google.common.util.concurrent.ClosingFuture.DeferredCloser;
+import java.io.Closeable;
+import java.util.concurrent.ExecutionException;
+
+/** Tests for {@link ClosingFuture} that exercise {@link ClosingFuture#finishToFuture()}. */
+public class ClosingFutureFinishToFutureTest extends AbstractClosingFutureTest {
+  public void testFinishToFuture_throwsIfCalledTwice() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+    try {
+      FluentFuture<Closeable> unused2 = closingFuture.finishToFuture();
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testFinishToFuture_throwsAfterCallingFinishToValueAndCloser() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), directExecutor());
+    try {
+      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testFinishToFuture_preventsFurtherDerivation() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    FluentFuture<String> unused = closingFuture.finishToFuture();
+    assertDerivingThrowsIllegalStateException(closingFuture);
+  }
+
+  @Override
+  <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+    return getUninterruptibly(closingFuture.finishToFuture());
+  }
+
+  @Override
+  void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+    assertThatFutureFailsWithException(closingFuture.finishToFuture());
+  }
+
+  @Override
+  void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+    assertThatFutureBecomesCancelled(closingFuture.finishToFuture());
+  }
+
+  @Override
+  void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+    assertThat(closingFuture.finishToFuture().cancel(false)).isTrue();
+    waitUntilClosed(closingFuture);
+    futureCancelled.countDown();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToValueAndCloserTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToValueAndCloserTest.java
new file mode 100644
index 0000000..ac3cf55
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToValueAndCloserTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2017 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.util.concurrent;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.util.concurrent.MoreExecutors.shutdownAndAwaitTermination;
+import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
+import com.google.common.util.concurrent.ClosingFuture.DeferredCloser;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloser;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloserConsumer;
+import java.io.Closeable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Tests for {@link ClosingFuture} that exercise {@link
+ * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)}.
+ */
+public class ClosingFutureFinishToValueAndCloserTest extends AbstractClosingFutureTest {
+  private final ExecutorService finishToValueAndCloserExecutor = newSingleThreadExecutor();
+  private volatile ValueAndCloser<?> valueAndCloser;
+
+  @Override
+  protected void tearDown() throws Exception {
+    super.tearDown();
+    assertWithMessage("finishToValueAndCloserExecutor was shut down")
+        .that(shutdownAndAwaitTermination(finishToValueAndCloserExecutor, 10, SECONDS))
+        .isTrue();
+  }
+
+  public void testFinishToValueAndCloser_throwsIfCalledTwice() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    closingFuture.finishToValueAndCloser(
+        new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+    try {
+      closingFuture.finishToValueAndCloser(
+          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testFinishToValueAndCloser_throwsAfterCallingFinishToFuture() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+    try {
+      closingFuture.finishToValueAndCloser(
+          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  @Override
+  <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+    return finishToValueAndCloser(closingFuture).get();
+  }
+
+  @Override
+  void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+    assertThatFutureFailsWithException(closingFuture.statusFuture());
+    ValueAndCloser<?> valueAndCloser = finishToValueAndCloser(closingFuture);
+    try {
+      valueAndCloser.get();
+      fail();
+    } catch (ExecutionException expected) {
+      assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+    }
+    valueAndCloser.closeAsync();
+  }
+
+  @Override
+  void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+    assertThatFutureBecomesCancelled(closingFuture.statusFuture());
+  }
+
+  @Override
+  void waitUntilClosed(ClosingFuture<?> closingFuture) {
+    if (valueAndCloser != null) {
+      valueAndCloser.closeAsync();
+    }
+    super.waitUntilClosed(closingFuture);
+  }
+
+  @Override
+  void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+    assertThat(closingFuture.cancel(false)).isTrue();
+    ValueAndCloser<?> unused = finishToValueAndCloser(closingFuture);
+    waitUntilClosed(closingFuture);
+    futureCancelled.countDown();
+  }
+
+  private <V> ValueAndCloser<V> finishToValueAndCloser(ClosingFuture<V> closingFuture) {
+    final CountDownLatch valueAndCloserSet = new CountDownLatch(1);
+    closingFuture.finishToValueAndCloser(
+        new ValueAndCloserConsumer<V>() {
+          @Override
+          public void accept(ValueAndCloser<V> valueAndCloser) {
+            ClosingFutureFinishToValueAndCloserTest.this.valueAndCloser = valueAndCloser;
+            valueAndCloserSet.countDown();
+          }
+        },
+        finishToValueAndCloserExecutor);
+    assertWithMessage("valueAndCloser was set")
+        .that(awaitUninterruptibly(valueAndCloserSet, 10, SECONDS))
+        .isTrue();
+    @SuppressWarnings("unchecked")
+    ValueAndCloser<V> valueAndCloserWithType = (ValueAndCloser<V>) valueAndCloser;
+    return valueAndCloserWithType;
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java b/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
index 18e69b1..2b1dd2f 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
@@ -442,7 +442,6 @@
     lockD.lock();
   }
 
-
   public void testReentrantLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(lockA);
     thread.start();
@@ -454,7 +453,6 @@
     assertTrue(lockA.tryLock());
   }
 
-
   public void testReentrantWriteLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(writeLockA);
     thread.start();
@@ -468,7 +466,6 @@
     assertTrue(readLockA.tryLock());
   }
 
-
   public void testReentrantReadLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(readLockA);
     thread.start();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
index 5bd3cf7..34678ed 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
@@ -36,7 +36,6 @@
 
   private final ExecutionList list = new ExecutionList();
 
-
   public void testRunOnPopulatedList() throws Exception {
     Executor exec = Executors.newCachedThreadPool();
     CountDownLatch countDownLatch = new CountDownLatch(3);
@@ -67,7 +66,6 @@
     assertEquals(1, runCalled.get());
   }
 
-
   public void testExecute_idempotentConcurrently() throws InterruptedException {
     final CountDownLatch okayToRun = new CountDownLatch(1);
     final AtomicInteger runCalled = new AtomicInteger();
@@ -103,7 +101,6 @@
     assertEquals(1, runCalled.get());
   }
 
-
   public void testAddAfterRun() throws Exception {
     // Run the previous test
     testRunOnPopulatedList();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
index 1c03f5a..068287c 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
@@ -88,7 +88,6 @@
     assertThat(thirdCallable.called).isTrue();
   }
 
-
   public void testCancellationMultipleThreads() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> unused = serializer.submit(blockingCallable, executor);
@@ -116,7 +115,6 @@
     assertThat(getDone(future2)).isFalse();
   }
 
-
   public void testSecondTaskWaitsForFirstEvenIfCancelled() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> future1 = serializer.submit(blockingCallable, executor);
@@ -327,7 +325,6 @@
   private static final int DIRECT_EXECUTIONS_PER_THREAD = 100;
 
   @GwtIncompatible // threads
-
   public void testAvoidsStackOverflow_multipleThreads() throws Exception {
     final LongHolder holder = new LongHolder();
     final ArrayList<ListenableFuture<Integer>> lengthChecks = new ArrayList<>();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
index cc4751d..ab53f53 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
@@ -132,7 +132,6 @@
     assertThat(f.get()).isEqualTo(2);
   }
 
-
   @GwtIncompatible // withTimeout
   public void testWithTimeout() throws Exception {
     ScheduledExecutorService executor = newScheduledThreadPool(1);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FutureCallbackTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FutureCallbackTest.java
index 4febc5a..5a1464d 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FutureCallbackTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FutureCallbackTest.java
@@ -24,8 +24,8 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.Executor;
+import javax.annotation.CheckForNull;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 import org.mockito.Mockito;
 
 /**
@@ -157,8 +157,8 @@
   }
 
   private final class MockCallback implements FutureCallback<String> {
-    @NullableDecl private String value = null;
-    @NullableDecl private Throwable failure = null;
+    @CheckForNull private String value = null;
+    @CheckForNull private Throwable failure = null;
     private boolean wasCalled = false;
 
     MockCallback(String expectedValue) {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
index 3bc69bd..666a189 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
@@ -353,7 +353,7 @@
 
   public static final class WillBeUnloadedException extends Exception {}
 
-
+  @AndroidIncompatible // "Parent ClassLoader may not be null"; maybe avoidable if we try?
   public void testGetChecked_classUnloading() throws Exception {
     WeakReference<?> classUsedByGetChecked = doTestClassUnloading();
     GcFinalization.awaitClear(classUsedByGetChecked);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
index fa3b14a..6fa2a32 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
@@ -53,6 +53,7 @@
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.annotations.GwtCompatible;
@@ -87,9 +88,9 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Unit tests for {@link Futures}.
@@ -410,7 +411,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testTransformAsync_interruptPropagatesToTransformingThread() throws Exception {
     SettableFuture<String> input = SettableFuture.create();
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -803,7 +803,6 @@
   }
 
   @GwtIncompatible // Threads
-
   public void testTransformAsync_functionToString() throws Exception {
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
@@ -1132,7 +1131,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testCatchingAsync_interruptPropagatesToTransformingThread() throws Exception {
     SettableFuture<String> input = SettableFuture.create();
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -1172,7 +1170,6 @@
   }
 
   @GwtIncompatible // Threads
-
   public void testCatchingAsync_functionToString() throws Exception {
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
@@ -1749,7 +1746,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testTransformAsync_asyncFunction_cancelledWhileApplyingFunction()
       throws InterruptedException, ExecutionException {
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -1784,7 +1780,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testTransformAsync_asyncFunction_cancelledBeforeApplyingFunction()
       throws InterruptedException {
     final AtomicBoolean functionCalled = new AtomicBoolean();
@@ -1858,7 +1853,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testSubmitAsync_asyncCallable_cancelledWhileApplyingFunction()
       throws InterruptedException, ExecutionException {
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -1892,7 +1886,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testSubmitAsync_asyncCallable_cancelledBeforeApplyingFunction()
       throws InterruptedException {
     final AtomicBoolean callableCalled = new AtomicBoolean();
@@ -1926,7 +1919,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testSubmitAsync_asyncCallable_returnsInterruptedFuture() throws InterruptedException {
     assertThat(Thread.interrupted()).isFalse();
     SettableFuture<Integer> cancelledFuture = SettableFuture.create();
@@ -2015,7 +2007,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_error() throws InterruptedException {
     final Error error = new Error("deliberate");
     AsyncCallable<Integer> callable =
@@ -2037,14 +2028,10 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_nullInsteadOfFuture() throws Exception {
     ListenableFuture<?> chainedFuture =
         scheduleAsync(
-            constantAsyncCallable(null),
-            1,
-            TimeUnit.NANOSECONDS,
-            newSingleThreadScheduledExecutor());
+            constantAsyncCallable(null), 1, NANOSECONDS, newSingleThreadScheduledExecutor());
     try {
       chainedFuture.get();
       fail();
@@ -2059,7 +2046,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_cancelledWhileApplyingFunction()
       throws InterruptedException, ExecutionException {
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -2075,7 +2061,7 @@
           }
         };
     ListenableFuture<Integer> future =
-        scheduleAsync(callable, 1, TimeUnit.NANOSECONDS, newSingleThreadScheduledExecutor());
+        scheduleAsync(callable, 1, NANOSECONDS, newSingleThreadScheduledExecutor());
     inFunction.await();
     future.cancel(false);
     callableDone.countDown();
@@ -2092,7 +2078,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_cancelledBeforeCallingFunction()
       throws InterruptedException {
     final AtomicBoolean callableCalled = new AtomicBoolean();
@@ -2114,7 +2099,7 @@
             awaitUninterruptibly(beforeFunction);
           }
         });
-    ListenableFuture<Integer> future = scheduleAsync(callable, 1, TimeUnit.NANOSECONDS, executor);
+    ListenableFuture<Integer> future = scheduleAsync(callable, 1, NANOSECONDS, executor);
     future.cancel(false);
 
     // Unpause the executor.
@@ -2547,7 +2532,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_noLeakInterruption() throws Exception {
     final SettableFuture<String> stringFuture = SettableFuture.create();
     AsyncCallable<String> combiner =
@@ -2591,7 +2575,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_asyncResult() throws Exception {
     SettableFuture<Integer> futureInteger = SettableFuture.create();
     SettableFuture<Boolean> futureBoolean = SettableFuture.create();
@@ -2683,7 +2666,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_cancelledNotInterrupted() throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
     SettableFuture<Boolean> booleanFuture = SettableFuture.create();
@@ -2722,7 +2704,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_interrupted() throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
     SettableFuture<Boolean> booleanFuture = SettableFuture.create();
@@ -2815,7 +2796,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllCompleteRunnable_resultCanceledWithoutInterrupt_doesNotInterruptRunnable()
       throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
@@ -2856,7 +2836,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllCompleteRunnable_resultCanceledWithInterrupt_InterruptsRunnable()
       throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
@@ -3375,13 +3354,11 @@
         : pseudoTimedGetUninterruptibly(future, 2500, MILLISECONDS);
   }
 
-
   @GwtIncompatible // threads
   public void testAllAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.allMerger);
   }
 
-
   @GwtIncompatible // threads
   public void testSuccessfulAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.successMerger);
@@ -3700,7 +3677,7 @@
   @GwtIncompatible // used only in GwtIncompatible tests
   private static class TestException extends Exception {
 
-    TestException(@NullableDecl Throwable cause) {
+    TestException(@CheckForNull Throwable cause) {
       super(cause);
     }
   }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
index d0fcee2..2499020 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
@@ -131,7 +131,6 @@
     }
   }
 
-
   public void testFutureCancellableBeforeFunctionCompletion() throws Exception {
     // Set the result in a separate thread since this test runs the function
     // (which will block) in the same thread.
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
index 872197b..adeb2d1 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
@@ -43,7 +43,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class GeneratedMonitorTest extends TestCase {
 
   public static TestSuite suite() {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
index 4d7a45f..bb3b43b 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
@@ -22,7 +22,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class InterruptibleMonitorTest extends MonitorTestCase {
 
   public InterruptibleMonitorTest() {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
index afa7eae..fcfe744 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
@@ -25,7 +25,6 @@
 import java.util.concurrent.locks.LockSupport;
 import junit.framework.TestCase;
 
-
 public final class InterruptibleTaskTest extends TestCase {
 
   // Regression test for a deadlock where a task could be stuck busy waiting for the task to
@@ -91,6 +90,14 @@
    * protect ourselves from that we want to make sure that tasks don't spin too much waiting for the
    * interrupting thread to complete the protocol.
    */
+  /*
+   * This test hangs (or maybe is just *very* slow) under Android.
+   *
+   * TODO(b/218700094): Ideally, get this to pass under Android. Failing that, convince ourselves
+   * that the test isn't exposing a real problem with InterruptibleTask, one that could matter in
+   * prod.
+   */
+  @AndroidIncompatible
   public void testInterruptIsSlow() throws Exception {
     final CountDownLatch isInterruptibleRegistered = new CountDownLatch(1);
     final SlowChannel slowChannel = new SlowChannel();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java b/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
index 3bb819a..741ff45 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
@@ -100,7 +100,6 @@
     assertTrue(listenableFuture.isDone());
   }
 
-
   public void testListenInPoolThreadUsesGivenExecutor() throws Exception {
     ExecutorService executorService =
         newCachedThreadPool(new ThreadFactoryBuilder().setDaemon(true).build());
@@ -125,7 +124,6 @@
     assertTrue(listenableFuture.isDone());
   }
 
-
   public void testListenInPoolThreadCustomExecutorInterrupted() throws Exception {
     final CountDownLatch submitSuccessful = new CountDownLatch(1);
     ExecutorService executorService =
@@ -235,7 +233,6 @@
     }
   }
 
-
   @SuppressWarnings("IsInstanceIncompatibleType") // intentional.
   public void testListenInPoolThreadRunsListenerAfterRuntimeException() throws Exception {
     RuntimeExceptionThrowingFuture<String> input = new RuntimeExceptionThrowingFuture<>();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
index 8969a75..fd51a73 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
@@ -80,7 +80,6 @@
     super.tearDown();
   }
 
-
   public void testListenerDoesNotRunUntilTaskCompletes() throws Exception {
 
     // Test default state of not started.
@@ -106,7 +105,6 @@
     assertFalse(task.isCancelled());
   }
 
-
   public void testListenerCalledOnException() throws Exception {
     throwException = true;
 
@@ -142,7 +140,6 @@
     assertEquals(1, runLatch.getCount());
   }
 
-
   public void testListenerCalledOnCancelFromRunning() throws Exception {
     exec.execute(task);
     runLatch.await();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTester.java b/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTester.java
index 2dcccdb..575ed06 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTester.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTester.java
@@ -29,7 +29,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Used to test listenable future implementations.
@@ -67,7 +67,7 @@
     exec.shutdown();
   }
 
-  public void testCompletedFuture(@NullableDecl Object expectedValue)
+  public void testCompletedFuture(@CheckForNull Object expectedValue)
       throws InterruptedException, ExecutionException {
     assertTrue(future.isDone());
     assertFalse(future.isCancelled());
@@ -94,7 +94,7 @@
     }
   }
 
-  public void testFailedFuture(@NullableDecl String message) throws InterruptedException {
+  public void testFailedFuture(@CheckForNull String message) throws InterruptedException {
     assertTrue(future.isDone());
     assertFalse(future.isCancelled());
 
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
index 5fd9b95..e0eb32e 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
@@ -129,7 +129,6 @@
         logHandler.getStoredLogRecords().get(0).getMessage());
   }
 
-
   public void testEnqueueAndDispatch_multithreaded() throws InterruptedException {
     Object listener = new Object();
     ExecutorService service = Executors.newFixedThreadPool(4);
@@ -153,7 +152,6 @@
     }
   }
 
-
   public void testEnqueueAndDispatch_multithreaded_withThrowingRunnable()
       throws InterruptedException {
     Object listener = new Object();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java b/android/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java
index 6d620ff..e355d35 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java
@@ -26,7 +26,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public abstract class MonitorTestCase extends TestCase {
 
   public class TestGuard extends Monitor.Guard {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java b/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
index fe4e7f5..aac6173 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
@@ -88,7 +88,6 @@
         public void run() {}
       };
 
-
   public void testDirectExecutorServiceServiceInThreadExecution() throws Exception {
     final ListeningExecutorService executor = newDirectExecutorService();
     final ThreadLocal<Integer> threadLocalCount =
@@ -168,7 +167,6 @@
     assertEquals(10, threadLocalCount.get().intValue());
   }
 
-
   public void testDirectExecutorServiceServiceTermination() throws Exception {
     final ExecutorService executor = newDirectExecutorService();
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -259,7 +257,6 @@
    * Test for a bug where threads weren't getting signaled when shutdown was called, only when tasks
    * completed.
    */
-
   public void testDirectExecutorService_awaitTermination_missedSignal() {
     final ExecutorService service = MoreExecutors.newDirectExecutorService();
     Thread waiter =
@@ -342,6 +339,7 @@
      */
   }
 
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testListeningDecorator_noWrapExecuteTask() {
     ExecutorService delegate = mock(ExecutorService.class);
     ListeningExecutorService service = listeningDecorator(delegate);
@@ -354,7 +352,6 @@
     verify(delegate).execute(task);
   }
 
-
   public void testListeningDecorator_scheduleSuccess() throws Exception {
     final CountDownLatch completed = new CountDownLatch(1);
     ScheduledThreadPoolExecutor delegate =
@@ -380,7 +377,6 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
-
   public void testListeningDecorator_scheduleFailure() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -391,7 +387,6 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
-
   public void testListeningDecorator_schedulePeriodic() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -412,7 +407,6 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
-
   public void testListeningDecorator_cancelled() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     BlockingQueue<?> delegateQueue = delegate.getQueue();
@@ -566,7 +560,7 @@
     }
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testAddDelayedShutdownHook_success() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -578,7 +572,7 @@
     shutdownFirst.verify(service).awaitTermination(2, TimeUnit.SECONDS);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testAddDelayedShutdownHook_interrupted() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -588,7 +582,6 @@
     verify(service).shutdown();
   }
 
-
   public void testGetExitingExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor =
@@ -597,7 +590,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetExitingExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -607,7 +600,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetExitingExecutorService_shutdownHookRegistered() throws InterruptedException {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -618,7 +611,6 @@
     verify(executor).shutdown();
   }
 
-
   public void testGetExitingScheduledExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
@@ -626,7 +618,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetExitingScheduledExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = mock(ScheduledThreadPoolExecutor.class);
@@ -636,7 +628,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetScheduledExitingExecutorService_shutdownHookRegistered()
       throws InterruptedException {
     TestApplication application = new TestApplication();
@@ -669,7 +661,6 @@
     assertEquals(oldName, Thread.currentThread().getName());
   }
 
-
   public void testExecutors_nullCheck() throws Exception {
     new ClassSanityTester()
         .setDefault(RateLimiter.class, RateLimiter.create(1.0))
@@ -699,14 +690,13 @@
   /* Half of a 1-second timeout in nanoseconds */
   private static final long HALF_SECOND_NANOS = NANOSECONDS.convert(1L, SECONDS) / 2;
 
-
   public void testShutdownAndAwaitTermination_immediateShutdown() throws Exception {
     ExecutorService service = Executors.newSingleThreadExecutor();
     assertTrue(shutdownAndAwaitTermination(service, 1L, SECONDS));
     assertTrue(service.isTerminated());
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_immediateShutdownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS)).thenReturn(true);
@@ -716,7 +706,7 @@
     verify(service).awaitTermination(HALF_SECOND_NANOS, NANOSECONDS);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_forcedShutDownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -729,7 +719,7 @@
     verify(service).shutdownNow();
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_nonTerminationInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -741,7 +731,7 @@
     verify(service).shutdownNow();
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_interruptedInternal() throws Exception {
     final ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
index 20209e8..80e7ab2 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
@@ -274,7 +274,14 @@
     assertEquals(1, numCalls.get());
   }
 
-
+  /*
+   * Under Android, MyError propagates up and fails the test?
+   *
+   * TODO(b/218700094): Does this matter to prod users, or is it just a feature of our testing
+   * environment? If the latter, maybe write a custom Executor that avoids failing the test when it
+   * sees an Error?
+   */
+  @AndroidIncompatible
   public void testTaskThrowsError() throws Exception {
     class MyError extends Error {}
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -313,7 +320,6 @@
     }
   }
 
-
   public void testRejectedExecutionThrownWithMultipleCalls() throws Exception {
     final CountDownLatch latch = new CountDownLatch(1);
     final SettableFuture<?> future = SettableFuture.create();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
index 20ed3de..7db6b06 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
@@ -119,7 +119,6 @@
     }
   }
 
-
   public void testServiceStartupTimes() {
     Service a = new NoOpDelayedService(150);
     Service b = new NoOpDelayedService(353);
@@ -131,7 +130,6 @@
     assertThat(startupTimes.get(b)).isAtLeast(353);
   }
 
-
   public void testServiceStartupTimes_selfStartingServices() {
     // This tests to ensure that:
     // 1. service times are accurate when the service is started by the manager
@@ -166,7 +164,6 @@
     assertThat(startupTimes.get(b)).isNotNull();
   }
 
-
   public void testServiceStartStop() {
     Service a = new NoOpService();
     Service b = new NoOpService();
@@ -188,7 +185,6 @@
     assertTrue(listener.failedServices.isEmpty());
   }
 
-
   public void testFailStart() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStartService();
@@ -216,7 +212,6 @@
     assertTrue(listener.stoppedCalled);
   }
 
-
   public void testFailRun() throws Exception {
     Service a = new NoOpService();
     Service b = new FailRunService();
@@ -239,7 +234,6 @@
     assertTrue(listener.stoppedCalled);
   }
 
-
   public void testFailStop() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStopService();
@@ -268,7 +262,6 @@
     assertThat(toString).contains("FailStartService");
   }
 
-
   public void testTimeouts() throws Exception {
     Service a = new NoOpDelayedService(50);
     ServiceManager manager = new ServiceManager(asList(a));
@@ -445,7 +438,6 @@
    * Tests that a ServiceManager can be fully shut down if one of its failure listeners is slow or
    * even permanently blocked.
    */
-
   public void testListenerDeadlock() throws InterruptedException {
     final CountDownLatch failEnter = new CountDownLatch(1);
     final CountDownLatch failLeave = new CountDownLatch(1);
@@ -606,7 +598,6 @@
    *
    * <p>Before the bug was fixed this test would fail at least 30% of the time.
    */
-
   public void testTransitionRace() throws TimeoutException {
     for (int k = 0; k < 1000; k++) {
       List<Service> services = Lists.newArrayList();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
index 9b8b88f..105e8de 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
@@ -51,19 +51,16 @@
     }
   }
 
-
   public void testSetValue() throws Exception {
     assertTrue(future.set("value"));
     tester.testCompletedFuture("value");
   }
 
-
   public void testSetFailure() throws Exception {
     assertTrue(future.setException(new Exception("failure")));
     tester.testFailedFuture("failure");
   }
 
-
   public void testSetFailureNull() throws Exception {
     try {
       future.setException(null);
@@ -75,7 +72,6 @@
     tester.testFailedFuture("failure");
   }
 
-
   public void testCancel() throws Exception {
     assertTrue(future.cancel(true));
     tester.testCancelledFuture();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java b/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
index 04b824f..3540686 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
@@ -34,7 +34,6 @@
  * @author kevinb
  * @author Jens Nyman
  */
-
 public class SimpleTimeLimiterTest extends TestCase {
 
   private static final long DELAY_MS = 50;
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java b/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
index fa9d87f..688d6fd 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
@@ -129,7 +129,7 @@
     assertTrue(Striped.lazyWeakLock(256).size() == 256);
   }
 
-
+  @AndroidIncompatible // Presumably GC doesn't trigger, despite our efforts.
   public void testWeakImplementations() {
     for (Striped<?> striped : weakImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
@@ -137,7 +137,7 @@
     }
   }
 
-
+  @AndroidIncompatible // Presumably GC doesn't trigger, despite our efforts.
   public void testWeakReadWrite() {
     Striped<ReadWriteLock> striped = Striped.lazyWeakReadWriteLock(1000);
     Object key = new Object();
@@ -150,7 +150,7 @@
     readLock.unlock();
   }
 
-
+  @AndroidIncompatible // Presumably GC doesn't trigger, despite our efforts.
   public void testStrongImplementations() {
     for (Striped<?> striped : strongImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java
index 8a52ffe..5b77f9a 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java
@@ -33,7 +33,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class SupplementalMonitorTest extends TestCase {
 
   public void testLeaveWithoutEnterThrowsIMSE() {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/TestThread.java b/android/guava-tests/test/com/google/common/util/concurrent/TestThread.java
index 1c3c888..f85d313 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/TestThread.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/TestThread.java
@@ -28,8 +28,8 @@
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import javax.annotation.CheckForNull;
 import junit.framework.AssertionFailedError;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A helper for concurrency testing. One or more {@code TestThread} instances are instantiated in a
@@ -168,7 +168,7 @@
    * Asserts that a prior call that had caused this thread to block or wait has since returned
    * normally.
    */
-  public void assertPriorCallReturns(@NullableDecl String methodName) throws Exception {
+  public void assertPriorCallReturns(@CheckForNull String methodName) throws Exception {
     assertEquals(null, getResponse(methodName).getResult());
   }
 
@@ -176,7 +176,7 @@
    * Asserts that a prior call that had caused this thread to block or wait has since returned the
    * expected boolean value.
    */
-  public void assertPriorCallReturns(boolean expected, @NullableDecl String methodName)
+  public void assertPriorCallReturns(boolean expected, @CheckForNull String methodName)
       throws Exception {
     assertEquals(expected, getResponse(methodName).getResult());
   }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
index 7684b96..a3a7b8e 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
@@ -56,7 +56,6 @@
     builder = new ThreadFactoryBuilder();
   }
 
-
   public void testThreadFactoryBuilder_defaults() throws InterruptedException {
     ThreadFactory threadFactory = builder.build();
     Thread thread = threadFactory.newThread(monitoredRunnable);
@@ -93,7 +92,6 @@
     assertThat(thread.getName()).matches("^pool-\\d+-thread-" + threadId + "$");
   }
 
-
   public void testNameFormatWithPercentS_custom() {
     String format = "super-duper-thread-%s";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -102,7 +100,6 @@
     }
   }
 
-
   public void testNameFormatWithPercentD_custom() {
     String format = "super-duper-thread-%d";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -111,21 +108,18 @@
     }
   }
 
-
   public void testDaemon_false() {
     ThreadFactory factory = builder.setDaemon(false).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertFalse(thread.isDaemon());
   }
 
-
   public void testDaemon_true() {
     ThreadFactory factory = builder.setDaemon(true).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertTrue(thread.isDaemon());
   }
 
-
   public void testPriority_custom() {
     for (int i = Thread.MIN_PRIORITY; i <= Thread.MAX_PRIORITY; i++) {
       ThreadFactory factory = builder.setPriority(i).build();
@@ -150,7 +144,6 @@
     }
   }
 
-
   public void testUncaughtExceptionHandler_custom() {
     assertEquals(
         UNCAUGHT_EXCEPTION_HANDLER,
@@ -161,7 +154,6 @@
             .getUncaughtExceptionHandler());
   }
 
-
   public void testBuildMutateBuild() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -177,7 +169,6 @@
     unused = builder.build(); // this is *also* allowed
   }
 
-
   public void testBuildMutate() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -186,7 +177,6 @@
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
   }
 
-
   public void testThreadFactory() throws InterruptedException {
     final String THREAD_NAME = "ludicrous speed";
     final int THREAD_PRIORITY = 1;
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java b/android/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java
index 157afa7..e735ae0 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java
@@ -84,7 +84,6 @@
   }
 
   @GwtIncompatible // blocking wait
-
   public void testCancel_interrupted() throws Exception {
     final AtomicBoolean interruptedExceptionThrown = new AtomicBoolean();
     final CountDownLatch enterLatch = new CountDownLatch(1);
@@ -135,7 +134,6 @@
   }
 
   @GwtIncompatible // blocking wait
-
   public void testRunIdempotency() throws Exception {
     final int numThreads = 10;
     final ExecutorService executor = Executors.newFixedThreadPool(numThreads);
@@ -171,7 +169,6 @@
   }
 
   @GwtIncompatible // blocking wait
-
   public void testToString() throws Exception {
     final CountDownLatch enterLatch = new CountDownLatch(1);
     final CountDownLatch exitLatch = new CountDownLatch(1);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java
index eb8455b..4a26b49 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java
@@ -23,7 +23,6 @@
 import junit.framework.TestCase;
 
 /** @author Gregory Kick */
-
 public class UncaughtExceptionHandlersTest extends TestCase {
 
   private Runtime runtimeMock;
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
index 0d24266..3f91b81 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
@@ -77,7 +77,6 @@
    * This first test doesn't test anything in Uninterruptibles, just demonstrates some normal
    * behavior of futures so that you can contrast the next test with it.
    */
-
   public void testRegularFutureInterrupted() throws ExecutionException {
 
     /*
@@ -116,7 +115,6 @@
     assertTrue(sleeper.completed);
   }
 
-
   public void testMakeUninterruptible_timeoutPreservedThroughInterruption()
       throws ExecutionException {
 
@@ -155,32 +153,26 @@
     }
   }
 
-
   public void testMakeUninterruptible_untimed_uninterrupted() throws Exception {
     runUntimedInterruptsTest(0);
   }
 
-
   public void testMakeUninterruptible_untimed_interrupted() throws Exception {
     runUntimedInterruptsTest(1);
   }
 
-
   public void testMakeUninterruptible_untimed_multiplyInterrupted() throws Exception {
     runUntimedInterruptsTest(38);
   }
 
-
   public void testMakeUninterruptible_timed_uninterrupted() throws Exception {
     runTimedInterruptsTest(0);
   }
 
-
   public void testMakeUninterruptible_timed_interrupted() throws Exception {
     runTimedInterruptsTest(1);
   }
 
-
   public void testMakeUninterruptible_timed_multiplyInterrupted() throws Exception {
     runTimedInterruptsTest(38);
   }
@@ -218,7 +210,6 @@
   /**
    * Confirms that the test code triggers {@link InterruptedException} in a standard {@link Future}.
    */
-
   public void testMakeUninterruptible_plainFutureSanityCheck() throws Exception {
     SettableFuture<String> future = SettableFuture.create();
     FutureTask<Boolean> wasInterrupted = untimedInterruptReporter(future, true);
@@ -235,7 +226,6 @@
     }
   }
 
-
   public void testMakeUninterruptible_timedGetZeroTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
@@ -248,7 +238,6 @@
     assertEquals(RESULT, getUninterruptibly(future, 0, SECONDS));
   }
 
-
   public void testMakeUninterruptible_timedGetNegativeTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
index 59bf808..3e775ba 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
@@ -22,7 +22,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class UninterruptibleMonitorTest extends MonitorTestCase {
 
   public UninterruptibleMonitorTest() {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
index e58cf6a..ab8d5b0 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
@@ -54,7 +54,6 @@
  *
  * @author Anthony Zana
  */
-
 public class UninterruptiblesTest extends TestCase {
   private static final String EXPECTED_TAKE = "expectedTake";
 
diff --git a/android/guava/pom.xml b/android/guava/pom.xml
index e9154c7..39611d4 100644
--- a/android/guava/pom.xml
+++ b/android/guava/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>31.0.1-android</version>
+    <version>31.1-android</version>
   </parent>
   <artifactId>guava</artifactId>
   <packaging>bundle</packaging>
@@ -36,10 +36,6 @@
       <artifactId>checker-qual</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.checkerframework</groupId>
-      <artifactId>checker-compat-qual</artifactId>
-    </dependency>
-    <dependency>
       <groupId>com.google.errorprone</groupId>
       <artifactId>error_prone_annotations</artifactId>
     </dependency>
@@ -120,12 +116,6 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
-        <configuration>
-          <ignores>
-            <!-- Allow requireNonNull: Android desugaring rewrites it (so it's safe for us to use), and it's useful for null checks. Note that this line allows *all* methods from java.util.Objects. That's the best that we can do with the configuration options that Animal Sniffer offers. -->
-            <ignore>java.util.Objects</ignore>
-          </ignores>
-        </configuration>
       </plugin>
       <plugin>
         <artifactId>maven-javadoc-plugin</artifactId>
@@ -139,7 +129,7 @@
           <!-- excludePackageNames requires specification of packages separately from "all subpackages".
                https://issues.apache.org/jira/browse/MJAVADOC-584 -->
           <excludePackageNames>
-            com.google.common.base.internal,com.google.common.base.internal.*,com.google.thirdparty.publicsuffix,com.google.thirdparty.publicsuffix.*,com.oracle.*,com.sun.*,java.*,javax.*,jdk,jdk.*,org.*,sun.*
+            com.azul.tooling.in,com.google.common.base.internal,com.google.common.base.internal.*,com.google.thirdparty.publicsuffix,com.google.thirdparty.publicsuffix.*,com.oracle.*,com.sun.*,java.*,javax.*,jdk,jdk.*,org.*,sun.*
           </excludePackageNames>
           <!-- Ignore some tags that are found in Java 11 sources but not recognized... under -source 8, I think it was? I can no longer reproduce the failure. -->
           <tags>
diff --git a/android/guava/src/com/google/common/base/CharMatcher.java b/android/guava/src/com/google/common/base/CharMatcher.java
index 7941883..2a2a894 100644
--- a/android/guava/src/com/google/common/base/CharMatcher.java
+++ b/android/guava/src/com/google/common/base/CharMatcher.java
@@ -1461,10 +1461,10 @@
     // [[[:Zs:][:Zl:][:Zp:][:Cc:][:Cf:][:Cs:][:Co:]]&[\u0000-\uFFFF]]
     // with the "Abbreviate" option, and get the ranges from there.
     private static final String RANGE_STARTS =
-        "\u0000\u007f\u00ad\u0600\u061c\u06dd\u070f\u08e2\u1680\u180e\u2000\u2028\u205f\u2066"
+        "\u0000\u007f\u00ad\u0600\u061c\u06dd\u070f\u0890\u08e2\u1680\u180e\u2000\u2028\u205f\u2066"
             + "\u3000\ud800\ufeff\ufff9";
     private static final String RANGE_ENDS = // inclusive ends
-        "\u0020\u00a0\u00ad\u0605\u061c\u06dd\u070f\u08e2\u1680\u180e\u200f\u202f\u2064\u206f"
+        "\u0020\u00a0\u00ad\u0605\u061c\u06dd\u070f\u0891\u08e2\u1680\u180e\u200f\u202f\u2064\u206f"
             + "\u3000\uf8ff\ufeff\ufffb";
 
     static final Invisible INSTANCE = new Invisible();
diff --git a/android/guava/src/com/google/common/base/Converter.java b/android/guava/src/com/google/common/base/Converter.java
index 208a032..422480d 100644
--- a/android/guava/src/com/google/common/base/Converter.java
+++ b/android/guava/src/com/google/common/base/Converter.java
@@ -19,7 +19,9 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.CheckReturnValue;
 import com.google.errorprone.annotations.ForOverride;
+import com.google.errorprone.annotations.InlineMe;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.Serializable;
@@ -270,7 +272,7 @@
    * both use cases by using @PolyNull. (By contrast, we can't use @PolyNull for our superinterface
    * (`implements Function<@PolyNull A, @PolyNull B>`), at least as far as I know.)
    */
-  public Iterable<B> convertAll(final Iterable<? extends A> fromIterable) {
+  public Iterable<B> convertAll(Iterable<? extends A> fromIterable) {
     checkNotNull(fromIterable, "fromIterable");
     return new Iterable<B>() {
       @Override
@@ -307,7 +309,7 @@
    *
    * <p><b>Note:</b> you should not override this method. It is non-final for legacy reasons.
    */
-  @CanIgnoreReturnValue
+  @CheckReturnValue
   public Converter<B, A> reverse() {
     Converter<B, A> result = reverse;
     return (result == null) ? reverse = new ReverseConverter<>(this) : result;
@@ -492,6 +494,7 @@
    */
   @SuppressWarnings("nullness")
   @CheckForNull
+  @InlineMe(replacement = "this.convert(a)")
   public final B apply(@CheckForNull A a) {
     return convert(a);
   }
diff --git a/android/guava/src/com/google/common/base/Enums.java b/android/guava/src/com/google/common/base/Enums.java
index 449b7e3..5c55b65 100644
--- a/android/guava/src/com/google/common/base/Enums.java
+++ b/android/guava/src/com/google/common/base/Enums.java
@@ -105,8 +105,8 @@
    *
    * @since 16.0
    */
-  public static <T extends Enum<T>> Converter<String, T> stringConverter(final Class<T> enumClass) {
-    return new StringConverter<T>(enumClass);
+  public static <T extends Enum<T>> Converter<String, T> stringConverter(Class<T> enumClass) {
+    return new StringConverter<>(enumClass);
   }
 
   private static final class StringConverter<T extends Enum<T>> extends Converter<String, T>
diff --git a/android/guava/src/com/google/common/base/Equivalence.java b/android/guava/src/com/google/common/base/Equivalence.java
index 0ce901f..1bf7f98 100644
--- a/android/guava/src/com/google/common/base/Equivalence.java
+++ b/android/guava/src/com/google/common/base/Equivalence.java
@@ -153,7 +153,43 @@
    * @since 10.0
    */
   public final <S extends @Nullable T> Wrapper<S> wrap(@ParametricNullness S reference) {
-    return new Wrapper<S>(this, reference);
+    /*
+     * I'm pretty sure that this warning "makes sense" but doesn't indicate a real problem.
+     *
+     * Why it "makes sense": If we pass a `@Nullable Foo`, then we should also pass an
+     * `Equivalence<? super @Nullable Foo>`. And there's no such thing because Equivalence doesn't
+     * permit nullable type arguments.
+     *
+     * Why there's no real problem: Every Equivalence can handle null.
+     *
+     * We could work around this by giving Wrapper 2 type parameters. In the terms of this method,
+     * that would be both the T parameter (from the class) and the S parameter (from this method).
+     * However, such a change would be source-incompatible. (Plus, there's no reason for the S
+     * parameter from the user's perspective, so it would be a wart.)
+     *
+     * We could probably also work around this by making Wrapper non-final and putting the
+     * implementation into a subclass with those 2 type parameters. But we like `final`, if only to
+     * deter users from using mocking frameworks to construct instances. (And could also complicate
+     * serialization, which is discussed more in the next paragraph.)
+     *
+     * We could probably also work around this by having Wrapper accept an instance of a new
+     * WrapperGuts class, which would then be the class that would declare the 2 type parameters.
+     * But that would break deserialization of previously serialized Wrapper instances. And while we
+     * specifically say not to rely on serialization across Guava versions, users sometimes do. So
+     * we'd rather not break them without a good enough reason.
+     *
+     * (We could work around the serialization problem by writing custom serialization code. But
+     * even that helps only the case of serializing with an old version and deserializing with a
+     * new, not vice versa -- unless we introduce WrapperGuts and the logic to handle it today, wait
+     * until "everyone" has picked up a version of Guava with that code, and *then* change to use
+     * WrapperGuts.)
+     *
+     * Anyway, a suppression isn't really a big deal. But I have tried to do some due diligence on
+     * avoiding it :)
+     */
+    @SuppressWarnings("nullness")
+    Wrapper<S> w = new Wrapper<>(this, reference);
+    return w;
   }
 
   /**
diff --git a/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java b/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java
index 5ce1d31..7447b80 100644
--- a/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java
+++ b/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java
@@ -156,7 +156,7 @@
   public FinalizableReferenceQueue() {
     // We could start the finalizer lazily, but I'd rather it blow up early.
     queue = new ReferenceQueue<>();
-    frqRef = new PhantomReference<Object>(this, queue);
+    frqRef = new PhantomReference<>(this, queue);
     boolean threadStarted = false;
     try {
       startFinalizer.invoke(null, FinalizableReference.class, queue, frqRef);
diff --git a/android/guava/src/com/google/common/base/FunctionalEquivalence.java b/android/guava/src/com/google/common/base/FunctionalEquivalence.java
index 8bb67be..4383f4f 100644
--- a/android/guava/src/com/google/common/base/FunctionalEquivalence.java
+++ b/android/guava/src/com/google/common/base/FunctionalEquivalence.java
@@ -20,6 +20,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Equivalence applied on functional result.
@@ -34,11 +35,11 @@
 
   private static final long serialVersionUID = 0;
 
-  private final Function<? super F, ? extends T> function;
+  private final Function<? super F, ? extends @Nullable T> function;
   private final Equivalence<T> resultEquivalence;
 
   FunctionalEquivalence(
-      Function<? super F, ? extends T> function, Equivalence<T> resultEquivalence) {
+      Function<? super F, ? extends @Nullable T> function, Equivalence<T> resultEquivalence) {
     this.function = checkNotNull(function);
     this.resultEquivalence = checkNotNull(resultEquivalence);
   }
diff --git a/android/guava/src/com/google/common/base/Functions.java b/android/guava/src/com/google/common/base/Functions.java
index 5337d0e..7878504 100644
--- a/android/guava/src/com/google/common/base/Functions.java
+++ b/android/guava/src/com/google/common/base/Functions.java
@@ -288,7 +288,7 @@
    */
   public static <T extends @Nullable Object> Function<T, Boolean> forPredicate(
       Predicate<T> predicate) {
-    return new PredicateFunction<T>(predicate);
+    return new PredicateFunction<>(predicate);
   }
 
   /** @see Functions#forPredicate */
diff --git a/android/guava/src/com/google/common/base/Joiner.java b/android/guava/src/com/google/common/base/Joiner.java
index 0f3d6e4..8b29f68 100644
--- a/android/guava/src/com/google/common/base/Joiner.java
+++ b/android/guava/src/com/google/common/base/Joiner.java
@@ -236,7 +236,7 @@
    * Returns a joiner with the same behavior as this one, except automatically substituting {@code
    * nullText} for any provided null elements.
    */
-  public Joiner useForNull(final String nullText) {
+  public Joiner useForNull(String nullText) {
     checkNotNull(nullText);
     return new Joiner(this) {
       @Override
@@ -493,9 +493,7 @@
   }
 
   private static Iterable<@Nullable Object> iterable(
-      @CheckForNull final Object first,
-      @CheckForNull final Object second,
-      final @Nullable Object[] rest) {
+      @CheckForNull Object first, @CheckForNull Object second, @Nullable Object[] rest) {
     checkNotNull(rest);
     return new AbstractList<@Nullable Object>() {
       @Override
diff --git a/android/guava/src/com/google/common/base/ParametricNullness.java b/android/guava/src/com/google/common/base/ParametricNullness.java
index c736055..5b595ad 100644
--- a/android/guava/src/com/google/common/base/ParametricNullness.java
+++ b/android/guava/src/com/google/common/base/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/base/Predicates.java b/android/guava/src/com/google/common/base/Predicates.java
index c3b5562..dc487fc 100644
--- a/android/guava/src/com/google/common/base/Predicates.java
+++ b/android/guava/src/com/google/common/base/Predicates.java
@@ -82,7 +82,7 @@
    * false}.
    */
   public static <T extends @Nullable Object> Predicate<T> not(Predicate<T> predicate) {
-    return new NotPredicate<T>(predicate);
+    return new NotPredicate<>(predicate);
   }
 
   /**
@@ -94,7 +94,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> and(
       Iterable<? extends Predicate<? super T>> components) {
-    return new AndPredicate<T>(defensiveCopy(components));
+    return new AndPredicate<>(defensiveCopy(components));
   }
 
   /**
@@ -116,7 +116,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> and(
       Predicate<? super T> first, Predicate<? super T> second) {
-    return new AndPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
+    return new AndPredicate<>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
   /**
@@ -128,7 +128,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> or(
       Iterable<? extends Predicate<? super T>> components) {
-    return new OrPredicate<T>(defensiveCopy(components));
+    return new OrPredicate<>(defensiveCopy(components));
   }
 
   /**
@@ -150,7 +150,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> or(
       Predicate<? super T> first, Predicate<? super T> second) {
-    return new OrPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
+    return new OrPredicate<>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
   /**
@@ -213,7 +213,7 @@
    * @param target the collection that may contain the function input
    */
   public static <T extends @Nullable Object> Predicate<T> in(Collection<? extends T> target) {
-    return new InPredicate<T>(target);
+    return new InPredicate<>(target);
   }
 
   /**
@@ -713,7 +713,7 @@
   }
 
   static <T> List<T> defensiveCopy(Iterable<T> iterable) {
-    ArrayList<T> list = new ArrayList<T>();
+    ArrayList<T> list = new ArrayList<>();
     for (T element : iterable) {
       list.add(checkNotNull(element));
     }
diff --git a/android/guava/src/com/google/common/base/Present.java b/android/guava/src/com/google/common/base/Present.java
index 59efebc..4e62da2 100644
--- a/android/guava/src/com/google/common/base/Present.java
+++ b/android/guava/src/com/google/common/base/Present.java
@@ -71,7 +71,7 @@
 
   @Override
   public <V> Optional<V> transform(Function<? super T, V> function) {
-    return new Present<V>(
+    return new Present<>(
         checkNotNull(
             function.apply(reference),
             "the Function passed to Optional.transform() must not return null."));
diff --git a/android/guava/src/com/google/common/base/Suppliers.java b/android/guava/src/com/google/common/base/Suppliers.java
index 57d3486..6ced905 100644
--- a/android/guava/src/com/google/common/base/Suppliers.java
+++ b/android/guava/src/com/google/common/base/Suppliers.java
@@ -226,7 +226,7 @@
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public static <T extends @Nullable Object> Supplier<T> memoizeWithExpiration(
       Supplier<T> delegate, long duration, TimeUnit unit) {
-    return new ExpiringMemoizingSupplier<T>(delegate, duration, unit);
+    return new ExpiringMemoizingSupplier<>(delegate, duration, unit);
   }
 
   @VisibleForTesting
@@ -286,7 +286,7 @@
   /** Returns a supplier that always supplies {@code instance}. */
   public static <T extends @Nullable Object> Supplier<T> ofInstance(
       @ParametricNullness T instance) {
-    return new SupplierOfInstance<T>(instance);
+    return new SupplierOfInstance<>(instance);
   }
 
   private static class SupplierOfInstance<T extends @Nullable Object>
@@ -331,7 +331,7 @@
    */
   public static <T extends @Nullable Object> Supplier<T> synchronizedSupplier(
       Supplier<T> delegate) {
-    return new ThreadSafeSupplier<T>(delegate);
+    return new ThreadSafeSupplier<>(delegate);
   }
 
   private static class ThreadSafeSupplier<T extends @Nullable Object>
diff --git a/android/guava/src/com/google/common/base/Throwables.java b/android/guava/src/com/google/common/base/Throwables.java
index 7832d18..e45ce80 100644
--- a/android/guava/src/com/google/common/base/Throwables.java
+++ b/android/guava/src/com/google/common/base/Throwables.java
@@ -19,7 +19,6 @@
 import static java.util.Collections.unmodifiableList;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -290,7 +289,6 @@
    * @return an unmodifiable list containing the cause chain starting with {@code throwable}
    * @throws IllegalArgumentException if there is a loop in the causal chain
    */
-  @Beta // TODO(kevinb): decide best return type
   public static List<Throwable> getCausalChain(Throwable throwable) {
     checkNotNull(throwable);
     List<Throwable> causes = new ArrayList<>(4);
@@ -330,7 +328,6 @@
    *     ClassCastException}'s cause is {@code throwable}.
    * @since 22.0
    */
-  @Beta
   @GwtIncompatible // Class.cast(Object)
   @CheckForNull
   public static <X extends Throwable> X getCauseAs(
@@ -382,11 +379,12 @@
    * exception's creation.
    *
    * @since 19.0
+   * @deprecated This method is equivalent to {@link Throwable#getStackTrace()} on JDK versions past
+   *     JDK 8 and on all Android versions. Use {@link Throwable#getStackTrace()} directly, or where
+   *     possible use the {@code java.lang.StackWalker.walk} method introduced in JDK 9.
    */
-  // TODO(cpovirk): Say something about the possibility that List access could fail at runtime?
-  @Beta
+  @Deprecated
   @GwtIncompatible // lazyStackTraceIsLazy, jlaStackTrace
-  // TODO(cpovirk): Consider making this available under GWT (slow implementation only).
   public static List<StackTraceElement> lazyStackTrace(Throwable throwable) {
     return lazyStackTraceIsLazy()
         ? jlaStackTrace(throwable)
@@ -398,15 +396,17 @@
    * documentation.
    *
    * @since 19.0
+   * @deprecated This method always returns false on JDK versions past JDK 8 and on all Android
+   *     versions.
    */
-  @Beta
+  @Deprecated
   @GwtIncompatible // getStackTraceElementMethod
   public static boolean lazyStackTraceIsLazy() {
     return getStackTraceElementMethod != null && getStackTraceDepthMethod != null;
   }
 
   @GwtIncompatible // invokeAccessibleNonThrowingMethod
-  private static List<StackTraceElement> jlaStackTrace(final Throwable t) {
+  private static List<StackTraceElement> jlaStackTrace(Throwable t) {
     checkNotNull(t);
     /*
      * TODO(cpovirk): Consider optimizing iterator() to catch IOOBE instead of doing bounds checks.
diff --git a/android/guava/src/com/google/common/base/internal/Finalizer.java b/android/guava/src/com/google/common/base/internal/Finalizer.java
index 0da2206..b45ec15 100644
--- a/android/guava/src/com/google/common/base/internal/Finalizer.java
+++ b/android/guava/src/com/google/common/base/internal/Finalizer.java
@@ -23,7 +23,7 @@
 import java.lang.reflect.Method;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Thread that finalizes referents. All references should implement {@code
@@ -43,6 +43,7 @@
  * collected, and this class can detect when the main class loader has been garbage collected and
  * stop itself.
  */
+// no @ElementTypesAreNonNullByDefault for the reasons discussed above
 public class Finalizer implements Runnable {
 
   private static final Logger logger = Logger.getLogger(Finalizer.class.getName());
@@ -116,10 +117,10 @@
   // By preference, we will use the Thread constructor that has an `inheritThreadLocals` parameter.
   // But before Java 9, our only way not to inherit ThreadLocals is to zap them after the thread
   // is created, by accessing a private field.
-  @NullableDecl
+  @CheckForNull
   private static final Constructor<Thread> bigThreadConstructor = getBigThreadConstructor();
 
-  @NullableDecl
+  @CheckForNull
   private static final Field inheritableThreadLocals =
       (bigThreadConstructor == null) ? getInheritableThreadLocalsField() : null;
 
@@ -130,8 +131,7 @@
       PhantomReference<Object> frqReference) {
     this.queue = queue;
 
-    this.finalizableReferenceClassReference =
-        new WeakReference<Class<?>>(finalizableReferenceClass);
+    this.finalizableReferenceClassReference = new WeakReference<>(finalizableReferenceClass);
 
     // Keep track of the FRQ that started us so we know when to stop.
     this.frqReference = frqReference;
@@ -192,7 +192,7 @@
   }
 
   /** Looks up FinalizableReference.finalizeReferent() method. */
-  @NullableDecl
+  @CheckForNull
   private Method getFinalizeReferentMethod() {
     Class<?> finalizableReferenceClass = finalizableReferenceClassReference.get();
     if (finalizableReferenceClass == null) {
@@ -211,7 +211,7 @@
     }
   }
 
-  @NullableDecl
+  @CheckForNull
   private static Field getInheritableThreadLocalsField() {
     try {
       Field inheritableThreadLocals = Thread.class.getDeclaredField("inheritableThreadLocals");
@@ -226,7 +226,7 @@
     }
   }
 
-  @NullableDecl
+  @CheckForNull
   private static Constructor<Thread> getBigThreadConstructor() {
     try {
       return Thread.class.getConstructor(
diff --git a/android/guava/src/com/google/common/cache/CacheBuilder.java b/android/guava/src/com/google/common/cache/CacheBuilder.java
index 227b2c2..b690973 100644
--- a/android/guava/src/com/google/common/cache/CacheBuilder.java
+++ b/android/guava/src/com/google/common/cache/CacheBuilder.java
@@ -49,8 +49,10 @@
  *
  * <p>The successor to Guava's caching API is <a
  * href="https://github.com/ben-manes/caffeine/wiki">Caffeine</a>. Its API is designed to make it a
- * nearly drop-in replacement -- though it requires Java 8 APIs and is not available for Android or
- * GWT/j2cl. Its equivalent to {@code CacheBuilder} is its <a
+ * nearly drop-in replacement -- though it requires Java 8 APIs, is not available for Android or
+ * GWT/j2cl, and may have <a href="https://github.com/ben-manes/caffeine/wiki/Guava">different
+ * (usually better) behavior</a> when multiple threads attempt concurrent mutations. Its equivalent
+ * to {@code CacheBuilder} is its <a
  * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/Caffeine.html">{@code
  * Caffeine}</a> class. Caffeine offers better performance, more features (including asynchronous
  * loading), and fewer <a
diff --git a/android/guava/src/com/google/common/cache/CacheBuilderSpec.java b/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
index 64b5ad2..7757f3b 100644
--- a/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
+++ b/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
@@ -108,7 +108,7 @@
           .put("expireAfterWrite", new WriteDurationParser())
           .put("refreshAfterWrite", new RefreshDurationParser())
           .put("refreshInterval", new RefreshDurationParser())
-          .build();
+          .buildOrThrow();
 
   @VisibleForTesting @CheckForNull Integer initialCapacity;
   @VisibleForTesting @CheckForNull Long maximumSize;
diff --git a/android/guava/src/com/google/common/cache/LocalCache.java b/android/guava/src/com/google/common/cache/LocalCache.java
index f61f68e..f3744e5 100644
--- a/android/guava/src/com/google/common/cache/LocalCache.java
+++ b/android/guava/src/com/google/common/cache/LocalCache.java
@@ -21,6 +21,7 @@
 import static com.google.common.util.concurrent.Futures.transform;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+import static java.util.Collections.unmodifiableSet;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import com.google.common.annotations.GwtCompatible;
@@ -36,6 +37,7 @@
 import com.google.common.cache.CacheBuilder.OneWeigher;
 import com.google.common.cache.CacheLoader.InvalidCacheLoadException;
 import com.google.common.cache.CacheLoader.UnsupportedLoadingOperationException;
+import com.google.common.cache.LocalCache.AbstractCacheSet;
 import com.google.common.collect.AbstractSequentialIterator;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -81,7 +83,7 @@
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * The concurrent hash map implementation built by {@link CacheBuilder}.
@@ -230,13 +232,13 @@
   final StatsCounter globalStatsCounter;
 
   /** The default cache loader to use on loading operations. */
-  @NullableDecl final CacheLoader<? super K, V> defaultLoader;
+  @CheckForNull final CacheLoader<? super K, V> defaultLoader;
 
   /**
    * Creates a new, empty map with the specified strategy, initial capacity and concurrency level.
    */
   LocalCache(
-      CacheBuilder<? super K, ? super V> builder, @NullableDecl CacheLoader<? super K, V> loader) {
+      CacheBuilder<? super K, ? super V> builder, @CheckForNull CacheLoader<? super K, V> loader) {
     concurrencyLevel = Math.min(builder.getConcurrencyLevel(), MAX_SEGMENTS);
 
     keyStrength = builder.getKeyStrength();
@@ -440,14 +442,14 @@
     STRONG {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new StrongEntry<>(key, hash, next);
       }
     },
     STRONG_ACCESS {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new StrongAccessEntry<>(key, hash, next);
       }
 
@@ -462,7 +464,7 @@
     STRONG_WRITE {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new StrongWriteEntry<>(key, hash, next);
       }
 
@@ -477,7 +479,7 @@
     STRONG_ACCESS_WRITE {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new StrongAccessWriteEntry<>(key, hash, next);
       }
 
@@ -493,14 +495,14 @@
     WEAK {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new WeakEntry<>(segment.keyReferenceQueue, key, hash, next);
       }
     },
     WEAK_ACCESS {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new WeakAccessEntry<>(segment.keyReferenceQueue, key, hash, next);
       }
 
@@ -515,7 +517,7 @@
     WEAK_WRITE {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new WeakWriteEntry<>(segment.keyReferenceQueue, key, hash, next);
       }
 
@@ -530,7 +532,7 @@
     WEAK_ACCESS_WRITE {
       @Override
       <K, V> ReferenceEntry<K, V> newEntry(
-          Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+          Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
         return new WeakAccessWriteEntry<>(segment.keyReferenceQueue, key, hash, next);
       }
 
@@ -580,7 +582,7 @@
      * @param next entry in the same bucket
      */
     abstract <K, V> ReferenceEntry<K, V> newEntry(
-        Segment<K, V> segment, K key, int hash, @NullableDecl ReferenceEntry<K, V> next);
+        Segment<K, V> segment, K key, int hash, @CheckForNull ReferenceEntry<K, V> next);
 
     /**
      * Copies an entry, assigning it a new {@code next} entry.
@@ -622,7 +624,7 @@
   /** A reference to a value. */
   interface ValueReference<K, V> {
     /** Returns the value. Does not block or throw exceptions. */
-    @NullableDecl
+    @CheckForNull
     V get();
 
     /**
@@ -641,7 +643,7 @@
      * Returns the entry associated with this value reference, or {@code null} if this value
      * reference is independent of any entry.
      */
-    @NullableDecl
+    @CheckForNull
     ReferenceEntry<K, V> getEntry();
 
     /**
@@ -650,13 +652,13 @@
      * <p>{@code value} may be null only for a loading reference.
      */
     ValueReference<K, V> copyFor(
-        ReferenceQueue<V> queue, @NullableDecl V value, ReferenceEntry<K, V> entry);
+        ReferenceQueue<V> queue, @CheckForNull V value, ReferenceEntry<K, V> entry);
 
     /**
      * Notify pending loads that a new value was set. This is only relevant to loading value
      * references.
      */
-    void notifyNewValue(@NullableDecl V newValue);
+    void notifyNewValue(@CheckForNull V newValue);
 
     /**
      * Returns true if a new value is currently loading, regardless of whether or not there is an
@@ -696,7 +698,7 @@
         @Override
         public ValueReference<Object, Object> copyFor(
             ReferenceQueue<Object> queue,
-            @NullableDecl Object value,
+            @CheckForNull Object value,
             ReferenceEntry<Object, Object> entry) {
           return this;
         }
@@ -939,7 +941,7 @@
   static class StrongEntry<K, V> extends AbstractReferenceEntry<K, V> {
     final K key;
 
-    StrongEntry(K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+    StrongEntry(K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       this.key = key;
       this.hash = hash;
       this.next = next;
@@ -953,7 +955,7 @@
     // The code below is exactly the same for each entry type.
 
     final int hash;
-    @NullableDecl final ReferenceEntry<K, V> next;
+    @CheckForNull final ReferenceEntry<K, V> next;
     volatile ValueReference<K, V> valueReference = unset();
 
     @Override
@@ -978,7 +980,7 @@
   }
 
   static final class StrongAccessEntry<K, V> extends StrongEntry<K, V> {
-    StrongAccessEntry(K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+    StrongAccessEntry(K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       super(key, hash, next);
     }
 
@@ -1024,7 +1026,7 @@
   }
 
   static final class StrongWriteEntry<K, V> extends StrongEntry<K, V> {
-    StrongWriteEntry(K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+    StrongWriteEntry(K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       super(key, hash, next);
     }
 
@@ -1070,7 +1072,7 @@
   }
 
   static final class StrongAccessWriteEntry<K, V> extends StrongEntry<K, V> {
-    StrongAccessWriteEntry(K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+    StrongAccessWriteEntry(K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       super(key, hash, next);
     }
 
@@ -1157,7 +1159,7 @@
 
   /** Used for weakly-referenced keys. */
   static class WeakEntry<K, V> extends WeakReference<K> implements ReferenceEntry<K, V> {
-    WeakEntry(ReferenceQueue<K> queue, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+    WeakEntry(ReferenceQueue<K> queue, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       super(key, queue);
       this.hash = hash;
       this.next = next;
@@ -1240,7 +1242,7 @@
     // The code below is exactly the same for each entry type.
 
     final int hash;
-    @NullableDecl final ReferenceEntry<K, V> next;
+    @CheckForNull final ReferenceEntry<K, V> next;
     volatile ValueReference<K, V> valueReference = unset();
 
     @Override
@@ -1266,7 +1268,7 @@
 
   static final class WeakAccessEntry<K, V> extends WeakEntry<K, V> {
     WeakAccessEntry(
-        ReferenceQueue<K> queue, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+        ReferenceQueue<K> queue, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       super(queue, key, hash, next);
     }
 
@@ -1313,7 +1315,7 @@
 
   static final class WeakWriteEntry<K, V> extends WeakEntry<K, V> {
     WeakWriteEntry(
-        ReferenceQueue<K> queue, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+        ReferenceQueue<K> queue, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       super(queue, key, hash, next);
     }
 
@@ -1360,7 +1362,7 @@
 
   static final class WeakAccessWriteEntry<K, V> extends WeakEntry<K, V> {
     WeakAccessWriteEntry(
-        ReferenceQueue<K> queue, K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+        ReferenceQueue<K> queue, K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       super(queue, key, hash, next);
     }
 
@@ -1664,7 +1666,7 @@
    * This method is a convenience for testing. Code should call {@link Segment#newEntry} directly.
    */
   @VisibleForTesting
-  ReferenceEntry<K, V> newEntry(K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+  ReferenceEntry<K, V> newEntry(K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
     Segment<K, V> segment = segmentFor(hash);
     segment.lock();
     try {
@@ -1695,7 +1697,7 @@
     return valueStrength.referenceValue(segmentFor(hash), entry, checkNotNull(value), weight);
   }
 
-  int hash(@NullableDecl Object key) {
+  int hash(@CheckForNull Object key) {
     int h = keyEquivalence.hash(key);
     return rehash(h);
   }
@@ -1742,7 +1744,7 @@
    * cleanup stale entries. As such it should only be called outside of a segment context, such as
    * during iteration.
    */
-  @NullableDecl
+  @CheckForNull
   V getLiveValue(ReferenceEntry<K, V> entry, long now) {
     if (entry.getKey() == null) {
       return null;
@@ -1887,7 +1889,7 @@
     int threshold;
 
     /** The per-segment table. */
-    @NullableDecl volatile AtomicReferenceArray<ReferenceEntry<K, V>> table;
+    @CheckForNull volatile AtomicReferenceArray<ReferenceEntry<K, V>> table;
 
     /** The maximum weight of this segment. UNSET_INT if there is no maximum. */
     final long maxSegmentWeight;
@@ -1896,13 +1898,13 @@
      * The key reference queue contains entries whose keys have been garbage collected, and which
      * need to be cleaned up internally.
      */
-    @NullableDecl final ReferenceQueue<K> keyReferenceQueue;
+    @CheckForNull final ReferenceQueue<K> keyReferenceQueue;
 
     /**
      * The value reference queue contains value references whose values have been garbage collected,
      * and which need to be cleaned up internally.
      */
-    @NullableDecl final ReferenceQueue<V> valueReferenceQueue;
+    @CheckForNull final ReferenceQueue<V> valueReferenceQueue;
 
     /**
      * The recency queue is used to record which entries were accessed for updating the access
@@ -1978,7 +1980,7 @@
     }
 
     @GuardedBy("this")
-    ReferenceEntry<K, V> newEntry(K key, int hash, @NullableDecl ReferenceEntry<K, V> next) {
+    ReferenceEntry<K, V> newEntry(K key, int hash, @CheckForNull ReferenceEntry<K, V> next) {
       return map.entryFactory.newEntry(this, checkNotNull(key), hash, next);
     }
 
@@ -2058,7 +2060,7 @@
       }
     }
 
-    @NullableDecl
+    @CheckForNull
     V get(Object key, int hash) {
       try {
         if (count != 0) { // read-volatile
@@ -2269,7 +2271,7 @@
      * {@code null} if another thread is performing the refresh or if an error occurs during
      * refresh.
      */
-    @NullableDecl
+    @CheckForNull
     V refresh(K key, int hash, CacheLoader<? super K, V> loader, boolean checkTime) {
       final LoadingValueReference<K, V> loadingValueReference =
           insertLoadingValueReference(key, hash, checkTime);
@@ -2292,7 +2294,7 @@
      * Returns a newly inserted {@code LoadingValueReference}, or null if the live value reference
      * is already loading.
      */
-    @NullableDecl
+    @CheckForNull
     LoadingValueReference<K, V> insertLoadingValueReference(
         final K key, final int hash, boolean checkTime) {
       ReferenceEntry<K, V> e = null;
@@ -2522,7 +2524,7 @@
 
     @GuardedBy("this")
     void enqueueNotification(
-        @NullableDecl K key, int hash, @NullableDecl V value, int weight, RemovalCause cause) {
+        @CheckForNull K key, int hash, @CheckForNull V value, int weight, RemovalCause cause) {
       totalWeight -= weight;
       if (cause.wasEvicted()) {
         statsCounter.recordEviction();
@@ -2584,7 +2586,7 @@
 
     // Specialized implementations of map methods
 
-    @NullableDecl
+    @CheckForNull
     ReferenceEntry<K, V> getEntry(Object key, int hash) {
       for (ReferenceEntry<K, V> e = getFirst(hash); e != null; e = e.getNext()) {
         if (e.getHash() != hash) {
@@ -2605,7 +2607,7 @@
       return null;
     }
 
-    @NullableDecl
+    @CheckForNull
     ReferenceEntry<K, V> getLiveEntry(Object key, int hash, long now) {
       ReferenceEntry<K, V> e = getEntry(key, hash);
       if (e == null) {
@@ -2686,7 +2688,7 @@
       }
     }
 
-    @NullableDecl
+    @CheckForNull
     V put(K key, int hash, V value, boolean onlyIfAbsent) {
       lock();
       try {
@@ -2892,7 +2894,7 @@
       }
     }
 
-    @NullableDecl
+    @CheckForNull
     V replace(K key, int hash, V newValue) {
       lock();
       try {
@@ -2947,7 +2949,7 @@
       }
     }
 
-    @NullableDecl
+    @CheckForNull
     V remove(Object key, int hash) {
       lock();
       try {
@@ -3139,11 +3141,11 @@
     }
 
     @GuardedBy("this")
-    @NullableDecl
+    @CheckForNull
     ReferenceEntry<K, V> removeValueFromChain(
         ReferenceEntry<K, V> first,
         ReferenceEntry<K, V> entry,
-        @NullableDecl K key,
+        @CheckForNull K key,
         int hash,
         V value,
         ValueReference<K, V> valueReference,
@@ -3161,7 +3163,7 @@
     }
 
     @GuardedBy("this")
-    @NullableDecl
+    @CheckForNull
     ReferenceEntry<K, V> removeEntryFromChain(
         ReferenceEntry<K, V> first, ReferenceEntry<K, V> entry) {
       int newCount = count;
@@ -3415,7 +3417,7 @@
       return oldValue.getWeight();
     }
 
-    public boolean set(@NullableDecl V newValue) {
+    public boolean set(@CheckForNull V newValue) {
       return futureValue.set(newValue);
     }
 
@@ -3428,7 +3430,7 @@
     }
 
     @Override
-    public void notifyNewValue(@NullableDecl V newValue) {
+    public void notifyNewValue(@CheckForNull V newValue) {
       if (newValue != null) {
         // The pending load was clobbered by a manual write.
         // Unblock all pending gets, and have them return the new value.
@@ -3499,7 +3501,7 @@
 
     @Override
     public ValueReference<K, V> copyFor(
-        ReferenceQueue<V> queue, @NullableDecl V value, ReferenceEntry<K, V> entry) {
+        ReferenceQueue<V> queue, @CheckForNull V value, ReferenceEntry<K, V> entry) {
       return this;
     }
   }
@@ -3839,8 +3841,8 @@
   }
 
   @Override
-  @NullableDecl
-  public V get(@NullableDecl Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     if (key == null) {
       return null;
     }
@@ -3853,7 +3855,7 @@
     return segmentFor(hash).get(key, hash, loader);
   }
 
-  @NullableDecl
+  @CheckForNull
   public V getIfPresent(Object key) {
     int hash = hash(checkNotNull(key));
     V value = segmentFor(hash).get(key, hash);
@@ -3866,8 +3868,8 @@
   }
 
   @SuppressWarnings("MissingOverride") // Supermethod will not exist if we build with --release 7.
-  @NullableDecl
-  public V getOrDefault(@NullableDecl Object key, @NullableDecl V defaultValue) {
+  @CheckForNull
+  public V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
     V result = get(key);
     return (result != null) ? result : defaultValue;
   }
@@ -3880,7 +3882,7 @@
     int hits = 0;
     int misses = 0;
 
-    Map<K, V> result = Maps.newLinkedHashMap();
+    ImmutableMap.Builder<K, V> result = ImmutableMap.builder();
     for (Object key : keys) {
       V value = get(key);
       if (value == null) {
@@ -3895,7 +3897,7 @@
     }
     globalStatsCounter.recordHits(hits);
     globalStatsCounter.recordMisses(misses);
-    return ImmutableMap.copyOf(result);
+    return result.buildKeepingLast();
   }
 
   ImmutableMap<K, V> getAll(Iterable<? extends K> keys) throws ExecutionException {
@@ -3920,7 +3922,7 @@
     try {
       if (!keysToLoad.isEmpty()) {
         try {
-          Map<K, V> newEntries = loadAll(keysToLoad, defaultLoader);
+          Map<K, V> newEntries = loadAll(unmodifiableSet(keysToLoad), defaultLoader);
           for (K key : keysToLoad) {
             V value = newEntries.get(key);
             if (value == null) {
@@ -3947,7 +3949,7 @@
    * Returns the result of calling {@link CacheLoader#loadAll}, or null if {@code loader} doesn't
    * implement {@code loadAll}.
    */
-  @NullableDecl
+  @CheckForNull
   Map<K, V> loadAll(Set<? extends K> keys, CacheLoader<? super K, V> loader)
       throws ExecutionException {
     checkNotNull(loader);
@@ -4011,7 +4013,7 @@
    * Returns the internal entry for the specified key. The entry may be loading, expired, or
    * partially collected.
    */
-  ReferenceEntry<K, V> getEntry(@NullableDecl Object key) {
+  ReferenceEntry<K, V> getEntry(@CheckForNull Object key) {
     // does not impact recency ordering
     if (key == null) {
       return null;
@@ -4026,7 +4028,7 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     // does not impact recency ordering
     if (key == null) {
       return false;
@@ -4036,7 +4038,7 @@
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     // does not impact recency ordering
     if (value == null) {
       return false;
@@ -4099,7 +4101,7 @@
   }
 
   @Override
-  public V remove(@NullableDecl Object key) {
+  public V remove(@CheckForNull Object key) {
     if (key == null) {
       return null;
     }
@@ -4108,7 +4110,7 @@
   }
 
   @Override
-  public boolean remove(@NullableDecl Object key, @NullableDecl Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     if (key == null || value == null) {
       return false;
     }
@@ -4117,7 +4119,7 @@
   }
 
   @Override
-  public boolean replace(K key, @NullableDecl V oldValue, V newValue) {
+  public boolean replace(K key, @CheckForNull V oldValue, V newValue) {
     checkNotNull(key);
     checkNotNull(newValue);
     if (oldValue == null) {
@@ -4149,7 +4151,7 @@
     }
   }
 
-  @RetainedWith @NullableDecl Set<K> keySet;
+  @RetainedWith @CheckForNull Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -4158,7 +4160,7 @@
     return (ks != null) ? ks : (keySet = new KeySet());
   }
 
-  @RetainedWith @NullableDecl Collection<V> values;
+  @RetainedWith @CheckForNull Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -4167,7 +4169,7 @@
     return (vs != null) ? vs : (values = new Values());
   }
 
-  @RetainedWith @NullableDecl Set<Entry<K, V>> entrySet;
+  @RetainedWith @CheckForNull Set<Entry<K, V>> entrySet;
 
   @Override
   @GwtIncompatible // Not supported.
@@ -4183,11 +4185,11 @@
 
     int nextSegmentIndex;
     int nextTableIndex;
-    @NullableDecl Segment<K, V> currentSegment;
-    @NullableDecl AtomicReferenceArray<ReferenceEntry<K, V>> currentTable;
-    @NullableDecl ReferenceEntry<K, V> nextEntry;
-    @NullableDecl WriteThroughEntry nextExternal;
-    @NullableDecl WriteThroughEntry lastReturned;
+    @CheckForNull Segment<K, V> currentSegment;
+    @CheckForNull AtomicReferenceArray<ReferenceEntry<K, V>> currentTable;
+    @CheckForNull ReferenceEntry<K, V> nextEntry;
+    @CheckForNull WriteThroughEntry nextExternal;
+    @CheckForNull WriteThroughEntry lastReturned;
 
     HashIterator() {
       nextSegmentIndex = segments.length - 1;
@@ -4328,7 +4330,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       // Cannot use key and value equivalence
       if (object instanceof Entry) {
         Entry<?, ?> that = (Entry<?, ?>) object;
@@ -4516,10 +4518,10 @@
     final Weigher<K, V> weigher;
     final int concurrencyLevel;
     final RemovalListener<? super K, ? super V> removalListener;
-    @NullableDecl final Ticker ticker;
+    @CheckForNull final Ticker ticker;
     final CacheLoader<? super K, V> loader;
 
-    @NullableDecl transient Cache<K, V> delegate;
+    @CheckForNull transient Cache<K, V> delegate;
 
     ManualSerializationProxy(LocalCache<K, V> cache) {
       this(
@@ -4624,7 +4626,7 @@
       implements LoadingCache<K, V>, Serializable {
     private static final long serialVersionUID = 1;
 
-    @NullableDecl transient LoadingCache<K, V> autoDelegate;
+    @CheckForNull transient LoadingCache<K, V> autoDelegate;
 
     LoadingSerializationProxy(LocalCache<K, V> cache) {
       super(cache);
@@ -4680,7 +4682,7 @@
     // Cache methods
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public V getIfPresent(Object key) {
       return localCache.getIfPresent(key);
     }
diff --git a/android/guava/src/com/google/common/cache/LongAddables.java b/android/guava/src/com/google/common/cache/LongAddables.java
index b0f9e2b..249c6e1 100644
--- a/android/guava/src/com/google/common/cache/LongAddables.java
+++ b/android/guava/src/com/google/common/cache/LongAddables.java
@@ -31,7 +31,8 @@
   static {
     Supplier<LongAddable> supplier;
     try {
-      new LongAdder(); // trigger static initialization of the LongAdder class, which may fail
+      // trigger static initialization of the LongAdder class, which may fail
+      LongAdder unused = new LongAdder();
       supplier =
           new Supplier<LongAddable>() {
             @Override
diff --git a/android/guava/src/com/google/common/cache/ParametricNullness.java b/android/guava/src/com/google/common/cache/ParametricNullness.java
index 19305a6..64682de 100644
--- a/android/guava/src/com/google/common/cache/ParametricNullness.java
+++ b/android/guava/src/com/google/common/cache/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/cache/RemovalListeners.java b/android/guava/src/com/google/common/cache/RemovalListeners.java
index d0623e7..38edf35 100644
--- a/android/guava/src/com/google/common/cache/RemovalListeners.java
+++ b/android/guava/src/com/google/common/cache/RemovalListeners.java
@@ -39,20 +39,10 @@
    * @param executor the executor with which removal notifications are asynchronously executed
    */
   public static <K, V> RemovalListener<K, V> asynchronous(
-      final RemovalListener<K, V> listener, final Executor executor) {
+      RemovalListener<K, V> listener, Executor executor) {
     checkNotNull(listener);
     checkNotNull(executor);
-    return new RemovalListener<K, V>() {
-      @Override
-      public void onRemoval(final RemovalNotification<K, V> notification) {
-        executor.execute(
-            new Runnable() {
-              @Override
-              public void run() {
-                listener.onRemoval(notification);
-              }
-            });
-      }
-    };
+    return (RemovalNotification<K, V> notification) ->
+        executor.execute(() -> listener.onRemoval(notification));
   }
 }
diff --git a/android/guava/src/com/google/common/cache/RemovalNotification.java b/android/guava/src/com/google/common/cache/RemovalNotification.java
index dab7fe5..b96fc57 100644
--- a/android/guava/src/com/google/common/cache/RemovalNotification.java
+++ b/android/guava/src/com/google/common/cache/RemovalNotification.java
@@ -47,7 +47,7 @@
    */
   public static <K, V> RemovalNotification<K, V> create(
       @CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
-    return new RemovalNotification(key, value, cause);
+    return new RemovalNotification<>(key, value, cause);
   }
 
   private RemovalNotification(@CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
diff --git a/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java b/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
index fd4fce2..621e8f9 100644
--- a/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
@@ -56,7 +56,7 @@
 
   @Override
   NavigableSet<E> createElementSet() {
-    return new SortedMultisets.NavigableElementSet<E>(this);
+    return new SortedMultisets.NavigableElementSet<>(this);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/collect/ArrayListMultimap.java b/android/guava/src/com/google/common/collect/ArrayListMultimap.java
index 33f4c75..349f407 100644
--- a/android/guava/src/com/google/common/collect/ArrayListMultimap.java
+++ b/android/guava/src/com/google/common/collect/ArrayListMultimap.java
@@ -53,8 +53,7 @@
  * with a call to {@link Multimaps#synchronizedListMultimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/ArrayTable.java b/android/guava/src/com/google/common/collect/ArrayTable.java
index ebc9fa0..aa04287 100644
--- a/android/guava/src/com/google/common/collect/ArrayTable.java
+++ b/android/guava/src/com/google/common/collect/ArrayTable.java
@@ -83,7 +83,7 @@
  * thread that reads from another.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @since 10.0
diff --git a/android/guava/src/com/google/common/collect/CartesianList.java b/android/guava/src/com/google/common/collect/CartesianList.java
index 475b3f2..4c31b12 100644
--- a/android/guava/src/com/google/common/collect/CartesianList.java
+++ b/android/guava/src/com/google/common/collect/CartesianList.java
@@ -45,7 +45,7 @@
       }
       axesBuilder.add(copy);
     }
-    return new CartesianList<E>(axesBuilder.build());
+    return new CartesianList<>(axesBuilder.build());
   }
 
   CartesianList(ImmutableList<List<E>> axes) {
@@ -112,7 +112,7 @@
   }
 
   @Override
-  public ImmutableList<E> get(final int index) {
+  public ImmutableList<E> get(int index) {
     checkElementIndex(index, size());
     return new ImmutableList<E>() {
 
diff --git a/android/guava/src/com/google/common/collect/Collections2.java b/android/guava/src/com/google/common/collect/Collections2.java
index 1e651b5..8d799d5 100644
--- a/android/guava/src/com/google/common/collect/Collections2.java
+++ b/android/guava/src/com/google/common/collect/Collections2.java
@@ -695,7 +695,8 @@
     return true;
   }
 
-  private static <E> ObjectCountHashMap<E> counts(Collection<E> collection) {
+  private static <E extends @Nullable Object> ObjectCountHashMap<E> counts(
+      Collection<E> collection) {
     ObjectCountHashMap<E> map = new ObjectCountHashMap<>();
     for (E e : collection) {
       map.put(e, map.get(e) + 1);
diff --git a/android/guava/src/com/google/common/collect/Comparators.java b/android/guava/src/com/google/common/collect/Comparators.java
index 6a5670c..0c79a8c 100644
--- a/android/guava/src/com/google/common/collect/Comparators.java
+++ b/android/guava/src/com/google/common/collect/Comparators.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
@@ -39,7 +38,6 @@
  * @since 21.0
  * @author Louis Wasserman
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class Comparators {
@@ -121,7 +119,6 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
    * @since 30.0
    */
-  @Beta
   public static <T extends Comparable<? super T>> T min(T a, T b) {
     return (a.compareTo(b) <= 0) ? a : b;
   }
@@ -141,7 +138,6 @@
    *     comparator.
    * @since 30.0
    */
-  @Beta
   @ParametricNullness
   public static <T extends @Nullable Object> T min(
       @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
@@ -161,7 +157,6 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
    * @since 30.0
    */
-  @Beta
   public static <T extends Comparable<? super T>> T max(T a, T b) {
     return (a.compareTo(b) >= 0) ? a : b;
   }
@@ -181,7 +176,6 @@
    *     comparator.
    * @since 30.0
    */
-  @Beta
   @ParametricNullness
   public static <T extends @Nullable Object> T max(
       @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
diff --git a/android/guava/src/com/google/common/collect/ComparisonChain.java b/android/guava/src/com/google/common/collect/ComparisonChain.java
index 32aeb4d..9c05205 100644
--- a/android/guava/src/com/google/common/collect/ComparisonChain.java
+++ b/android/guava/src/com/google/common/collect/ComparisonChain.java
@@ -49,7 +49,7 @@
  * the presence of expensive {@code compareTo} and {@code compare} implementations.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CommonObjectUtilitiesExplained#comparecompareto"> {@code
+ * "https://github.com/google/guava/wiki/CommonObjectUtilitiesExplained#comparecompareto">{@code
  * ComparisonChain}</a>.
  *
  * @author Mark Davis
diff --git a/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java b/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
index ab03ead..4724841 100644
--- a/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
+++ b/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
@@ -49,8 +49,7 @@
  * {@code Multiset} operations (exceptions where noted). Null elements are not supported.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Cliff L. Biffle
  * @author mike nonemacher
@@ -88,7 +87,7 @@
     // TODO(schmoe): provide a way to use this class with other (possibly arbitrary)
     // ConcurrentMap implementors. One possibility is to extract most of this class into
     // an AbstractConcurrentMapMultiset.
-    return new ConcurrentHashMultiset<E>(new ConcurrentHashMap<E, AtomicInteger>());
+    return new ConcurrentHashMultiset<>(new ConcurrentHashMap<E, AtomicInteger>());
   }
 
   /**
@@ -121,7 +120,7 @@
    */
   @Beta
   public static <E> ConcurrentHashMultiset<E> create(ConcurrentMap<E, AtomicInteger> countMap) {
-    return new ConcurrentHashMultiset<E>(countMap);
+    return new ConcurrentHashMultiset<>(countMap);
   }
 
   @VisibleForTesting
@@ -449,7 +448,7 @@
 
   @Override
   Set<E> createElementSet() {
-    final Set<E> delegate = countMap.keySet();
+    Set<E> delegate = countMap.keySet();
     return new ForwardingSet<E>() {
       @Override
       protected Set<E> delegate() {
@@ -504,7 +503,7 @@
   Iterator<Entry<E>> entryIterator() {
     // AbstractIterator makes this fairly clean, but it doesn't support remove(). To support
     // remove(), we create an AbstractIterator, and then use ForwardingIterator to delegate to it.
-    final Iterator<Entry<E>> readOnlyIterator =
+    Iterator<Entry<E>> readOnlyIterator =
         new AbstractIterator<Entry<E>>() {
           private final Iterator<Map.Entry<E, AtomicInteger>> mapEntries =
               countMap.entrySet().iterator();
diff --git a/android/guava/src/com/google/common/collect/ContiguousSet.java b/android/guava/src/com/google/common/collect/ContiguousSet.java
index cd77042..b3e4889 100644
--- a/android/guava/src/com/google/common/collect/ContiguousSet.java
+++ b/android/guava/src/com/google/common/collect/ContiguousSet.java
@@ -242,7 +242,7 @@
   @Override
   @GwtIncompatible // NavigableSet
   ImmutableSortedSet<C> createDescendingSet() {
-    return new DescendingImmutableSortedSet<C>(this);
+    return new DescendingImmutableSortedSet<>(this);
   }
 
   /** Returns a short-hand representation of the contents such as {@code "[1..100]"}. */
diff --git a/android/guava/src/com/google/common/collect/Cut.java b/android/guava/src/com/google/common/collect/Cut.java
index 4a8d4c7..21fe5ff 100644
--- a/android/guava/src/com/google/common/collect/Cut.java
+++ b/android/guava/src/com/google/common/collect/Cut.java
@@ -308,7 +308,7 @@
   }
 
   static <C extends Comparable> Cut<C> belowValue(C endpoint) {
-    return new BelowValue<C>(endpoint);
+    return new BelowValue<>(endpoint);
   }
 
   private static final class BelowValue<C extends Comparable> extends Cut<C> {
@@ -392,7 +392,7 @@
   }
 
   static <C extends Comparable> Cut<C> aboveValue(C endpoint) {
-    return new AboveValue<C>(endpoint);
+    return new AboveValue<>(endpoint);
   }
 
   private static final class AboveValue<C extends Comparable> extends Cut<C> {
diff --git a/android/guava/src/com/google/common/collect/DescendingMultiset.java b/android/guava/src/com/google/common/collect/DescendingMultiset.java
index ec5a1d0..7db0fbb 100644
--- a/android/guava/src/com/google/common/collect/DescendingMultiset.java
+++ b/android/guava/src/com/google/common/collect/DescendingMultiset.java
@@ -54,7 +54,7 @@
   public NavigableSet<E> elementSet() {
     NavigableSet<E> result = elementSet;
     if (result == null) {
-      return elementSet = new SortedMultisets.NavigableElementSet<E>(this);
+      return elementSet = new SortedMultisets.NavigableElementSet<>(this);
     }
     return result;
   }
diff --git a/android/guava/src/com/google/common/collect/DiscreteDomain.java b/android/guava/src/com/google/common/collect/DiscreteDomain.java
index bce7062..222ebe5 100644
--- a/android/guava/src/com/google/common/collect/DiscreteDomain.java
+++ b/android/guava/src/com/google/common/collect/DiscreteDomain.java
@@ -37,7 +37,7 @@
  * represent partial domains such as "prime integers" or "strings of length 5."
  *
  * <p>See the Guava User Guide section on <a href=
- * "https://github.com/google/guava/wiki/RangesExplained#discrete-domains"> {@code
+ * "https://github.com/google/guava/wiki/RangesExplained#discrete-domains">{@code
  * DiscreteDomain}</a>.
  *
  * @author Kevin Bourrillion
diff --git a/android/guava/src/com/google/common/collect/EmptyContiguousSet.java b/android/guava/src/com/google/common/collect/EmptyContiguousSet.java
index f4fe33c..50d7b12 100644
--- a/android/guava/src/com/google/common/collect/EmptyContiguousSet.java
+++ b/android/guava/src/com/google/common/collect/EmptyContiguousSet.java
@@ -150,7 +150,7 @@
     }
 
     private Object readResolve() {
-      return new EmptyContiguousSet<C>(domain);
+      return new EmptyContiguousSet<>(domain);
     }
 
     private static final long serialVersionUID = 0;
@@ -159,7 +159,7 @@
   @GwtIncompatible // serialization
   @Override
   Object writeReplace() {
-    return new SerializedForm<C>(domain);
+    return new SerializedForm<>(domain);
   }
 
   @GwtIncompatible // NavigableSet
diff --git a/android/guava/src/com/google/common/collect/EnumBiMap.java b/android/guava/src/com/google/common/collect/EnumBiMap.java
index 82aa052..97d3c2e 100644
--- a/android/guava/src/com/google/common/collect/EnumBiMap.java
+++ b/android/guava/src/com/google/common/collect/EnumBiMap.java
@@ -32,7 +32,7 @@
  * An {@code EnumBiMap} and its inverse are both serializable.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap}</a>.
  *
  * @author Mike Bostock
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/EnumHashBiMap.java b/android/guava/src/com/google/common/collect/EnumHashBiMap.java
index f68bc4c..5fbbb70 100644
--- a/android/guava/src/com/google/common/collect/EnumHashBiMap.java
+++ b/android/guava/src/com/google/common/collect/EnumHashBiMap.java
@@ -36,7 +36,7 @@
  * EnumHashBiMap} and its inverse are both serializable.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap}</a>.
  *
  * @author Mike Bostock
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/EnumMultiset.java b/android/guava/src/com/google/common/collect/EnumMultiset.java
index 0fed4ad..57a3a87 100644
--- a/android/guava/src/com/google/common/collect/EnumMultiset.java
+++ b/android/guava/src/com/google/common/collect/EnumMultiset.java
@@ -37,8 +37,7 @@
  * in O(1).
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/EvictingQueue.java b/android/guava/src/com/google/common/collect/EvictingQueue.java
index 45f59f3..5667dfa 100644
--- a/android/guava/src/com/google/common/collect/EvictingQueue.java
+++ b/android/guava/src/com/google/common/collect/EvictingQueue.java
@@ -54,7 +54,7 @@
 
   private EvictingQueue(int maxSize) {
     checkArgument(maxSize >= 0, "maxSize (%s) must >= 0", maxSize);
-    this.delegate = new ArrayDeque<E>(maxSize);
+    this.delegate = new ArrayDeque<>(maxSize);
     this.maxSize = maxSize;
   }
 
@@ -65,7 +65,7 @@
    * queue.
    */
   public static <E> EvictingQueue<E> create(int maxSize) {
-    return new EvictingQueue<E>(maxSize);
+    return new EvictingQueue<>(maxSize);
   }
 
   /**
diff --git a/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java b/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java
index 3ff00b7..de946a2 100644
--- a/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java
@@ -118,7 +118,7 @@
   }
 
   @Override
-  public Collection<V> get(@ParametricNullness final K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     return filterCollection(unfiltered.get(key), new ValuePredicate(key));
   }
 
@@ -396,15 +396,11 @@
           return FilteredEntryMultimap.this.keySet().size();
         }
 
-        private boolean removeEntriesIf(final Predicate<? super Multiset.Entry<K>> predicate) {
+        private boolean removeEntriesIf(Predicate<? super Multiset.Entry<K>> predicate) {
           return FilteredEntryMultimap.this.removeEntriesIf(
-              new Predicate<Map.Entry<K, Collection<V>>>() {
-                @Override
-                public boolean apply(Map.Entry<K, Collection<V>> entry) {
-                  return predicate.apply(
-                      Multisets.immutableEntry(entry.getKey(), entry.getValue().size()));
-                }
-              });
+              (Map.Entry<K, Collection<V>> entry) ->
+                  predicate.apply(
+                      Multisets.immutableEntry(entry.getKey(), entry.getValue().size())));
         }
 
         @Override
diff --git a/android/guava/src/com/google/common/collect/GeneralRange.java b/android/guava/src/com/google/common/collect/GeneralRange.java
index 20cf4fb..3d7256f 100644
--- a/android/guava/src/com/google/common/collect/GeneralRange.java
+++ b/android/guava/src/com/google/common/collect/GeneralRange.java
@@ -46,7 +46,7 @@
 
     T upperEndpoint = range.hasUpperBound() ? range.upperEndpoint() : null;
     BoundType upperBoundType = range.hasUpperBound() ? range.upperBoundType() : OPEN;
-    return new GeneralRange<T>(
+    return new GeneralRange<>(
         Ordering.natural(),
         range.hasLowerBound(),
         lowerEndpoint,
@@ -58,7 +58,7 @@
 
   /** Returns the whole range relative to the specified comparator. */
   static <T extends @Nullable Object> GeneralRange<T> all(Comparator<? super T> comparator) {
-    return new GeneralRange<T>(comparator, false, null, OPEN, false, null, OPEN);
+    return new GeneralRange<>(comparator, false, null, OPEN, false, null, OPEN);
   }
 
   /**
@@ -67,7 +67,7 @@
    */
   static <T extends @Nullable Object> GeneralRange<T> downTo(
       Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
-    return new GeneralRange<T>(comparator, true, endpoint, boundType, false, null, OPEN);
+    return new GeneralRange<>(comparator, true, endpoint, boundType, false, null, OPEN);
   }
 
   /**
@@ -76,7 +76,7 @@
    */
   static <T extends @Nullable Object> GeneralRange<T> upTo(
       Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
-    return new GeneralRange<T>(comparator, false, null, OPEN, true, endpoint, boundType);
+    return new GeneralRange<>(comparator, false, null, OPEN, true, endpoint, boundType);
   }
 
   /**
@@ -89,7 +89,7 @@
       BoundType lowerType,
       @ParametricNullness T upper,
       BoundType upperType) {
-    return new GeneralRange<T>(comparator, true, lower, lowerType, true, upper, upperType);
+    return new GeneralRange<>(comparator, true, lower, lowerType, true, upper, upperType);
   }
 
   private final Comparator<? super T> comparator;
@@ -138,7 +138,7 @@
       checkArgument(
           cmp <= 0, "lowerEndpoint (%s) > upperEndpoint (%s)", lowerEndpoint, upperEndpoint);
       if (cmp == 0) {
-        checkArgument(lowerBoundType != OPEN | upperBoundType != OPEN);
+        checkArgument(lowerBoundType != OPEN || upperBoundType != OPEN);
       }
     }
   }
@@ -233,7 +233,7 @@
       }
     }
 
-    return new GeneralRange<T>(comparator, hasLowBound, lowEnd, lowType, hasUpBound, upEnd, upType);
+    return new GeneralRange<>(comparator, hasLowBound, lowEnd, lowType, hasUpBound, upEnd, upType);
   }
 
   @Override
@@ -268,7 +268,7 @@
     GeneralRange<T> result = reverse;
     if (result == null) {
       result =
-          new GeneralRange<T>(
+          new GeneralRange<>(
               Ordering.from(comparator).reverse(),
               hasUpperBound,
               getUpperEndpoint(),
diff --git a/android/guava/src/com/google/common/collect/HashBasedTable.java b/android/guava/src/com/google/common/collect/HashBasedTable.java
index c8ba50f..21882e6 100644
--- a/android/guava/src/com/google/common/collect/HashBasedTable.java
+++ b/android/guava/src/com/google/common/collect/HashBasedTable.java
@@ -41,7 +41,7 @@
  * concurrently and one of the threads modifies the table, it must be synchronized externally.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @since 7.0
diff --git a/android/guava/src/com/google/common/collect/HashBiMap.java b/android/guava/src/com/google/common/collect/HashBiMap.java
index 010f73c..8639cb0 100644
--- a/android/guava/src/com/google/common/collect/HashBiMap.java
+++ b/android/guava/src/com/google/common/collect/HashBiMap.java
@@ -46,7 +46,7 @@
  * <p>This implementation guarantees insertion-based iteration order of its keys.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap} </a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap} </a>.
  *
  * @author Louis Wasserman
  * @author Mike Bostock
diff --git a/android/guava/src/com/google/common/collect/ImmutableBiMap.java b/android/guava/src/com/google/common/collect/ImmutableBiMap.java
index bbae036..1de5bd1 100644
--- a/android/guava/src/com/google/common/collect/ImmutableBiMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableBiMap.java
@@ -448,10 +448,30 @@
       if (size == 0) {
         return of();
       }
-      sortEntries();
+      if (valueComparator != null) {
+        if (entriesUsed) {
+          alternatingKeysAndValues = Arrays.copyOf(alternatingKeysAndValues, 2 * size);
+        }
+        sortEntries(alternatingKeysAndValues, size, valueComparator);
+      }
       entriesUsed = true;
       return new RegularImmutableBiMap<K, V>(alternatingKeysAndValues, size);
     }
+
+    /**
+     * Throws {@link UnsupportedOperationException}. This method is inherited from {@link
+     * ImmutableMap.Builder}, but it does not make sense for bimaps.
+     *
+     * @throws UnsupportedOperationException always
+     * @deprecated This method does not make sense for bimaps and should not be called.
+     * @since 31.1
+     */
+    @DoNotCall
+    @Deprecated
+    @Override
+    public ImmutableBiMap<K, V> buildKeepingLast() {
+      throw new UnsupportedOperationException("Not supported for bimaps");
+    }
   }
 
   /**
diff --git a/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java b/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
index aeabe5d..c59e9fd 100644
--- a/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
@@ -62,7 +62,7 @@
    */
   public static <B, T extends B> ImmutableClassToInstanceMap<B> of(Class<T> type, T value) {
     ImmutableMap<Class<? extends B>, B> map = ImmutableMap.<Class<? extends B>, B>of(type, value);
-    return new ImmutableClassToInstanceMap<B>(map);
+    return new ImmutableClassToInstanceMap<>(map);
   }
 
   /**
@@ -70,7 +70,7 @@
    * Builder} constructor.
    */
   public static <B> Builder<B> builder() {
-    return new Builder<B>();
+    return new Builder<>();
   }
 
   /**
@@ -131,11 +131,11 @@
      * @throws IllegalArgumentException if duplicate keys were added
      */
     public ImmutableClassToInstanceMap<B> build() {
-      ImmutableMap<Class<? extends B>, B> map = mapBuilder.build();
+      ImmutableMap<Class<? extends B>, B> map = mapBuilder.buildOrThrow();
       if (map.isEmpty()) {
         return of();
       } else {
-        return new ImmutableClassToInstanceMap<B>(map);
+        return new ImmutableClassToInstanceMap<>(map);
       }
     }
   }
diff --git a/android/guava/src/com/google/common/collect/ImmutableCollection.java b/android/guava/src/com/google/common/collect/ImmutableCollection.java
index b5ac2a1..d5420e0 100644
--- a/android/guava/src/com/google/common/collect/ImmutableCollection.java
+++ b/android/guava/src/com/google/common/collect/ImmutableCollection.java
@@ -156,7 +156,7 @@
  * <h3>See also</h3>
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @since 2.0
  */
diff --git a/android/guava/src/com/google/common/collect/ImmutableList.java b/android/guava/src/com/google/common/collect/ImmutableList.java
index 6ebd733..e336424 100644
--- a/android/guava/src/com/google/common/collect/ImmutableList.java
+++ b/android/guava/src/com/google/common/collect/ImmutableList.java
@@ -48,7 +48,7 @@
  * {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @see ImmutableMap
  * @see ImmutableSet
diff --git a/android/guava/src/com/google/common/collect/ImmutableListMultimap.java b/android/guava/src/com/google/common/collect/ImmutableListMultimap.java
index cc0a910..20408db 100644
--- a/android/guava/src/com/google/common/collect/ImmutableListMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableListMultimap.java
@@ -39,7 +39,7 @@
  * detailed at {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @since 2.0
@@ -301,7 +301,7 @@
       }
     }
 
-    return new ImmutableListMultimap<>(builder.build(), size);
+    return new ImmutableListMultimap<>(builder.buildOrThrow(), size);
   }
 
   ImmutableListMultimap(ImmutableMap<K, ImmutableList<V>> map, int size) {
@@ -414,7 +414,7 @@
 
     ImmutableMap<Object, ImmutableList<Object>> tmpMap;
     try {
-      tmpMap = builder.build();
+      tmpMap = builder.buildOrThrow();
     } catch (IllegalArgumentException e) {
       throw (InvalidObjectException) new InvalidObjectException(e.getMessage()).initCause(e);
     }
diff --git a/android/guava/src/com/google/common/collect/ImmutableMap.java b/android/guava/src/com/google/common/collect/ImmutableMap.java
index fd87e0b..1746ae0 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMap.java
@@ -33,12 +33,15 @@
 import java.io.Serializable;
 import java.util.AbstractMap;
 import java.util.Arrays;
+import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.SortedMap;
 import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -48,7 +51,7 @@
  * {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jesse Wilson
  * @author Kevin Bourrillion
@@ -337,7 +340,7 @@
   }
 
   static void checkNoConflict(
-      boolean safe, String conflictDescription, Entry<?, ?> entry1, Entry<?, ?> entry2) {
+      boolean safe, String conflictDescription, Object entry1, Object entry2) {
     if (!safe) {
       throw conflictException(conflictDescription, entry1, entry2);
     }
@@ -384,6 +387,11 @@
     @Nullable Object[] alternatingKeysAndValues;
     int size;
     boolean entriesUsed;
+    /**
+     * If non-null, a duplicate key we found in a previous buildKeepingLast() or buildOrThrow()
+     * call. A later buildOrThrow() can simply report this duplicate immediately.
+     */
+    @Nullable DuplicateKey duplicateKey;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
@@ -412,8 +420,9 @@
     }
 
     /**
-     * Associates {@code key} with {@code value} in the built map. Duplicate keys are not allowed,
-     * and will cause {@link #build} to fail.
+     * Associates {@code key} with {@code value} in the built map. If the same key is put more than
+     * once, {@link #buildOrThrow} will fail, while {@link #buildKeepingLast} will keep the last
+     * value put for that key.
      */
     @CanIgnoreReturnValue
     public Builder<K, V> put(K key, V value) {
@@ -426,8 +435,9 @@
     }
 
     /**
-     * Adds the given {@code entry} to the map, making it immutable if necessary. Duplicate keys are
-     * not allowed, and will cause {@link #build} to fail.
+     * Adds the given {@code entry} to the map, making it immutable if necessary. If the same key is
+     * put more than once, {@link #buildOrThrow} will fail, while {@link #buildKeepingLast} will
+     * keep the last value put for that key.
      *
      * @since 11.0
      */
@@ -437,8 +447,9 @@
     }
 
     /**
-     * Associates all of the given map's keys and values in the built map. Duplicate keys are not
-     * allowed, and will cause {@link #build} to fail.
+     * Associates all of the given map's keys and values in the built map. If the same key is put
+     * more than once, {@link #buildOrThrow} will fail, while {@link #buildKeepingLast} will keep
+     * the last value put for that key.
      *
      * @throws NullPointerException if any key or value in {@code map} is null
      */
@@ -448,8 +459,9 @@
     }
 
     /**
-     * Adds all of the given entries to the built map. Duplicate keys are not allowed, and will
-     * cause {@link #build} to fail.
+     * Adds all of the given entries to the built map. If the same key is put more than once, {@link
+     * #buildOrThrow} will fail, while {@link #buildKeepingLast} will keep the last value put for
+     * that key.
      *
      * @throws NullPointerException if any key, value, or entry is null
      * @since 19.0
@@ -498,10 +510,46 @@
       return this;
     }
 
-    /*
-     * TODO(kevinb): Should build() and the ImmutableBiMap & ImmutableSortedMap
-     * versions throw an IllegalStateException instead?
-     */
+    private ImmutableMap<K, V> build(boolean throwIfDuplicateKeys) {
+      if (throwIfDuplicateKeys && duplicateKey != null) {
+        throw duplicateKey.exception();
+      }
+      /*
+       * If entries is full, then this implementation may end up using the entries array
+       * directly and writing over the entry objects with non-terminal entries, but this is
+       * safe; if this Builder is used further, it will grow the entries array (so it can't
+       * affect the original array), and future build() calls will always copy any entry
+       * objects that cannot be safely reused.
+       */
+      // localAlternatingKeysAndValues is an alias for the alternatingKeysAndValues field, except if
+      // we end up removing duplicates in a copy of the array.
+      @Nullable Object[] localAlternatingKeysAndValues;
+      int localSize = size;
+      if (valueComparator == null) {
+        localAlternatingKeysAndValues = alternatingKeysAndValues;
+      } else {
+        if (entriesUsed) {
+          alternatingKeysAndValues = Arrays.copyOf(alternatingKeysAndValues, 2 * size);
+        }
+        localAlternatingKeysAndValues = alternatingKeysAndValues;
+        if (!throwIfDuplicateKeys) {
+          // We want to retain only the last-put value for any given key, before sorting.
+          // This could be improved, but orderEntriesByValue is rather rarely used anyway.
+          localAlternatingKeysAndValues = lastEntryForEachKey(localAlternatingKeysAndValues, size);
+          if (localAlternatingKeysAndValues.length < alternatingKeysAndValues.length) {
+            localSize = localAlternatingKeysAndValues.length >>> 1;
+          }
+        }
+        sortEntries(localAlternatingKeysAndValues, localSize, valueComparator);
+      }
+      entriesUsed = true;
+      ImmutableMap<K, V> map =
+          RegularImmutableMap.create(localSize, localAlternatingKeysAndValues, this);
+      if (throwIfDuplicateKeys && duplicateKey != null) {
+        throw duplicateKey.exception();
+      }
+      return map;
+    }
 
     /**
      * Returns a newly-created immutable map. The iteration order of the returned map is the order
@@ -527,39 +575,91 @@
      * @throws IllegalArgumentException if duplicate keys were added
      * @since 31.0
      */
-    @SuppressWarnings("unchecked")
     public ImmutableMap<K, V> buildOrThrow() {
-      /*
-       * If entries is full, then this implementation may end up using the entries array
-       * directly and writing over the entry objects with non-terminal entries, but this is
-       * safe; if this Builder is used further, it will grow the entries array (so it can't
-       * affect the original array), and future build() calls will always copy any entry
-       * objects that cannot be safely reused.
-       */
-      sortEntries();
-      entriesUsed = true;
-      return RegularImmutableMap.create(size, alternatingKeysAndValues);
+      return build(true);
     }
 
-    void sortEntries() {
-      if (valueComparator != null) {
-        if (entriesUsed) {
-          alternatingKeysAndValues = Arrays.copyOf(alternatingKeysAndValues, 2 * size);
+    /**
+     * Returns a newly-created immutable map, using the last value for any key that was added more
+     * than once. The iteration order of the returned map is the order in which entries were
+     * inserted into the builder, unless {@link #orderEntriesByValue} was called, in which case
+     * entries are sorted by value. If a key was added more than once, it appears in iteration order
+     * based on the first time it was added, again unless {@link #orderEntriesByValue} was called.
+     *
+     * <p>In the current implementation, all values associated with a given key are stored in the
+     * {@code Builder} object, even though only one of them will be used in the built map. If there
+     * can be many repeated keys, it may be more space-efficient to use a {@link
+     * java.util.LinkedHashMap LinkedHashMap} and {@link ImmutableMap#copyOf(Map)} rather than
+     * {@code ImmutableMap.Builder}.
+     *
+     * @since 31.1
+     */
+    public ImmutableMap<K, V> buildKeepingLast() {
+      return build(false);
+    }
+
+    static <V> void sortEntries(
+        @Nullable Object[] alternatingKeysAndValues,
+        int size,
+        Comparator<? super V> valueComparator) {
+      @SuppressWarnings({"rawtypes", "unchecked"})
+      Entry<Object, V>[] entries = new Entry[size];
+      for (int i = 0; i < size; i++) {
+        // requireNonNull is safe because the first `2*size` elements have been filled in.
+        Object key = requireNonNull(alternatingKeysAndValues[2 * i]);
+        @SuppressWarnings("unchecked")
+        V value = (V) requireNonNull(alternatingKeysAndValues[2 * i + 1]);
+        entries[i] = new AbstractMap.SimpleImmutableEntry<Object, V>(key, value);
+      }
+      Arrays.sort(
+          entries, 0, size, Ordering.from(valueComparator).onResultOf(Maps.<V>valueFunction()));
+      for (int i = 0; i < size; i++) {
+        alternatingKeysAndValues[2 * i] = entries[i].getKey();
+        alternatingKeysAndValues[2 * i + 1] = entries[i].getValue();
+      }
+    }
+
+    private @Nullable Object[] lastEntryForEachKey(
+        @Nullable Object[] localAlternatingKeysAndValues, int size) {
+      Set<Object> seenKeys = new HashSet<>();
+      BitSet dups = new BitSet(); // slots that are overridden by a later duplicate key
+      for (int i = size - 1; i >= 0; i--) {
+        Object key = requireNonNull(localAlternatingKeysAndValues[2 * i]);
+        if (!seenKeys.add(key)) {
+          dups.set(i);
         }
-        Entry<K, V>[] entries = new Entry[size];
-        for (int i = 0; i < size; i++) {
-          // requireNonNull is safe because the first `2*size` elements have been filled in.
-          entries[i] =
-              new AbstractMap.SimpleImmutableEntry<K, V>(
-                  (K) requireNonNull(alternatingKeysAndValues[2 * i]),
-                  (V) requireNonNull(alternatingKeysAndValues[2 * i + 1]));
+      }
+      if (dups.isEmpty()) {
+        return localAlternatingKeysAndValues;
+      }
+      Object[] newAlternatingKeysAndValues = new Object[(size - dups.cardinality()) * 2];
+      for (int inI = 0, outI = 0; inI < size * 2; ) {
+        if (dups.get(inI >>> 1)) {
+          inI += 2;
+        } else {
+          newAlternatingKeysAndValues[outI++] =
+              requireNonNull(localAlternatingKeysAndValues[inI++]);
+          newAlternatingKeysAndValues[outI++] =
+              requireNonNull(localAlternatingKeysAndValues[inI++]);
         }
-        Arrays.sort(
-            entries, 0, size, Ordering.from(valueComparator).onResultOf(Maps.<V>valueFunction()));
-        for (int i = 0; i < size; i++) {
-          alternatingKeysAndValues[2 * i] = entries[i].getKey();
-          alternatingKeysAndValues[2 * i + 1] = entries[i].getValue();
-        }
+      }
+      return newAlternatingKeysAndValues;
+    }
+
+    static final class DuplicateKey {
+      private final Object key;
+      private final Object value1;
+      private final Object value2;
+
+      DuplicateKey(Object key, Object value1, Object value2) {
+        this.key = key;
+        this.value1 = value1;
+        this.value2 = value2;
+      }
+
+      IllegalArgumentException exception() {
+        return new IllegalArgumentException(
+            "Multiple entries with same key: " + key + "=" + value1 + " and " + key + "=" + value2);
       }
     }
   }
@@ -730,6 +830,31 @@
   // @Override under Java 8 / API Level 24
   @CheckForNull
   public final V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
+    /*
+     * Even though it's weird to pass a defaultValue that is null, some callers do so. Those who
+     * pass a literal "null" should probably just use `get`, but I would expect other callers to
+     * pass an expression that *might* be null. This could happen with:
+     *
+     * - a `getFooOrDefault(@CheckForNull Foo defaultValue)` method that returns
+     *   `map.getOrDefault(FOO_KEY, defaultValue)`
+     *
+     * - a call that consults a chain of maps, as in `mapA.getOrDefault(key, mapB.getOrDefault(key,
+     *   ...))`
+     *
+     * So it makes sense for the parameter (and thus the return type) to be @CheckForNull.
+     *
+     * Two other points:
+     *
+     * 1. We'll want to use something like @PolyNull once we can make that work for the various
+     * platforms we target.
+     *
+     * 2. Kotlin's Map type has a getOrDefault method that accepts and returns a "plain V," in
+     * contrast to the "V?" type that we're using. As a result, Kotlin sees a conflict between the
+     * nullness annotations in ImmutableMap and those in its own Map type. In response, it considers
+     * the parameter and return type both to be platform types. As a result, Kotlin permits calls
+     * that can lead to NullPointerException. That's unfortunate. But hopefully most Kotlin callers
+     * use `get(key) ?: defaultValue` instead of this method, anyway.
+     */
     V result = get(key);
     // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
     if (result != null) {
@@ -969,7 +1094,7 @@
         builder.put(keyIter.next(), valueIter.next());
       }
 
-      return builder.build();
+      return builder.buildOrThrow();
     }
 
     @SuppressWarnings("unchecked")
@@ -982,7 +1107,7 @@
       for (int i = 0; i < keys.length; i++) {
         builder.put(keys[i], values[i]);
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
 
     /**
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultimap.java b/android/guava/src/com/google/common/collect/ImmutableMultimap.java
index 04a6c4a..fa1f3a4 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultimap.java
@@ -62,7 +62,7 @@
  * immediately after the last entry having that key.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultiset.java b/android/guava/src/com/google/common/collect/ImmutableMultiset.java
index d7febe2..ab281d4 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultiset.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultiset.java
@@ -31,6 +31,7 @@
 import java.util.Iterator;
 import java.util.Set;
 import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Multiset} whose contents will never change, with many other important properties
@@ -41,7 +42,7 @@
  * element when the multiset was created.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -282,7 +283,7 @@
 
   @GwtIncompatible // not present in emulated superclass
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     for (Multiset.Entry<E> entry : entrySet()) {
       Arrays.fill(dst, offset, offset + entry.getCount(), entry.getElement());
       offset += entry.getCount();
diff --git a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
index 18cb2ef..1f655e2 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
@@ -47,7 +47,7 @@
  * Undefined behavior and bugs will result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Mike Ward
  * @since 2.0
@@ -343,7 +343,7 @@
       }
     }
 
-    return new ImmutableSetMultimap<>(builder.build(), size, valueComparator);
+    return new ImmutableSetMultimap<>(builder.buildOrThrow(), size, valueComparator);
   }
 
   /**
@@ -549,7 +549,7 @@
 
     ImmutableMap<Object, ImmutableSet<Object>> tmpMap;
     try {
-      tmpMap = builder.build();
+      tmpMap = builder.buildOrThrow();
     } catch (IllegalArgumentException e) {
       throw (InvalidObjectException) new InvalidObjectException(e.getMessage()).initCause(e);
     }
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedMap.java b/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
index ac5f0bc..709504e 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
@@ -47,7 +47,7 @@
  * not correctly obey its specification.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -742,6 +742,24 @@
               ImmutableList.<V>asImmutableList(sortedValues));
       }
     }
+
+    /**
+     * Throws UnsupportedOperationException. A future version may support this operation. Then the
+     * value for any given key will be the one that was last supplied in a {@code put} operation for
+     * that key.
+     *
+     * @throws UnsupportedOperationException always
+     * @since 31.1
+     * @deprecated This method is not currently implemented, and may never be.
+     */
+    @DoNotCall
+    @Deprecated
+    @Override
+    public final ImmutableSortedMap<K, V> buildKeepingLast() {
+      // TODO(emcmanus): implement
+      throw new UnsupportedOperationException(
+          "ImmutableSortedMap.Builder does not yet implement buildKeepingLast()");
+    }
   }
 
   private final transient RegularImmutableSortedSet<K> keySet;
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java b/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
index 5a7529e..2889a50 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
@@ -43,7 +43,7 @@
  * collection will not correctly obey its specification.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Louis Wasserman
  * @since 12.0
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedSet.java b/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
index fabf599..a21227d 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
@@ -49,7 +49,7 @@
  * collection will not correctly obey its specification.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
diff --git a/android/guava/src/com/google/common/collect/ImmutableTable.java b/android/guava/src/com/google/common/collect/ImmutableTable.java
index 9dcb50c..224df09 100644
--- a/android/guava/src/com/google/common/collect/ImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/ImmutableTable.java
@@ -35,7 +35,7 @@
  * at {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Gregory Kick
  * @since 11.0
diff --git a/android/guava/src/com/google/common/collect/Interners.java b/android/guava/src/com/google/common/collect/Interners.java
index a3ae374..10ae274 100644
--- a/android/guava/src/com/google/common/collect/Interners.java
+++ b/android/guava/src/com/google/common/collect/Interners.java
@@ -81,7 +81,7 @@
       if (!strong) {
         mapMaker.weakKeys();
       }
-      return new InternerImpl<E>(mapMaker);
+      return new InternerImpl<>(mapMaker);
     }
   }
 
@@ -158,7 +158,7 @@
    * @since 8.0
    */
   public static <E> Function<E, E> asFunction(Interner<E> interner) {
-    return new InternerFunction<E>(checkNotNull(interner));
+    return new InternerFunction<>(checkNotNull(interner));
   }
 
   private static class InternerFunction<E> implements Function<E, E> {
diff --git a/android/guava/src/com/google/common/collect/Iterables.java b/android/guava/src/com/google/common/collect/Iterables.java
index 2b4edb2..08f8d45 100644
--- a/android/guava/src/com/google/common/collect/Iterables.java
+++ b/android/guava/src/com/google/common/collect/Iterables.java
@@ -54,7 +54,7 @@
  * absolutely necessary.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables">{@code
  * Iterables}</a>.
  *
  * @author Kevin Bourrillion
@@ -549,6 +549,10 @@
    * <p>Iterators returned by the returned iterable do not support the {@link Iterator#remove()}
    * method. The returned lists implement {@link RandomAccess}, whether or not the input list does.
    *
+   * <p><b>Note:</b> The current implementation eagerly allocates storage for {@code size} elements.
+   * As a consequence, passing values like {@code Integer.MAX_VALUE} can lead to {@link
+   * OutOfMemoryError}.
+   *
    * <p><b>Note:</b> if {@code iterable} is a {@link List}, use {@link Lists#partition(List, int)}
    * instead.
    *
diff --git a/android/guava/src/com/google/common/collect/Iterators.java b/android/guava/src/com/google/common/collect/Iterators.java
index 5ea2da9..2f9fd3b 100644
--- a/android/guava/src/com/google/common/collect/Iterators.java
+++ b/android/guava/src/com/google/common/collect/Iterators.java
@@ -60,7 +60,7 @@
  * necessary.
  *
  * <p>See the Guava User Guide section on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables">{@code
  * Iterators}</a>.
  *
  * @author Kevin Bourrillion
@@ -127,7 +127,7 @@
 
   /** Returns an unmodifiable view of {@code iterator}. */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> unmodifiableIterator(
-      final Iterator<? extends T> iterator) {
+      Iterator<? extends T> iterator) {
     checkNotNull(iterator);
     if (iterator instanceof UnmodifiableIterator) {
       @SuppressWarnings("unchecked") // Since it's unmodifiable, the covariant cast is safe
@@ -397,7 +397,7 @@
    * should use an explicit {@code break} or be certain that you will eventually remove all the
    * elements.
    */
-  public static <T extends @Nullable Object> Iterator<T> cycle(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterator<T> cycle(Iterable<T> iterable) {
     checkNotNull(iterable);
     return new Iterator<T>() {
       Iterator<T> iterator = emptyModifiableIterator();
@@ -462,8 +462,7 @@
    *
    * <p>This is mainly just to avoid the intermediate ArrayDeque in ConsumingQueueIterator.
    */
-  private static <I extends Iterator<?>> Iterator<I> consumingForArray(
-      final @Nullable I... elements) {
+  private static <I extends Iterator<?>> Iterator<I> consumingForArray(@Nullable I... elements) {
     return new UnmodifiableIterator<I>() {
       int index = 0;
 
@@ -566,7 +565,7 @@
    */
   public static <T extends @Nullable Object> Iterator<T> concat(
       Iterator<? extends Iterator<? extends T>> inputs) {
-    return new ConcatenatedIterator<T>(inputs);
+    return new ConcatenatedIterator<>(inputs);
   }
 
   /** Concats a varargs array of iterators without making a defensive copy of the array. */
@@ -586,6 +585,10 @@
    *
    * <p>The returned lists implement {@link java.util.RandomAccess}.
    *
+   * <p><b>Note:</b> The current implementation eagerly allocates storage for {@code size} elements.
+   * As a consequence, passing values like {@code Integer.MAX_VALUE} can lead to {@link
+   * OutOfMemoryError}.
+   *
    * @param iterator the iterator to return a partitioned view of
    * @param size the desired size of each partition (the last may be smaller)
    * @return an iterator of immutable lists containing the elements of {@code iterator} divided into
@@ -617,7 +620,7 @@
   }
 
   private static <T extends @Nullable Object> UnmodifiableIterator<List<@Nullable T>> partitionImpl(
-      final Iterator<T> iterator, final int size, final boolean pad) {
+      Iterator<T> iterator, int size, boolean pad) {
     checkNotNull(iterator);
     checkArgument(size > 0);
     return new UnmodifiableIterator<List<@Nullable T>>() {
@@ -658,7 +661,7 @@
    * {@code retainIfTrue}.
    */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> filter(
-      final Iterator<T> unfiltered, final Predicate<? super T> retainIfTrue) {
+      Iterator<T> unfiltered, Predicate<? super T> retainIfTrue) {
     checkNotNull(unfiltered);
     checkNotNull(retainIfTrue);
     return new AbstractIterator<T>() {
@@ -817,7 +820,7 @@
    * element.
    */
   public static <F extends @Nullable Object, T extends @Nullable Object> Iterator<T> transform(
-      final Iterator<F> fromIterator, final Function<? super F, ? extends T> function) {
+      Iterator<F> fromIterator, Function<? super F, ? extends T> function) {
     checkNotNull(function);
     return new TransformedIterator<F, T>(fromIterator) {
       @ParametricNullness
@@ -952,7 +955,7 @@
    * @since 3.0
    */
   public static <T extends @Nullable Object> Iterator<T> limit(
-      final Iterator<T> iterator, final int limitSize) {
+      Iterator<T> iterator, int limitSize) {
     checkNotNull(iterator);
     checkArgument(limitSize >= 0, "limit is negative");
     return new Iterator<T>() {
@@ -991,8 +994,7 @@
    * @return an iterator that removes and returns elements from the supplied iterator
    * @since 2.0
    */
-  public static <T extends @Nullable Object> Iterator<T> consumingIterator(
-      final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Iterator<T> consumingIterator(Iterator<T> iterator) {
     checkNotNull(iterator);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -1052,7 +1054,7 @@
    * {@link ImmutableList#copyOf(Object[])}}, or {@link ImmutableList#of}.
    */
   @SafeVarargs
-  public static <T extends @Nullable Object> UnmodifiableIterator<T> forArray(final T... array) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> forArray(T... array) {
     return forArray(array, 0, array.length, 0);
   }
 
@@ -1064,7 +1066,7 @@
    * Arrays.asList(array).subList(offset, offset + length).listIterator(index)}.
    */
   static <T extends @Nullable Object> UnmodifiableListIterator<T> forArray(
-      final T[] array, final int offset, int length, int index) {
+      T[] array, int offset, int length, int index) {
     checkArgument(length >= 0);
     int end = offset + length;
 
@@ -1074,7 +1076,7 @@
     if (length == 0) {
       return emptyListIterator();
     }
-    return new ArrayItr<T>(array, offset, length, index);
+    return new ArrayItr<>(array, offset, length, index);
   }
 
   private static final class ArrayItr<T extends @Nullable Object>
@@ -1103,7 +1105,7 @@
    * <p>The {@link Iterable} equivalent of this method is {@link Collections#singleton}.
    */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> singletonIterator(
-      @ParametricNullness final T value) {
+      @ParametricNullness T value) {
     return new UnmodifiableIterator<T>() {
       boolean done;
 
@@ -1135,7 +1137,7 @@
    * return an {@code UnmodifiableIterator} instead of a plain {@code Iterator}.
    */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> forEnumeration(
-      final Enumeration<T> enumeration) {
+      Enumeration<T> enumeration) {
     checkNotNull(enumeration);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -1157,8 +1159,7 @@
    * <p>The {@code Iterable} equivalent of this method is either {@link Collections#enumeration} (if
    * you have a {@link Collection}), or {@code Iterators.asEnumeration(collection.iterator())}.
    */
-  public static <T extends @Nullable Object> Enumeration<T> asEnumeration(
-      final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Enumeration<T> asEnumeration(Iterator<T> iterator) {
     checkNotNull(iterator);
     return new Enumeration<T>() {
       @Override
@@ -1266,7 +1267,7 @@
       PeekingImpl<T> peeking = (PeekingImpl<T>) iterator;
       return peeking;
     }
-    return new PeekingImpl<T>(iterator);
+    return new PeekingImpl<>(iterator);
   }
 
   /**
@@ -1299,7 +1300,7 @@
     checkNotNull(iterators, "iterators");
     checkNotNull(comparator, "comparator");
 
-    return new MergingIterator<T>(iterators, comparator);
+    return new MergingIterator<>(iterators, comparator);
   }
 
   /**
@@ -1315,17 +1316,12 @@
     final Queue<PeekingIterator<T>> queue;
 
     public MergingIterator(
-        Iterable<? extends Iterator<? extends T>> iterators,
-        final Comparator<? super T> itemComparator) {
+        Iterable<? extends Iterator<? extends T>> iterators, Comparator<? super T> itemComparator) {
       // A comparator that's used by the heap, allowing the heap
       // to be sorted based on the top of each iterator.
       Comparator<PeekingIterator<T>> heapComparator =
-          new Comparator<PeekingIterator<T>>() {
-            @Override
-            public int compare(PeekingIterator<T> o1, PeekingIterator<T> o2) {
-              return itemComparator.compare(o1.peek(), o2.peek());
-            }
-          };
+          (PeekingIterator<T> o1, PeekingIterator<T> o2) ->
+              itemComparator.compare(o1.peek(), o2.peek());
 
       queue = new PriorityQueue<>(2, heapComparator);
 
diff --git a/android/guava/src/com/google/common/collect/LinkedHashMultimap.java b/android/guava/src/com/google/common/collect/LinkedHashMultimap.java
index b0f1302..11cddc3 100644
--- a/android/guava/src/com/google/common/collect/LinkedHashMultimap.java
+++ b/android/guava/src/com/google/common/collect/LinkedHashMultimap.java
@@ -72,8 +72,7 @@
  * result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
diff --git a/android/guava/src/com/google/common/collect/LinkedHashMultiset.java b/android/guava/src/com/google/common/collect/LinkedHashMultiset.java
index 9630786..97595a9 100644
--- a/android/guava/src/com/google/common/collect/LinkedHashMultiset.java
+++ b/android/guava/src/com/google/common/collect/LinkedHashMultiset.java
@@ -27,8 +27,7 @@
  * element will appear at the end of the iteration.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Kevin Bourrillion
  * @author Jared Levy
diff --git a/android/guava/src/com/google/common/collect/LinkedListMultimap.java b/android/guava/src/com/google/common/collect/LinkedListMultimap.java
index 31874b2..338c547 100644
--- a/android/guava/src/com/google/common/collect/LinkedListMultimap.java
+++ b/android/guava/src/com/google/common/collect/LinkedListMultimap.java
@@ -88,8 +88,7 @@
  * with a call to {@link Multimaps#synchronizedListMultimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Mike Bostock
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/ListMultimap.java b/android/guava/src/com/google/common/collect/ListMultimap.java
index 1686068..29e5807 100644
--- a/android/guava/src/com/google/common/collect/ListMultimap.java
+++ b/android/guava/src/com/google/common/collect/ListMultimap.java
@@ -34,8 +34,7 @@
  * {@link #asMap} has {@code List} values.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/Lists.java b/android/guava/src/com/google/common/collect/Lists.java
index a583950..34fc225 100644
--- a/android/guava/src/com/google/common/collect/Lists.java
+++ b/android/guava/src/com/google/common/collect/Lists.java
@@ -56,7 +56,7 @@
  * {@link Sets}, {@link Maps} and {@link Queues}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#lists"> {@code Lists}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#lists">{@code Lists}</a>.
  *
  * @author Kevin Bourrillion
  * @author Mike Bostock
@@ -75,9 +75,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableList#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code ArrayList} {@linkplain ArrayList#ArrayList() constructor}
-   * directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code ArrayList} {@linkplain ArrayList#ArrayList() constructor} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> ArrayList<E> newArrayList() {
@@ -117,10 +117,9 @@
    * ImmutableList#copyOf(Iterable)} instead. (Or, change {@code elements} to be a {@link
    * FluentIterable} and call {@code elements.toList()}.)
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Use the {@code ArrayList} {@linkplain ArrayList#ArrayList(Collection)
-   * constructor} directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond"
-   * syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method. Use
+   * the {@code ArrayList} {@linkplain ArrayList#ArrayList(Collection) constructor} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> ArrayList<E> newArrayList(
@@ -159,11 +158,11 @@
    * Creates an {@code ArrayList} instance backed by an array with the specified initial size;
    * simply delegates to {@link ArrayList#ArrayList(int)}.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use {@code new }{@link ArrayList#ArrayList(int) ArrayList}{@code <>(int)}
-   * directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
-   * (Unlike here, there is no risk of overload ambiguity, since the {@code ArrayList} constructors
-   * very wisely did not accept varargs.)
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use {@code new }{@link ArrayList#ArrayList(int) ArrayList}{@code <>(int)} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>. (Unlike here, there is no risk
+   * of overload ambiguity, since the {@code ArrayList} constructors very wisely did not accept
+   * varargs.)
    *
    * @param initialArraySize the exact size of the initial backing array for the returned array list
    *     ({@code ArrayList} documentation calls this value the "capacity")
@@ -209,10 +208,9 @@
    * outperform {@code LinkedList} except in certain rare and specific situations. Unless you have
    * spent a lot of time benchmarking your specific needs, use one of those instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedList} {@linkplain LinkedList#LinkedList()
-   * constructor} directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond"
-   * syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedList} {@linkplain LinkedList#LinkedList() constructor} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> LinkedList<E> newLinkedList() {
@@ -231,10 +229,9 @@
    * outperform {@code LinkedList} except in certain rare and specific situations. Unless you have
    * spent a lot of time benchmarking your specific needs, use one of those instead.
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Use the {@code LinkedList} {@linkplain LinkedList#LinkedList(Collection)
-   * constructor} directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond"
-   * syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method. Use
+   * the {@code LinkedList} {@linkplain LinkedList#LinkedList(Collection) constructor} directly,
+   * taking advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> LinkedList<E> newLinkedList(
diff --git a/android/guava/src/com/google/common/collect/MapMakerInternalMap.java b/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
index 4e66a84..bdef10e 100644
--- a/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
+++ b/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
@@ -47,7 +47,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.concurrent.locks.ReentrantLock;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * The concurrent hash map implementation built by {@link MapMaker}.
@@ -295,13 +295,13 @@
     /**
      * Returns a freshly created entry, typed at the {@code E} type, for the given {@code segment}.
      */
-    E newEntry(S segment, K key, int hash, @NullableDecl E next);
+    E newEntry(S segment, K key, int hash, @CheckForNull E next);
 
     /**
      * Returns a freshly created entry, typed at the {@code E} type, for the given {@code segment},
      * that is a copy of the given {@code entry}.
      */
-    E copy(S segment, E entry, @NullableDecl E newNext);
+    E copy(S segment, E entry, @CheckForNull E newNext);
 
     /**
      * Sets the value of the given {@code entry} in the given {@code segment} to be the given {@code
@@ -343,9 +343,9 @@
       implements InternalEntry<K, V, E> {
     final K key;
     final int hash;
-    @NullableDecl final E next;
+    @CheckForNull final E next;
 
-    AbstractStrongKeyEntry(K key, int hash, @NullableDecl E next) {
+    AbstractStrongKeyEntry(K key, int hash, @CheckForNull E next) {
       this.key = key;
       this.hash = hash;
       this.next = next;
@@ -393,14 +393,14 @@
   static final class StrongKeyStrongValueEntry<K, V>
       extends AbstractStrongKeyEntry<K, V, StrongKeyStrongValueEntry<K, V>>
       implements StrongValueEntry<K, V, StrongKeyStrongValueEntry<K, V>> {
-    @NullableDecl private volatile V value = null;
+    @CheckForNull private volatile V value = null;
 
-    StrongKeyStrongValueEntry(K key, int hash, @NullableDecl StrongKeyStrongValueEntry<K, V> next) {
+    StrongKeyStrongValueEntry(K key, int hash, @CheckForNull StrongKeyStrongValueEntry<K, V> next) {
       super(key, hash, next);
     }
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public V getValue() {
       return value;
     }
@@ -451,7 +451,7 @@
       public StrongKeyStrongValueEntry<K, V> copy(
           StrongKeyStrongValueSegment<K, V> segment,
           StrongKeyStrongValueEntry<K, V> entry,
-          @NullableDecl StrongKeyStrongValueEntry<K, V> newNext) {
+          @CheckForNull StrongKeyStrongValueEntry<K, V> newNext) {
         return entry.copy(newNext);
       }
 
@@ -468,7 +468,7 @@
           StrongKeyStrongValueSegment<K, V> segment,
           K key,
           int hash,
-          @NullableDecl StrongKeyStrongValueEntry<K, V> next) {
+          @CheckForNull StrongKeyStrongValueEntry<K, V> next) {
         return new StrongKeyStrongValueEntry<>(key, hash, next);
       }
     }
@@ -481,7 +481,7 @@
     private volatile WeakValueReference<K, V, StrongKeyWeakValueEntry<K, V>> valueReference =
         unsetWeakValueReference();
 
-    StrongKeyWeakValueEntry(K key, int hash, @NullableDecl StrongKeyWeakValueEntry<K, V> next) {
+    StrongKeyWeakValueEntry(K key, int hash, @CheckForNull StrongKeyWeakValueEntry<K, V> next) {
       super(key, hash, next);
     }
 
@@ -547,7 +547,7 @@
       public StrongKeyWeakValueEntry<K, V> copy(
           StrongKeyWeakValueSegment<K, V> segment,
           StrongKeyWeakValueEntry<K, V> entry,
-          @NullableDecl StrongKeyWeakValueEntry<K, V> newNext) {
+          @CheckForNull StrongKeyWeakValueEntry<K, V> newNext) {
         if (Segment.isCollected(entry)) {
           return null;
         }
@@ -565,7 +565,7 @@
           StrongKeyWeakValueSegment<K, V> segment,
           K key,
           int hash,
-          @NullableDecl StrongKeyWeakValueEntry<K, V> next) {
+          @CheckForNull StrongKeyWeakValueEntry<K, V> next) {
         return new StrongKeyWeakValueEntry<>(key, hash, next);
       }
     }
@@ -575,7 +575,7 @@
   static final class StrongKeyDummyValueEntry<K>
       extends AbstractStrongKeyEntry<K, Dummy, StrongKeyDummyValueEntry<K>>
       implements StrongValueEntry<K, Dummy, StrongKeyDummyValueEntry<K>> {
-    StrongKeyDummyValueEntry(K key, int hash, @NullableDecl StrongKeyDummyValueEntry<K> next) {
+    StrongKeyDummyValueEntry(K key, int hash, @CheckForNull StrongKeyDummyValueEntry<K> next) {
       super(key, hash, next);
     }
 
@@ -627,7 +627,7 @@
       public StrongKeyDummyValueEntry<K> copy(
           StrongKeyDummyValueSegment<K> segment,
           StrongKeyDummyValueEntry<K> entry,
-          @NullableDecl StrongKeyDummyValueEntry<K> newNext) {
+          @CheckForNull StrongKeyDummyValueEntry<K> newNext) {
         return entry.copy(newNext);
       }
 
@@ -640,7 +640,7 @@
           StrongKeyDummyValueSegment<K> segment,
           K key,
           int hash,
-          @NullableDecl StrongKeyDummyValueEntry<K> next) {
+          @CheckForNull StrongKeyDummyValueEntry<K> next) {
         return new StrongKeyDummyValueEntry<K>(key, hash, next);
       }
     }
@@ -650,9 +650,9 @@
   abstract static class AbstractWeakKeyEntry<K, V, E extends InternalEntry<K, V, E>>
       extends WeakReference<K> implements InternalEntry<K, V, E> {
     final int hash;
-    @NullableDecl final E next;
+    @CheckForNull final E next;
 
-    AbstractWeakKeyEntry(ReferenceQueue<K> queue, K key, int hash, @NullableDecl E next) {
+    AbstractWeakKeyEntry(ReferenceQueue<K> queue, K key, int hash, @CheckForNull E next) {
       super(key, queue);
       this.hash = hash;
       this.next = next;
@@ -679,7 +679,7 @@
       extends AbstractWeakKeyEntry<K, Dummy, WeakKeyDummyValueEntry<K>>
       implements StrongValueEntry<K, Dummy, WeakKeyDummyValueEntry<K>> {
     WeakKeyDummyValueEntry(
-        ReferenceQueue<K> queue, K key, int hash, @NullableDecl WeakKeyDummyValueEntry<K> next) {
+        ReferenceQueue<K> queue, K key, int hash, @CheckForNull WeakKeyDummyValueEntry<K> next) {
       super(queue, key, hash, next);
     }
 
@@ -731,7 +731,7 @@
       public WeakKeyDummyValueEntry<K> copy(
           WeakKeyDummyValueSegment<K> segment,
           WeakKeyDummyValueEntry<K> entry,
-          @NullableDecl WeakKeyDummyValueEntry<K> newNext) {
+          @CheckForNull WeakKeyDummyValueEntry<K> newNext) {
         if (entry.getKey() == null) {
           // key collected
           return null;
@@ -748,7 +748,7 @@
           WeakKeyDummyValueSegment<K> segment,
           K key,
           int hash,
-          @NullableDecl WeakKeyDummyValueEntry<K> next) {
+          @CheckForNull WeakKeyDummyValueEntry<K> next) {
         return new WeakKeyDummyValueEntry<K>(segment.queueForKeys, key, hash, next);
       }
     }
@@ -758,18 +758,18 @@
   static final class WeakKeyStrongValueEntry<K, V>
       extends AbstractWeakKeyEntry<K, V, WeakKeyStrongValueEntry<K, V>>
       implements StrongValueEntry<K, V, WeakKeyStrongValueEntry<K, V>> {
-    @NullableDecl private volatile V value = null;
+    @CheckForNull private volatile V value = null;
 
     WeakKeyStrongValueEntry(
         ReferenceQueue<K> queue,
         K key,
         int hash,
-        @NullableDecl WeakKeyStrongValueEntry<K, V> next) {
+        @CheckForNull WeakKeyStrongValueEntry<K, V> next) {
       super(queue, key, hash, next);
     }
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public V getValue() {
       return value;
     }
@@ -820,7 +820,7 @@
       public WeakKeyStrongValueEntry<K, V> copy(
           WeakKeyStrongValueSegment<K, V> segment,
           WeakKeyStrongValueEntry<K, V> entry,
-          @NullableDecl WeakKeyStrongValueEntry<K, V> newNext) {
+          @CheckForNull WeakKeyStrongValueEntry<K, V> newNext) {
         if (entry.getKey() == null) {
           // key collected
           return null;
@@ -839,7 +839,7 @@
           WeakKeyStrongValueSegment<K, V> segment,
           K key,
           int hash,
-          @NullableDecl WeakKeyStrongValueEntry<K, V> next) {
+          @CheckForNull WeakKeyStrongValueEntry<K, V> next) {
         return new WeakKeyStrongValueEntry<>(segment.queueForKeys, key, hash, next);
       }
     }
@@ -853,7 +853,7 @@
         unsetWeakValueReference();
 
     WeakKeyWeakValueEntry(
-        ReferenceQueue<K> queue, K key, int hash, @NullableDecl WeakKeyWeakValueEntry<K, V> next) {
+        ReferenceQueue<K> queue, K key, int hash, @CheckForNull WeakKeyWeakValueEntry<K, V> next) {
       super(queue, key, hash, next);
     }
 
@@ -921,7 +921,7 @@
       public WeakKeyWeakValueEntry<K, V> copy(
           WeakKeyWeakValueSegment<K, V> segment,
           WeakKeyWeakValueEntry<K, V> entry,
-          @NullableDecl WeakKeyWeakValueEntry<K, V> newNext) {
+          @CheckForNull WeakKeyWeakValueEntry<K, V> newNext) {
         if (entry.getKey() == null) {
           // key collected
           return null;
@@ -943,7 +943,7 @@
           WeakKeyWeakValueSegment<K, V> segment,
           K key,
           int hash,
-          @NullableDecl WeakKeyWeakValueEntry<K, V> next) {
+          @CheckForNull WeakKeyWeakValueEntry<K, V> next) {
         return new WeakKeyWeakValueEntry<>(segment.queueForKeys, key, hash, next);
       }
     }
@@ -955,7 +955,7 @@
      * Returns the current value being referenced, or {@code null} if there is none (e.g. because
      * either it got collected, or {@link #clear} was called, or it wasn't set in the first place).
      */
-    @NullableDecl
+    @CheckForNull
     V get();
 
     /** Returns the entry which contains this {@link WeakValueReference}. */
@@ -1197,7 +1197,7 @@
     int threshold;
 
     /** The per-segment table. */
-    @NullableDecl volatile AtomicReferenceArray<E> table;
+    @CheckForNull volatile AtomicReferenceArray<E> table;
 
     /** The maximum size of this map. MapMaker.UNSET_INT if there is no maximum. */
     final int maxSegmentSize;
@@ -1305,7 +1305,7 @@
     }
 
     /** Unsafely returns a copy of the given entry. */
-    E copyForTesting(InternalEntry<K, V, ?> entry, @NullableDecl InternalEntry<K, V, ?> newNext) {
+    E copyForTesting(InternalEntry<K, V, ?> entry, @CheckForNull InternalEntry<K, V, ?> newNext) {
       return this.map.entryHelper.copy(self(), castForTesting(entry), castForTesting(newNext));
     }
 
@@ -1315,7 +1315,7 @@
     }
 
     /** Unsafely returns a fresh entry. */
-    E newEntryForTesting(K key, int hash, @NullableDecl InternalEntry<K, V, ?> next) {
+    E newEntryForTesting(K key, int hash, @CheckForNull InternalEntry<K, V, ?> next) {
       return this.map.entryHelper.newEntry(self(), key, hash, castForTesting(next));
     }
 
@@ -1333,7 +1333,7 @@
     /**
      * Unsafely returns the value of the given entry if it's still live, or {@code null} otherwise.
      */
-    @NullableDecl
+    @CheckForNull
     V getLiveValueForTesting(InternalEntry<K, V, ?> entry) {
       return getLiveValue(castForTesting(entry));
     }
@@ -1948,7 +1948,7 @@
      * Gets the value from an entry. Returns {@code null} if the entry is invalid or
      * partially-collected.
      */
-    @NullableDecl
+    @CheckForNull
     V getLiveValue(E entry) {
       if (entry.getKey() == null) {
         tryDrainReferenceQueues();
@@ -2339,7 +2339,7 @@
   }
 
   @Override
-  public V get(@NullableDecl Object key) {
+  public V get(@CheckForNull Object key) {
     if (key == null) {
       return null;
     }
@@ -2351,7 +2351,7 @@
    * Returns the internal entry for the specified key. The entry may be computing or partially
    * collected. Does not impact recency ordering.
    */
-  E getEntry(@NullableDecl Object key) {
+  E getEntry(@CheckForNull Object key) {
     if (key == null) {
       return null;
     }
@@ -2360,7 +2360,7 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     if (key == null) {
       return false;
     }
@@ -2369,7 +2369,7 @@
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     if (value == null) {
       return false;
     }
@@ -2433,7 +2433,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(@NullableDecl Object key) {
+  public V remove(@CheckForNull Object key) {
     if (key == null) {
       return null;
     }
@@ -2443,7 +2443,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(@NullableDecl Object key, @NullableDecl Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     if (key == null || value == null) {
       return false;
     }
@@ -2453,7 +2453,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean replace(K key, @NullableDecl V oldValue, V newValue) {
+  public boolean replace(K key, @CheckForNull V oldValue, V newValue) {
     checkNotNull(key);
     checkNotNull(newValue);
     if (oldValue == null) {
@@ -2479,7 +2479,7 @@
     }
   }
 
-  @NullableDecl transient Set<K> keySet;
+  @CheckForNull transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -2487,7 +2487,7 @@
     return (ks != null) ? ks : (keySet = new KeySet());
   }
 
-  @NullableDecl transient Collection<V> values;
+  @CheckForNull transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -2495,7 +2495,7 @@
     return (vs != null) ? vs : (values = new Values());
   }
 
-  @NullableDecl transient Set<Entry<K, V>> entrySet;
+  @CheckForNull transient Set<Entry<K, V>> entrySet;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -2509,11 +2509,11 @@
 
     int nextSegmentIndex;
     int nextTableIndex;
-    @NullableDecl Segment<K, V, E, S> currentSegment;
-    @NullableDecl AtomicReferenceArray<E> currentTable;
-    @NullableDecl E nextEntry;
-    @NullableDecl WriteThroughEntry nextExternal;
-    @NullableDecl WriteThroughEntry lastReturned;
+    @CheckForNull Segment<K, V, E, S> currentSegment;
+    @CheckForNull AtomicReferenceArray<E> currentTable;
+    @CheckForNull E nextEntry;
+    @CheckForNull WriteThroughEntry nextExternal;
+    @CheckForNull WriteThroughEntry lastReturned;
 
     HashIterator() {
       nextSegmentIndex = segments.length - 1;
@@ -2653,7 +2653,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       // Cannot use key and value equivalence
       if (object instanceof Entry) {
         Entry<?, ?> that = (Entry<?, ?>) object;
diff --git a/android/guava/src/com/google/common/collect/Maps.java b/android/guava/src/com/google/common/collect/Maps.java
index b415f25..76e69ab 100644
--- a/android/guava/src/com/google/common/collect/Maps.java
+++ b/android/guava/src/com/google/common/collect/Maps.java
@@ -72,7 +72,7 @@
  * and {@link Queues}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#maps"> {@code Maps}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#maps">{@code Maps}</a>.
  *
  * @author Kevin Bourrillion
  * @author Mike Bostock
@@ -181,9 +181,9 @@
    *
    * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link #newEnumMap} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code HashMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code HashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code HashMap}
    */
@@ -199,9 +199,9 @@
    *
    * <p><b>Note:</b> if {@code K} is an {@link Enum} type, use {@link #newEnumMap} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code HashMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code HashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the mappings to be placed in the new map
    * @return a new {@code HashMap} initialized with the mappings from {@code map}
@@ -250,9 +250,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableMap#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedHashMap} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedHashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code LinkedHashMap}
    */
@@ -267,9 +267,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableMap#copyOf(Map)} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedHashMap} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedHashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the mappings to be placed in the new map
    * @return a new, {@code LinkedHashMap} initialized with the mappings from {@code map}
@@ -311,9 +311,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableSortedMap#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code TreeMap}
    */
@@ -328,9 +328,9 @@
    * <p><b>Note:</b> if mutability is not required, use {@link
    * ImmutableSortedMap#copyOfSorted(SortedMap)} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the sorted map whose mappings are to be placed in the new map and whose comparator
    *     is to be used to sort the new map
@@ -348,9 +348,9 @@
    * <p><b>Note:</b> if mutability is not required, use {@code
    * ImmutableSortedMap.orderedBy(comparator).build()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param comparator the comparator to sort the keys with
    * @return a new, empty {@code TreeMap}
@@ -379,9 +379,9 @@
   /**
    * Creates an {@code EnumMap} with the same mappings as the specified map.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code EnumMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code EnumMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the map from which to initialize this {@code EnumMap}
    * @return a new {@code EnumMap} initialized with the mappings from {@code map}
@@ -396,9 +396,9 @@
   /**
    * Creates an {@code IdentityHashMap} instance.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code IdentityHashMap} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code IdentityHashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code IdentityHashMap}
    */
@@ -528,7 +528,20 @@
     onlyOnRight.putAll(right); // will whittle it down
     SortedMap<K, V> onBoth = Maps.newTreeMap(comparator);
     SortedMap<K, MapDifference.ValueDifference<V>> differences = Maps.newTreeMap(comparator);
-    doDifference(left, right, Equivalence.equals(), onlyOnLeft, onlyOnRight, onBoth, differences);
+
+    /*
+     * V is a possibly nullable type, but we decided to declare Equivalence with a type parameter
+     * that is restricted to non-nullable types. Still, this code is safe: We made that decision
+     * about Equivalence not because Equivalence is null-hostile but because *every* Equivalence can
+     * handle null inputs -- and thus it would be meaningless for the type system to distinguish
+     * between "an Equivalence for nullable Foo" and "an Equivalence for non-nullable Foo."
+     *
+     * (And the unchecked cast is safe because Equivalence is contravariant.)
+     */
+    @SuppressWarnings({"nullness", "unchecked"})
+    Equivalence<V> equalsEquivalence = (Equivalence<V>) Equivalence.equals();
+
+    doDifference(left, right, equalsEquivalence, onlyOnLeft, onlyOnRight, onBoth, differences);
     return new SortedMapDifferenceImpl<>(onlyOnLeft, onlyOnRight, onBoth, differences);
   }
 
@@ -1220,13 +1233,13 @@
   public static <K, V> ImmutableMap<K, V> toMap(
       Iterator<K> keys, Function<? super K, V> valueFunction) {
     checkNotNull(valueFunction);
-    // Using LHM instead of a builder so as not to fail on duplicate keys
-    Map<K, V> builder = newLinkedHashMap();
+    ImmutableMap.Builder<K, V> builder = ImmutableMap.builder();
     while (keys.hasNext()) {
       K key = keys.next();
       builder.put(key, valueFunction.apply(key));
     }
-    return ImmutableMap.copyOf(builder);
+    // Using buildKeepingLast() so as not to fail on duplicate keys
+    return builder.buildKeepingLast();
   }
 
   /**
@@ -1303,7 +1316,7 @@
       builder.put(keyFunction.apply(value), value);
     }
     try {
-      return builder.build();
+      return builder.buildOrThrow();
     } catch (IllegalArgumentException duplicateKeys) {
       throw new IllegalArgumentException(
           duplicateKeys.getMessage()
@@ -1356,7 +1369,7 @@
       builder.put(key, requireNonNull(properties.getProperty(key)));
     }
 
-    return builder.build();
+    return builder.buildOrThrow();
   }
 
   /**
@@ -4337,7 +4350,7 @@
     for (E e : list) {
       builder.put(e, i++);
     }
-    return builder.build();
+    return builder.buildOrThrow();
   }
 
   /**
diff --git a/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java b/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
index cd01279..181b3fb 100644
--- a/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
+++ b/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
@@ -131,7 +131,7 @@
    * instead.
    */
   public static <B> Builder<B> orderedBy(Comparator<B> comparator) {
-    return new Builder<B>(comparator);
+    return new Builder<>(comparator);
   }
 
   /**
@@ -216,7 +216,7 @@
      */
     public <T extends B> MinMaxPriorityQueue<T> create(Iterable<? extends T> initialContents) {
       MinMaxPriorityQueue<T> queue =
-          new MinMaxPriorityQueue<T>(
+          new MinMaxPriorityQueue<>(
               this, initialQueueSize(expectedSize, maximumSize, initialContents));
       for (T element : initialContents) {
         queue.offer(element);
@@ -436,11 +436,11 @@
       // Last element is moved to before index, swapped with trickled element.
       if (changes == null) {
         // The trickled element is still after index.
-        return new MoveDesc<E>(actualLastElement, toTrickle);
+        return new MoveDesc<>(actualLastElement, toTrickle);
       } else {
         // The trickled element is back before index, but the replaced element
         // has now been moved after index.
-        return new MoveDesc<E>(actualLastElement, changes.replaced);
+        return new MoveDesc<>(actualLastElement, changes.replaced);
       }
     }
     // Trickled element was after index to begin with, no adjustment needed.
@@ -560,7 +560,7 @@
       }
       // bubble it up the opposite heap
       if (otherHeap.bubbleUpAlternatingLevels(crossOver, toTrickle) < removeIndex) {
-        return new MoveDesc<E>(toTrickle, parent);
+        return new MoveDesc<>(toTrickle, parent);
       } else {
         return null;
       }
@@ -815,8 +815,8 @@
         if (moved != null) {
           // Either both are null or neither is, but we check both to satisfy the nullness checker.
           if (forgetMeNot == null || skipMe == null) {
-            forgetMeNot = new ArrayDeque<E>();
-            skipMe = new ArrayList<E>(3);
+            forgetMeNot = new ArrayDeque<>();
+            skipMe = new ArrayList<>(3);
           }
           if (!foundAndRemovedExactReference(skipMe, moved.toTrickle)) {
             forgetMeNot.add(moved.toTrickle);
diff --git a/android/guava/src/com/google/common/collect/Multimap.java b/android/guava/src/com/google/common/collect/Multimap.java
index 09aa287..41aed97 100644
--- a/android/guava/src/com/google/common/collect/Multimap.java
+++ b/android/guava/src/com/google/common/collect/Multimap.java
@@ -151,8 +151,7 @@
  * {@link UnsupportedOperationException}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/MultimapBuilder.java b/android/guava/src/com/google/common/collect/MultimapBuilder.java
index dddae28..3d6278a 100644
--- a/android/guava/src/com/google/common/collect/MultimapBuilder.java
+++ b/android/guava/src/com/google/common/collect/MultimapBuilder.java
@@ -84,7 +84,7 @@
    *
    * @throws IllegalArgumentException if {@code expectedKeys < 0}
    */
-  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys(int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
     return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
@@ -115,7 +115,7 @@
    * multimap, save that if all values associated with a key are removed and then the key is added
    * back into the multimap, that key will come last in the key iteration order.
    */
-  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys(int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
     return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
@@ -154,7 +154,7 @@
    * is not serializable.
    */
   public static <K0 extends @Nullable Object> MultimapBuilderWithKeys<K0> treeKeys(
-      final Comparator<K0> comparator) {
+      Comparator<K0> comparator) {
     checkNotNull(comparator);
     return new MultimapBuilderWithKeys<K0>() {
       @Override
@@ -169,8 +169,7 @@
    *
    * @since 16.0
    */
-  public static <K0 extends Enum<K0>> MultimapBuilderWithKeys<K0> enumKeys(
-      final Class<K0> keyClass) {
+  public static <K0 extends Enum<K0>> MultimapBuilderWithKeys<K0> enumKeys(Class<K0> keyClass) {
     checkNotNull(keyClass);
     return new MultimapBuilderWithKeys<K0>() {
       @SuppressWarnings("unchecked")
@@ -193,7 +192,7 @@
 
     @Override
     public List<V> get() {
-      return new ArrayList<V>(expectedValuesPerKey);
+      return new ArrayList<>(expectedValuesPerKey);
     }
   }
 
@@ -251,7 +250,7 @@
 
     @Override
     public SortedSet<V> get() {
-      return new TreeSet<V>(comparator);
+      return new TreeSet<>(comparator);
     }
   }
 
@@ -295,8 +294,7 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues(
-        final int expectedValuesPerKey) {
+    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues(int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
       return new ListMultimapBuilder<K0, @Nullable Object>() {
         @Override
@@ -330,7 +328,7 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues(final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues(int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
       return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
@@ -353,8 +351,7 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues(
-        final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues(int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
       return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
@@ -379,7 +376,7 @@
      * comparator} is not serializable.
      */
     public <V0 extends @Nullable Object> SortedSetMultimapBuilder<K0, V0> treeSetValues(
-        final Comparator<V0> comparator) {
+        Comparator<V0> comparator) {
       checkNotNull(comparator, "comparator");
       return new SortedSetMultimapBuilder<K0, V0>() {
         @Override
@@ -391,8 +388,7 @@
     }
 
     /** Uses an {@link EnumSet} to store value collections. */
-    public <V0 extends Enum<V0>> SetMultimapBuilder<K0, V0> enumSetValues(
-        final Class<V0> valueClass) {
+    public <V0 extends Enum<V0>> SetMultimapBuilder<K0, V0> enumSetValues(Class<V0> valueClass) {
       checkNotNull(valueClass, "valueClass");
       return new SetMultimapBuilder<K0, V0>() {
         @Override
diff --git a/android/guava/src/com/google/common/collect/Multimaps.java b/android/guava/src/com/google/common/collect/Multimaps.java
index b0577ea..9976b4a 100644
--- a/android/guava/src/com/google/common/collect/Multimaps.java
+++ b/android/guava/src/com/google/common/collect/Multimaps.java
@@ -58,7 +58,7 @@
  * Provides static methods acting on or generating a {@code Multimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multimaps"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multimaps">{@code
  * Multimaps}</a>.
  *
  * @author Jared Levy
diff --git a/android/guava/src/com/google/common/collect/Multiset.java b/android/guava/src/com/google/common/collect/Multiset.java
index 8dfb1af..f60046f 100644
--- a/android/guava/src/com/google/common/collect/Multiset.java
+++ b/android/guava/src/com/google/common/collect/Multiset.java
@@ -74,8 +74,7 @@
  * {@code Multiset}, {@code AtomicLongMap} does not automatically remove zeros.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Kevin Bourrillion
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/Multisets.java b/android/guava/src/com/google/common/collect/Multisets.java
index 02febca..a9bcb04 100644
--- a/android/guava/src/com/google/common/collect/Multisets.java
+++ b/android/guava/src/com/google/common/collect/Multisets.java
@@ -46,7 +46,7 @@
  * Provides static utility methods for creating and working with {@link Multiset} instances.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multisets"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multisets">{@code
  * Multisets}</a>.
  *
  * @author Kevin Bourrillion
diff --git a/android/guava/src/com/google/common/collect/NullnessCasts.java b/android/guava/src/com/google/common/collect/NullnessCasts.java
index 6ceeda7..4f894db 100644
--- a/android/guava/src/com/google/common/collect/NullnessCasts.java
+++ b/android/guava/src/com/google/common/collect/NullnessCasts.java
@@ -57,7 +57,7 @@
   }
 
   /** Returns {@code null} as any type, even one that does not include {@code null}. */
-  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals"})
+  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals", "ReturnMissingNullable"})
   // The warnings are legitimate. Each time we use this method, we document why.
   @ParametricNullness
   static <T extends @Nullable Object> T unsafeNull() {
diff --git a/android/guava/src/com/google/common/collect/ParametricNullness.java b/android/guava/src/com/google/common/collect/ParametricNullness.java
index b1cda48..94b1bcd 100644
--- a/android/guava/src/com/google/common/collect/ParametricNullness.java
+++ b/android/guava/src/com/google/common/collect/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/collect/PeekingIterator.java b/android/guava/src/com/google/common/collect/PeekingIterator.java
index a274fe4..8524ed7 100644
--- a/android/guava/src/com/google/common/collect/PeekingIterator.java
+++ b/android/guava/src/com/google/common/collect/PeekingIterator.java
@@ -27,7 +27,7 @@
  * An iterator that supports a one-element lookahead while iterating.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionHelpersExplained#peekingiterator"> {@code
+ * "https://github.com/google/guava/wiki/CollectionHelpersExplained#peekingiterator">{@code
  * PeekingIterator}</a>.
  *
  * @author Mick Killianey
diff --git a/android/guava/src/com/google/common/collect/Range.java b/android/guava/src/com/google/common/collect/Range.java
index ab5c077..2a5d464 100644
--- a/android/guava/src/com/google/common/collect/Range.java
+++ b/android/guava/src/com/google/common/collect/Range.java
@@ -16,6 +16,7 @@
 
 package com.google.common.collect;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
@@ -154,7 +155,7 @@
   }
 
   static <C extends Comparable<?>> Range<C> create(Cut<C> lowerBound, Cut<C> upperBound) {
-    return new Range<C>(lowerBound, upperBound);
+    return new Range<>(lowerBound, upperBound);
   }
 
   /**
@@ -556,6 +557,15 @@
     } else {
       Cut<C> newLower = (lowerCmp >= 0) ? lowerBound : connectedRange.lowerBound;
       Cut<C> newUpper = (upperCmp <= 0) ? upperBound : connectedRange.upperBound;
+
+      // create() would catch this, but give a confusing error message
+      checkArgument(
+          newLower.compareTo(newUpper) <= 0,
+          "intersection is undefined for disconnected ranges %s and %s",
+          this,
+          connectedRange);
+
+      // TODO(kevinb): all the precondition checks in the constructor are redundant...
       return create(newLower, newUpper);
     }
   }
diff --git a/android/guava/src/com/google/common/collect/RangeSet.java b/android/guava/src/com/google/common/collect/RangeSet.java
index edb0f79..8d61cf3 100644
--- a/android/guava/src/com/google/common/collect/RangeSet.java
+++ b/android/guava/src/com/google/common/collect/RangeSet.java
@@ -43,7 +43,7 @@
  * <p>For a {@link Set} whose contents are specified by a {@link Range}, see {@link ContiguousSet}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#rangeset"> RangeSets</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#rangeset">RangeSets</a>.
  *
  * @author Kevin Bourrillion
  * @author Louis Wasserman
diff --git a/android/guava/src/com/google/common/collect/RegularContiguousSet.java b/android/guava/src/com/google/common/collect/RegularContiguousSet.java
index 913e2d7..787606e 100644
--- a/android/guava/src/com/google/common/collect/RegularContiguousSet.java
+++ b/android/guava/src/com/google/common/collect/RegularContiguousSet.java
@@ -58,7 +58,7 @@
       C fromElement, boolean fromInclusive, C toElement, boolean toInclusive) {
     if (fromElement.compareTo(toElement) == 0 && !fromInclusive && !toInclusive) {
       // Range would reject our attempt to create (x, x).
-      return new EmptyContiguousSet<C>(domain);
+      return new EmptyContiguousSet<>(domain);
     }
     return intersectionInCurrentDomain(
         Range.range(
@@ -231,14 +231,14 @@
     }
 
     private Object readResolve() {
-      return new RegularContiguousSet<C>(range, domain);
+      return new RegularContiguousSet<>(range, domain);
     }
   }
 
   @GwtIncompatible // serialization
   @Override
   Object writeReplace() {
-    return new SerializedForm<C>(range, domain);
+    return new SerializedForm<>(range, domain);
   }
 
   private static final long serialVersionUID = 0;
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java b/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
index 4607477..2ee752c 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
@@ -55,9 +55,9 @@
     this.keyOffset = 0;
     int tableSize = (size >= 2) ? ImmutableSet.chooseTableSize(size) : 0;
     this.keyHashTable =
-        RegularImmutableMap.createHashTable(alternatingKeysAndValues, size, tableSize, 0);
+        RegularImmutableMap.createHashTableOrThrow(alternatingKeysAndValues, size, tableSize, 0);
     Object valueHashTable =
-        RegularImmutableMap.createHashTable(alternatingKeysAndValues, size, tableSize, 1);
+        RegularImmutableMap.createHashTableOrThrow(alternatingKeysAndValues, size, tableSize, 1);
     this.inverse =
         new RegularImmutableBiMap<V, K>(valueHashTable, alternatingKeysAndValues, size, this);
   }
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableMap.java b/android/guava/src/com/google/common/collect/RegularImmutableMap.java
index d8f9f3b..fc8082c 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableMap.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableMap.java
@@ -71,11 +71,38 @@
   @VisibleForTesting final transient @Nullable Object[] alternatingKeysAndValues;
   private final transient int size;
 
-  @SuppressWarnings("unchecked")
+  /*
+   * We have some considerable complexity in these create methods because of
+   * Builder.buildKeepingLast(). The same Builder might be called with buildKeepingLast() and then
+   * buildOrThrow(), or vice versa. So in particular, if we modify alternatingKeysAndValues to
+   * eliminate duplicate keys (for buildKeepingLast()) then we have to ensure that a later call to
+   * buildOrThrow() will still throw as if the duplicates had not been eliminated. And the exception
+   * message must mention two values that were associated with the duplicate key in two different
+   * calls to Builder.put (though we don't really care *which* two values if there were more than
+   * two). These considerations lead us to have a field of type DuplicateKey in the Builder, which
+   * will remember the first duplicate key we encountered. All later calls to buildOrThrow() can
+   * mention that key with its values. Further duplicates might be added in the meantime but since
+   * builders only ever accumulate entries it will always be valid to throw from buildOrThrow() with
+   * the first duplicate.
+   */
+
+  // This entry point is for callers other than ImmutableMap.Builder.
   static <K, V> RegularImmutableMap<K, V> create(
       int n, @Nullable Object[] alternatingKeysAndValues) {
+    return create(n, alternatingKeysAndValues, /* builder= */ null);
+  }
+
+  // This entry point is used by the other create method but also directly by
+  // ImmutableMap.Builder, so that it can remember any DuplicateKey encountered and produce an
+  // exception for a later buildOrThrow(). If builder is null that means that a duplicate
+  // key will lead to an immediate exception. If it is not null then a duplicate key will instead be
+  // stored in the builder, which may use it to throw an exception later.
+  static <K, V> RegularImmutableMap<K, V> create(
+      int n, @Nullable Object[] alternatingKeysAndValues, @Nullable Builder<K, V> builder) {
     if (n == 0) {
-      return (RegularImmutableMap<K, V>) EMPTY;
+      @SuppressWarnings("unchecked")
+      RegularImmutableMap<K, V> empty = (RegularImmutableMap<K, V>) EMPTY;
+      return empty;
     } else if (n == 1) {
       // requireNonNull is safe because the first `2*n` elements have been filled in.
       checkEntryNotNull(
@@ -84,16 +111,44 @@
     }
     checkPositionIndex(n, alternatingKeysAndValues.length >> 1);
     int tableSize = ImmutableSet.chooseTableSize(n);
-    Object hashTable = createHashTable(alternatingKeysAndValues, n, tableSize, 0);
+    // If there are no duplicate keys, hashTablePlus is the final hashTable value. If there *are*
+    // duplicate keys, hashTablePlus consists of 3 elements: [0] the hashTable; [1] the number of
+    // entries in alternatingKeysAndValues that are still valid after rewriting to remove
+    // duplicates; [2] a Builder.DuplicateKey that records the first duplicate key we encountered
+    // for possible later use in exceptions, perhaps straight away.
+    Object hashTablePlus = createHashTable(alternatingKeysAndValues, n, tableSize, 0);
+    Object hashTable;
+    if (hashTablePlus instanceof Object[]) {
+      Object[] hashTableAndSizeAndDuplicate = (Object[]) hashTablePlus;
+      Builder.DuplicateKey duplicateKey = (Builder.DuplicateKey) hashTableAndSizeAndDuplicate[2];
+      if (builder == null) {
+        throw duplicateKey.exception();
+      }
+      builder.duplicateKey = duplicateKey;
+      hashTable = hashTableAndSizeAndDuplicate[0];
+      n = (Integer) hashTableAndSizeAndDuplicate[1];
+      alternatingKeysAndValues = Arrays.copyOf(alternatingKeysAndValues, n * 2);
+    } else {
+      hashTable = hashTablePlus;
+    }
     return new RegularImmutableMap<K, V>(hashTable, alternatingKeysAndValues, n);
   }
 
   /**
    * Returns a hash table for the specified keys and values, and ensures that neither keys nor
-   * values are null.
+   * values are null. This method may update {@code alternatingKeysAndValues} if there are duplicate
+   * keys. If so, the return value will indicate how many entries are still valid, and will also
+   * include a {@link Builder.DuplicateKey} in case duplicate keys are not allowed now or will not
+   * be allowed on a later {@link Builder#buildOrThrow()} call.
+   *
+   * @param keyOffset 1 if this is the reverse direction of a BiMap, 0 otherwise.
+   * @return an {@code Object} that is a {@code byte[]}, {@code short[]}, or {@code int[]}, the
+   *     smallest possible to fit {@code tableSize}; or an {@code Object[]} where [0] is one of
+   *     these; [1] indicates how many element pairs in {@code alternatingKeysAndValues} are valid;
+   *     and [2] is a {@link Builder.DuplicateKey} for the first duplicate key encountered.
    */
   @CheckForNull
-  static Object createHashTable(
+  private static Object createHashTable(
       @Nullable Object[] alternatingKeysAndValues, int n, int tableSize, int keyOffset) {
     if (n == 1) {
       // for n=1 we don't create a hash table, but we need to do the checkEntryNotNull check!
@@ -104,6 +159,7 @@
       return null;
     }
     int mask = tableSize - 1;
+    Builder.DuplicateKey duplicateKey = null;
     if (tableSize <= BYTE_MAX_SIZE) {
       /*
        * Use 8 bits per entry. The value is unsigned to allow use up to a size of 2^8.
@@ -114,8 +170,11 @@
       byte[] hashTable = new byte[tableSize];
       Arrays.fill(hashTable, ABSENT);
 
+      int outI = 0;
+      entries:
       for (int i = 0; i < n; i++) {
         int keyIndex = 2 * i + keyOffset;
+        int outKeyIndex = 2 * outI + keyOffset;
         // requireNonNull is safe because the first `2*n` elements have been filled in.
         Object key = requireNonNull(alternatingKeysAndValues[keyIndex]);
         Object value = requireNonNull(alternatingKeysAndValues[keyIndex ^ 1]);
@@ -124,14 +183,23 @@
           h &= mask;
           int previousKeyIndex = hashTable[h] & BYTE_MASK; // unsigned read
           if (previousKeyIndex == BYTE_MASK) { // -1 signed becomes 255 unsigned
-            hashTable[h] = (byte) keyIndex;
+            hashTable[h] = (byte) outKeyIndex;
             break;
           } else if (key.equals(alternatingKeysAndValues[previousKeyIndex])) {
-            throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
+            duplicateKey =
+                new Builder.DuplicateKey(
+                    key, value, requireNonNull(alternatingKeysAndValues[previousKeyIndex ^ 1]));
+            alternatingKeysAndValues[previousKeyIndex ^ 1] = value;
+            continue entries;
           }
         }
+        if (outI < i) { // if outI == i don't bother writing the values back where they came from
+          alternatingKeysAndValues[outKeyIndex] = key;
+          alternatingKeysAndValues[outKeyIndex ^ 1] = value;
+        }
+        outI++;
       }
-      return hashTable;
+      return outI == n ? hashTable : new Object[] {hashTable, outI, duplicateKey};
     } else if (tableSize <= SHORT_MAX_SIZE) {
       /*
        * Use 16 bits per entry. The value is unsigned to allow use up to a size of 2^16.
@@ -142,8 +210,11 @@
       short[] hashTable = new short[tableSize];
       Arrays.fill(hashTable, ABSENT);
 
+      int outI = 0;
+      entries:
       for (int i = 0; i < n; i++) {
         int keyIndex = 2 * i + keyOffset;
+        int outKeyIndex = 2 * outI + keyOffset;
         // requireNonNull is safe because the first `2*n` elements have been filled in.
         Object key = requireNonNull(alternatingKeysAndValues[keyIndex]);
         Object value = requireNonNull(alternatingKeysAndValues[keyIndex ^ 1]);
@@ -152,14 +223,23 @@
           h &= mask;
           int previousKeyIndex = hashTable[h] & SHORT_MASK; // unsigned read
           if (previousKeyIndex == SHORT_MASK) { // -1 signed becomes 65_535 unsigned
-            hashTable[h] = (short) keyIndex;
+            hashTable[h] = (short) outKeyIndex;
             break;
           } else if (key.equals(alternatingKeysAndValues[previousKeyIndex])) {
-            throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
+            duplicateKey =
+                new Builder.DuplicateKey(
+                    key, value, requireNonNull(alternatingKeysAndValues[previousKeyIndex ^ 1]));
+            alternatingKeysAndValues[previousKeyIndex ^ 1] = value;
+            continue entries;
           }
         }
+        if (outI < i) { // if outI == i don't bother writing the values back where they came from
+          alternatingKeysAndValues[outKeyIndex] = key;
+          alternatingKeysAndValues[outKeyIndex ^ 1] = value;
+        }
+        outI++;
       }
-      return hashTable;
+      return outI == n ? hashTable : new Object[] {hashTable, outI, duplicateKey};
     } else {
       /*
        * Use 32 bits per entry.
@@ -167,8 +247,11 @@
       int[] hashTable = new int[tableSize];
       Arrays.fill(hashTable, ABSENT);
 
+      int outI = 0;
+      entries:
       for (int i = 0; i < n; i++) {
         int keyIndex = 2 * i + keyOffset;
+        int outKeyIndex = 2 * outI + keyOffset;
         // requireNonNull is safe because the first `2*n` elements have been filled in.
         Object key = requireNonNull(alternatingKeysAndValues[keyIndex]);
         Object value = requireNonNull(alternatingKeysAndValues[keyIndex ^ 1]);
@@ -177,28 +260,36 @@
           h &= mask;
           int previousKeyIndex = hashTable[h];
           if (previousKeyIndex == ABSENT) {
-            hashTable[h] = keyIndex;
+            hashTable[h] = outKeyIndex;
             break;
           } else if (key.equals(alternatingKeysAndValues[previousKeyIndex])) {
-            throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
+            duplicateKey =
+                new Builder.DuplicateKey(
+                    key, value, requireNonNull(alternatingKeysAndValues[previousKeyIndex ^ 1]));
+            alternatingKeysAndValues[previousKeyIndex ^ 1] = value;
+            continue entries;
           }
         }
+        if (outI < i) { // if outI == i don't bother writing the values back where they came from
+          alternatingKeysAndValues[outKeyIndex] = key;
+          alternatingKeysAndValues[outKeyIndex ^ 1] = value;
+        }
+        outI++;
       }
-      return hashTable;
+      return outI == n ? hashTable : new Object[] {hashTable, outI, duplicateKey};
     }
   }
 
-  private static IllegalArgumentException duplicateKeyException(
-      Object key, Object value, @Nullable Object[] alternatingKeysAndValues, int previousKeyIndex) {
-    return new IllegalArgumentException(
-        "Multiple entries with same key: "
-            + key
-            + "="
-            + value
-            + " and "
-            + alternatingKeysAndValues[previousKeyIndex]
-            + "="
-            + alternatingKeysAndValues[previousKeyIndex ^ 1]);
+  @CheckForNull
+  static Object createHashTableOrThrow(
+      @Nullable Object[] alternatingKeysAndValues, int n, int tableSize, int keyOffset) {
+    Object hashTablePlus = createHashTable(alternatingKeysAndValues, n, tableSize, keyOffset);
+    if (hashTablePlus instanceof Object[]) {
+      Object[] hashTableAndSizeAndDuplicate = (Object[]) hashTablePlus;
+      Builder.DuplicateKey duplicateKey = (Builder.DuplicateKey) hashTableAndSizeAndDuplicate[2];
+      throw duplicateKey.exception();
+    }
+    return hashTablePlus;
   }
 
   private RegularImmutableMap(
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java b/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
index dd98798..ef0fbb3 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
@@ -155,7 +155,7 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     return elements.copyIntoArray(dst, offset);
   }
 
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableTable.java b/android/guava/src/com/google/common/collect/RegularImmutableTable.java
index 24434c5..337f123 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableTable.java
@@ -98,8 +98,8 @@
 
   static <R, C, V> RegularImmutableTable<R, C, V> forCells(
       List<Cell<R, C, V>> cells,
-      @CheckForNull final Comparator<? super R> rowComparator,
-      @CheckForNull final Comparator<? super C> columnComparator) {
+      @CheckForNull Comparator<? super R> rowComparator,
+      @CheckForNull Comparator<? super C> columnComparator) {
     checkNotNull(cells);
     if (rowComparator != null || columnComparator != null) {
       /*
@@ -110,20 +110,17 @@
        * column, the rows in the second column, etc.
        */
       Comparator<Cell<R, C, V>> comparator =
-          new Comparator<Cell<R, C, V>>() {
-            @Override
-            public int compare(Cell<R, C, V> cell1, Cell<R, C, V> cell2) {
-              int rowCompare =
-                  (rowComparator == null)
-                      ? 0
-                      : rowComparator.compare(cell1.getRowKey(), cell2.getRowKey());
-              if (rowCompare != 0) {
-                return rowCompare;
-              }
-              return (columnComparator == null)
-                  ? 0
-                  : columnComparator.compare(cell1.getColumnKey(), cell2.getColumnKey());
+          (Cell<R, C, V> cell1, Cell<R, C, V> cell2) -> {
+            int rowCompare =
+                (rowComparator == null)
+                    ? 0
+                    : rowComparator.compare(cell1.getRowKey(), cell2.getRowKey());
+            if (rowCompare != 0) {
+              return rowCompare;
             }
+            return (columnComparator == null)
+                ? 0
+                : columnComparator.compare(cell1.getColumnKey(), cell2.getColumnKey());
           };
       Collections.sort(cells, comparator);
     }
diff --git a/android/guava/src/com/google/common/collect/Serialization.java b/android/guava/src/com/google/common/collect/Serialization.java
index 5e88067..4ab53f2 100644
--- a/android/guava/src/com/google/common/collect/Serialization.java
+++ b/android/guava/src/com/google/common/collect/Serialization.java
@@ -187,10 +187,10 @@
   }
 
   // Secret sauce for setting final fields; don't make it public.
-  static <T> FieldSetter<T> getFieldSetter(final Class<T> clazz, String fieldName) {
+  static <T> FieldSetter<T> getFieldSetter(Class<T> clazz, String fieldName) {
     try {
       Field field = clazz.getDeclaredField(fieldName);
-      return new FieldSetter<T>(field);
+      return new FieldSetter<>(field);
     } catch (NoSuchFieldException e) {
       throw new AssertionError(e); // programmer error
     }
diff --git a/android/guava/src/com/google/common/collect/SetMultimap.java b/android/guava/src/com/google/common/collect/SetMultimap.java
index 216533e..b7a5457 100644
--- a/android/guava/src/com/google/common/collect/SetMultimap.java
+++ b/android/guava/src/com/google/common/collect/SetMultimap.java
@@ -46,8 +46,7 @@
  * that affects its {@link Object#equals} behavior. Undefined behavior and bugs will result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/Sets.java b/android/guava/src/com/google/common/collect/Sets.java
index dde21cb..9948630 100644
--- a/android/guava/src/com/google/common/collect/Sets.java
+++ b/android/guava/src/com/google/common/collect/Sets.java
@@ -57,7 +57,7 @@
  * {@link Lists}, {@link Maps} and {@link Queues}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#sets"> {@code Sets}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#sets">{@code Sets}</a>.
  *
  * @author Kevin Bourrillion
  * @author Jared Levy
@@ -159,9 +159,9 @@
    * using a {@code LinkedHashSet} instead, at the cost of increased memory footprint, to get
    * deterministic iteration behavior.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code HashSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code HashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   public static <E extends @Nullable Object> HashSet<E> newHashSet() {
     return new HashSet<E>();
@@ -198,9 +198,9 @@
    * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link #newEnumSet(Iterable, Class)}
    * instead.
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Instead, use the {@code HashSet} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method.
+   * Instead, use the {@code HashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    */
@@ -285,9 +285,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableSet#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedHashSet} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedHashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code LinkedHashSet}
    */
@@ -301,9 +301,9 @@
    * <p><b>Note:</b> if mutability is not required and the elements are non-null, use {@link
    * ImmutableSet#copyOf(Iterable)} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Instead, use the {@code LinkedHashSet} constructor directly, taking advantage
-   * of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method.
+   * Instead, use the {@code LinkedHashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    *
@@ -345,9 +345,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableSortedSet#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code TreeSet}
    */
@@ -366,9 +366,9 @@
    * method has different behavior than {@link TreeSet#TreeSet(SortedSet)}, which returns a {@code
    * TreeSet} with that comparator.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * <p>This method is just a small convenience for creating an empty set and then calling {@link
    * Iterables#addAll}. This method is not very useful and will likely be deprecated in the future.
@@ -388,11 +388,11 @@
    * <p><b>Note:</b> if mutability is not required, use {@code
    * ImmutableSortedSet.orderedBy(comparator).build()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>. One caveat to this is that the {@code
-   * TreeSet} constructor uses a null {@code Comparator} to mean "natural ordering," whereas this
-   * factory rejects null. Clean your code accordingly.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>. One caveat to this is that the {@code TreeSet}
+   * constructor uses a null {@code Comparator} to mean "natural ordering," whereas this factory
+   * rejects null. Clean your code accordingly.
    *
    * @param comparator the comparator to use to sort the set
    * @return a new, empty {@code TreeSet}
diff --git a/android/guava/src/com/google/common/collect/SortedMultiset.java b/android/guava/src/com/google/common/collect/SortedMultiset.java
index 68932f5..7cc512d 100644
--- a/android/guava/src/com/google/common/collect/SortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/SortedMultiset.java
@@ -37,8 +37,7 @@
  * Collection} contract, which is specified in terms of {@link Object#equals}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Louis Wasserman
  * @since 11.0
diff --git a/android/guava/src/com/google/common/collect/SortedMultisets.java b/android/guava/src/com/google/common/collect/SortedMultisets.java
index 1d1940c..f602a42 100644
--- a/android/guava/src/com/google/common/collect/SortedMultisets.java
+++ b/android/guava/src/com/google/common/collect/SortedMultisets.java
@@ -128,7 +128,7 @@
 
     @Override
     public NavigableSet<E> descendingSet() {
-      return new NavigableElementSet<E>(multiset().descendingMultiset());
+      return new NavigableElementSet<>(multiset().descendingMultiset());
     }
 
     @Override
@@ -154,7 +154,7 @@
         boolean fromInclusive,
         @ParametricNullness E toElement,
         boolean toInclusive) {
-      return new NavigableElementSet<E>(
+      return new NavigableElementSet<>(
           multiset()
               .subMultiset(
                   fromElement, BoundType.forBoolean(fromInclusive),
@@ -163,13 +163,13 @@
 
     @Override
     public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
-      return new NavigableElementSet<E>(
+      return new NavigableElementSet<>(
           multiset().headMultiset(toElement, BoundType.forBoolean(inclusive)));
     }
 
     @Override
     public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
-      return new NavigableElementSet<E>(
+      return new NavigableElementSet<>(
           multiset().tailMultiset(fromElement, BoundType.forBoolean(inclusive)));
     }
   }
diff --git a/android/guava/src/com/google/common/collect/SortedSetMultimap.java b/android/guava/src/com/google/common/collect/SortedSetMultimap.java
index 8449014..8454aec 100644
--- a/android/guava/src/com/google/common/collect/SortedSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/SortedSetMultimap.java
@@ -43,8 +43,7 @@
  * position in the order of the values). Undefined behavior and bugs will result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/SparseImmutableTable.java b/android/guava/src/com/google/common/collect/SparseImmutableTable.java
index b314f7b..44881fd 100644
--- a/android/guava/src/com/google/common/collect/SparseImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/SparseImmutableTable.java
@@ -82,14 +82,14 @@
     for (Entry<R, Map<C, V>> row : rows.entrySet()) {
       rowBuilder.put(row.getKey(), ImmutableMap.copyOf(row.getValue()));
     }
-    this.rowMap = rowBuilder.build();
+    this.rowMap = rowBuilder.buildOrThrow();
 
     ImmutableMap.Builder<C, ImmutableMap<R, V>> columnBuilder =
         new ImmutableMap.Builder<>(columns.size());
     for (Entry<C, Map<R, V>> col : columns.entrySet()) {
       columnBuilder.put(col.getKey(), ImmutableMap.copyOf(col.getValue()));
     }
-    this.columnMap = columnBuilder.build();
+    this.columnMap = columnBuilder.buildOrThrow();
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/collect/Table.java b/android/guava/src/com/google/common/collect/Table.java
index 97d3f70..3c9e7ec 100644
--- a/android/guava/src/com/google/common/collect/Table.java
+++ b/android/guava/src/com/google/common/collect/Table.java
@@ -46,7 +46,7 @@
  * UnsupportedOperationException}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @param <R> the type of the table row keys
diff --git a/android/guava/src/com/google/common/collect/Tables.java b/android/guava/src/com/google/common/collect/Tables.java
index 772a75d..ab67fae 100644
--- a/android/guava/src/com/google/common/collect/Tables.java
+++ b/android/guava/src/com/google/common/collect/Tables.java
@@ -41,7 +41,7 @@
  * Provides static methods that involve a {@code Table}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#tables"> {@code Tables}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#tables">{@code Tables}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
diff --git a/android/guava/src/com/google/common/collect/TopKSelector.java b/android/guava/src/com/google/common/collect/TopKSelector.java
index f8cca0d..3295963 100644
--- a/android/guava/src/com/google/common/collect/TopKSelector.java
+++ b/android/guava/src/com/google/common/collect/TopKSelector.java
@@ -184,8 +184,10 @@
       }
       iterations++;
       if (iterations >= maxIterations) {
+        @SuppressWarnings("nullness") // safe because we pass sort() a range that contains real Ts
+        T[] castBuffer = (T[]) buffer;
         // We've already taken O(k log k), let's make sure we don't take longer than O(k log k).
-        Arrays.sort(buffer, left, right + 1, comparator);
+        Arrays.sort(castBuffer, left, right + 1, comparator);
         break;
       }
     }
@@ -263,7 +265,9 @@
    * this {@code TopKSelector}. This method returns in O(k log k) time.
    */
   public List<T> topK() {
-    Arrays.sort(buffer, 0, bufferSize, comparator);
+    @SuppressWarnings("nullness") // safe because we pass sort() a range that contains real Ts
+    T[] castBuffer = (T[]) buffer;
+    Arrays.sort(castBuffer, 0, bufferSize, comparator);
     if (bufferSize > k) {
       Arrays.fill(buffer, k, buffer.length, null);
       bufferSize = k;
diff --git a/android/guava/src/com/google/common/collect/TreeBasedTable.java b/android/guava/src/com/google/common/collect/TreeBasedTable.java
index 315404a..9ef210a 100644
--- a/android/guava/src/com/google/common/collect/TreeBasedTable.java
+++ b/android/guava/src/com/google/common/collect/TreeBasedTable.java
@@ -21,7 +21,6 @@
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
-import com.google.common.base.Function;
 import com.google.common.base.Supplier;
 import java.io.Serializable;
 import java.util.Comparator;
@@ -60,7 +59,7 @@
  * concurrently and one of the threads modifies the table, it must be synchronized externally.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -313,18 +312,12 @@
   /** Overridden column iterator to return columns values in globally sorted order. */
   @Override
   Iterator<C> createColumnKeyIterator() {
-    final Comparator<? super C> comparator = columnComparator();
+    Comparator<? super C> comparator = columnComparator();
 
-    final Iterator<C> merged =
+    Iterator<C> merged =
         Iterators.mergeSorted(
             Iterables.transform(
-                backingMap.values(),
-                new Function<Map<C, V>, Iterator<C>>() {
-                  @Override
-                  public Iterator<C> apply(Map<C, V> input) {
-                    return input.keySet().iterator();
-                  }
-                }),
+                backingMap.values(), (Map<C, V> input) -> input.keySet().iterator()),
             comparator);
 
     return new AbstractIterator<C>() {
diff --git a/android/guava/src/com/google/common/collect/TreeMultimap.java b/android/guava/src/com/google/common/collect/TreeMultimap.java
index 04ae207..dd0c2f8 100644
--- a/android/guava/src/com/google/common/collect/TreeMultimap.java
+++ b/android/guava/src/com/google/common/collect/TreeMultimap.java
@@ -64,8 +64,7 @@
  * with a call to {@link Multimaps#synchronizedSortedSetMultimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -136,7 +135,7 @@
    */
   @Override
   SortedSet<V> createCollection() {
-    return new TreeSet<V>(valueComparator);
+    return new TreeSet<>(valueComparator);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/collect/TreeMultiset.java b/android/guava/src/com/google/common/collect/TreeMultiset.java
index c64c35a..bcaa108 100644
--- a/android/guava/src/com/google/common/collect/TreeMultiset.java
+++ b/android/guava/src/com/google/common/collect/TreeMultiset.java
@@ -49,8 +49,7 @@
  * java.util.Collection} contract, which is specified in terms of {@link Object#equals}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Louis Wasserman
  * @author Jared Levy
diff --git a/android/guava/src/com/google/common/collect/TreeRangeSet.java b/android/guava/src/com/google/common/collect/TreeRangeSet.java
index 8308880..7ba7113 100644
--- a/android/guava/src/com/google/common/collect/TreeRangeSet.java
+++ b/android/guava/src/com/google/common/collect/TreeRangeSet.java
@@ -48,7 +48,7 @@
 
   /** Creates an empty {@code TreeRangeSet} instance. */
   public static <C extends Comparable<?>> TreeRangeSet<C> create() {
-    return new TreeRangeSet<C>(new TreeMap<Cut<C>, Range<C>>());
+    return new TreeRangeSet<>(new TreeMap<Cut<C>, Range<C>>());
   }
 
   /** Returns a {@code TreeRangeSet} initialized with the ranges in the specified range set. */
@@ -306,7 +306,7 @@
 
     private NavigableMap<Cut<C>, Range<C>> subMap(Range<Cut<C>> window) {
       if (window.isConnected(upperBoundWindow)) {
-        return new RangesByUpperBound<C>(rangesByLowerBound, window.intersection(upperBoundWindow));
+        return new RangesByUpperBound<>(rangesByLowerBound, window.intersection(upperBoundWindow));
       } else {
         return ImmutableSortedMap.of();
       }
@@ -368,7 +368,7 @@
        * We want to start the iteration at the first range where the upper bound is in
        * upperBoundWindow.
        */
-      final Iterator<Range<C>> backingItr;
+      Iterator<Range<C>> backingItr;
       if (!upperBoundWindow.hasLowerBound()) {
         backingItr = rangesByLowerBound.values().iterator();
       } else {
@@ -415,7 +415,7 @@
       } else {
         candidates = rangesByLowerBound.descendingMap().values();
       }
-      final PeekingIterator<Range<C>> backingItr = Iterators.peekingIterator(candidates.iterator());
+      PeekingIterator<Range<C>> backingItr = Iterators.peekingIterator(candidates.iterator());
       if (backingItr.hasNext()
           && upperBoundWindow.upperBound.isLessThan(backingItr.peek().upperBound)) {
         backingItr.next();
@@ -470,7 +470,7 @@
     private ComplementRangesByLowerBound(
         NavigableMap<Cut<C>, Range<C>> positiveRangesByLowerBound, Range<Cut<C>> window) {
       this.positiveRangesByLowerBound = positiveRangesByLowerBound;
-      this.positiveRangesByUpperBound = new RangesByUpperBound<C>(positiveRangesByLowerBound);
+      this.positiveRangesByUpperBound = new RangesByUpperBound<>(positiveRangesByLowerBound);
       this.complementLowerBoundWindow = window;
     }
 
@@ -479,7 +479,7 @@
         return ImmutableSortedMap.of();
       } else {
         subWindow = subWindow.intersection(complementLowerBoundWindow);
-        return new ComplementRangesByLowerBound<C>(positiveRangesByLowerBound, subWindow);
+        return new ComplementRangesByLowerBound<>(positiveRangesByLowerBound, subWindow);
       }
     }
 
@@ -529,9 +529,8 @@
       } else {
         positiveRanges = positiveRangesByUpperBound.values();
       }
-      final PeekingIterator<Range<C>> positiveItr =
-          Iterators.peekingIterator(positiveRanges.iterator());
-      final Cut<C> firstComplementRangeLowerBound;
+      PeekingIterator<Range<C>> positiveItr = Iterators.peekingIterator(positiveRanges.iterator());
+      Cut<C> firstComplementRangeLowerBound;
       if (complementLowerBoundWindow.contains(Cut.<C>belowAll())
           && (!positiveItr.hasNext() || positiveItr.peek().lowerBound != Cut.<C>belowAll())) {
         firstComplementRangeLowerBound = Cut.belowAll();
@@ -581,7 +580,7 @@
       boolean inclusive =
           complementLowerBoundWindow.hasUpperBound()
               && complementLowerBoundWindow.upperBoundType() == BoundType.CLOSED;
-      final PeekingIterator<Range<C>> positiveItr =
+      PeekingIterator<Range<C>> positiveItr =
           Iterators.peekingIterator(
               positiveRangesByUpperBound
                   .headMap(startingPoint, inclusive)
@@ -600,8 +599,7 @@
       } else {
         cut = positiveRangesByLowerBound.higherKey(Cut.<C>belowAll());
       }
-      final Cut<C> firstComplementRangeUpperBound =
-          MoreObjects.firstNonNull(cut, Cut.<C>aboveAll());
+      Cut<C> firstComplementRangeUpperBound = MoreObjects.firstNonNull(cut, Cut.<C>aboveAll());
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         Cut<C> nextComplementRangeUpperBound = firstComplementRangeUpperBound;
 
@@ -708,14 +706,14 @@
       this.lowerBoundWindow = checkNotNull(lowerBoundWindow);
       this.restriction = checkNotNull(restriction);
       this.rangesByLowerBound = checkNotNull(rangesByLowerBound);
-      this.rangesByUpperBound = new RangesByUpperBound<C>(rangesByLowerBound);
+      this.rangesByUpperBound = new RangesByUpperBound<>(rangesByLowerBound);
     }
 
     private NavigableMap<Cut<C>, Range<C>> subMap(Range<Cut<C>> window) {
       if (!window.isConnected(lowerBoundWindow)) {
         return ImmutableSortedMap.of();
       } else {
-        return new SubRangeSetRangesByLowerBound<C>(
+        return new SubRangeSetRangesByLowerBound<>(
             lowerBoundWindow.intersection(window), restriction, rangesByLowerBound);
       }
     }
@@ -786,7 +784,7 @@
       if (restriction.isEmpty()) {
         return Iterators.emptyIterator();
       }
-      final Iterator<Range<C>> completeRangeItr;
+      Iterator<Range<C>> completeRangeItr;
       if (lowerBoundWindow.upperBound.isLessThan(restriction.lowerBound)) {
         return Iterators.emptyIterator();
       } else if (lowerBoundWindow.lowerBound.isLessThan(restriction.lowerBound)) {
@@ -803,7 +801,7 @@
                 .values()
                 .iterator();
       }
-      final Cut<Cut<C>> upperBoundOnLowerBounds =
+      Cut<Cut<C>> upperBoundOnLowerBounds =
           Ordering.natural()
               .min(lowerBoundWindow.upperBound, Cut.belowValue(restriction.upperBound));
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
@@ -832,7 +830,7 @@
       Cut<Cut<C>> upperBoundOnLowerBounds =
           Ordering.natural()
               .min(lowerBoundWindow.upperBound, Cut.belowValue(restriction.upperBound));
-      final Iterator<Range<C>> completeRangeItr =
+      Iterator<Range<C>> completeRangeItr =
           rangesByLowerBound
               .headMap(
                   upperBoundOnLowerBounds.endpoint(),
diff --git a/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java b/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
index 59bd2ce..31f3c71 100644
--- a/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
@@ -64,7 +64,7 @@
   public SortedMultiset<E> descendingMultiset() {
     UnmodifiableSortedMultiset<E> result = descendingMultiset;
     if (result == null) {
-      result = new UnmodifiableSortedMultiset<E>(delegate().descendingMultiset());
+      result = new UnmodifiableSortedMultiset<>(delegate().descendingMultiset());
       result.descendingMultiset = this;
       return descendingMultiset = result;
     }
diff --git a/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java b/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
index 20e8563..dbe6e35 100644
--- a/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
+++ b/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
 import javax.annotation.CheckForNull;
@@ -41,7 +40,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedCharEscaper extends CharEscaper {
diff --git a/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java b/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
index a0883fe..efc77d0 100644
--- a/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
+++ b/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Collections;
@@ -36,7 +35,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class ArrayBasedEscaperMap {
diff --git a/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java b/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
index 5ea7807..355faaa 100644
--- a/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
+++ b/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
 import javax.annotation.CheckForNull;
@@ -41,7 +40,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedUnicodeEscaper extends UnicodeEscaper {
diff --git a/android/guava/src/com/google/common/escape/CharEscaper.java b/android/guava/src/com/google/common/escape/CharEscaper.java
index 55090f6..136240e 100644
--- a/android/guava/src/com/google/common/escape/CharEscaper.java
+++ b/android/guava/src/com/google/common/escape/CharEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import javax.annotation.CheckForNull;
 
@@ -40,7 +39,6 @@
  * @author Sven Mawson
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class CharEscaper extends Escaper {
diff --git a/android/guava/src/com/google/common/escape/CharEscaperBuilder.java b/android/guava/src/com/google/common/escape/CharEscaperBuilder.java
index cbe6958..97528cb 100644
--- a/android/guava/src/com/google/common/escape/CharEscaperBuilder.java
+++ b/android/guava/src/com/google/common/escape/CharEscaperBuilder.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashMap;
@@ -34,7 +33,6 @@
  * @author Sven Mawson
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class CharEscaperBuilder {
diff --git a/android/guava/src/com/google/common/escape/Escaper.java b/android/guava/src/com/google/common/escape/Escaper.java
index cdfe4e9..31b7df0 100644
--- a/android/guava/src/com/google/common/escape/Escaper.java
+++ b/android/guava/src/com/google/common/escape/Escaper.java
@@ -85,13 +85,7 @@
    */
   public abstract String escape(String string);
 
-  private final Function<String, String> asFunction =
-      new Function<String, String>() {
-        @Override
-        public String apply(String from) {
-          return escape(from);
-        }
-      };
+  private final Function<String, String> asFunction = this::escape;
 
   /** Returns a {@link Function} that invokes {@link #escape(String)} on this escaper. */
   public final Function<String, String> asFunction() {
diff --git a/android/guava/src/com/google/common/escape/Escapers.java b/android/guava/src/com/google/common/escape/Escapers.java
index 41af668..acfb82c 100644
--- a/android/guava/src/com/google/common/escape/Escapers.java
+++ b/android/guava/src/com/google/common/escape/Escapers.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashMap;
@@ -31,7 +30,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class Escapers {
@@ -93,7 +91,6 @@
    * @author David Beaumont
    * @since 15.0
    */
-  @Beta
   public static final class Builder {
     private final Map<Character, String> replacementMap = new HashMap<>();
     private char safeMin = Character.MIN_VALUE;
@@ -228,7 +225,7 @@
   }
 
   /** Private helper to wrap a CharEscaper as a UnicodeEscaper. */
-  private static UnicodeEscaper wrap(final CharEscaper escaper) {
+  private static UnicodeEscaper wrap(CharEscaper escaper) {
     return new UnicodeEscaper() {
       @Override
       @CheckForNull
diff --git a/android/guava/src/com/google/common/escape/ParametricNullness.java b/android/guava/src/com/google/common/escape/ParametricNullness.java
index 2f03d59..d941206 100644
--- a/android/guava/src/com/google/common/escape/ParametricNullness.java
+++ b/android/guava/src/com/google/common/escape/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/escape/UnicodeEscaper.java b/android/guava/src/com/google/common/escape/UnicodeEscaper.java
index c10ae34..280915c 100644
--- a/android/guava/src/com/google/common/escape/UnicodeEscaper.java
+++ b/android/guava/src/com/google/common/escape/UnicodeEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import javax.annotation.CheckForNull;
 
@@ -50,7 +49,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class UnicodeEscaper extends Escaper {
diff --git a/android/guava/src/com/google/common/eventbus/ParametricNullness.java b/android/guava/src/com/google/common/eventbus/ParametricNullness.java
index fc5bb17..ac91392 100644
--- a/android/guava/src/com/google/common/eventbus/ParametricNullness.java
+++ b/android/guava/src/com/google/common/eventbus/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/eventbus/Subscriber.java b/android/guava/src/com/google/common/eventbus/Subscriber.java
index 73e7f42..71ee197 100644
--- a/android/guava/src/com/google/common/eventbus/Subscriber.java
+++ b/android/guava/src/com/google/common/eventbus/Subscriber.java
@@ -64,16 +64,13 @@
   }
 
   /** Dispatches {@code event} to this subscriber using the proper executor. */
-  final void dispatchEvent(final Object event) {
+  final void dispatchEvent(Object event) {
     executor.execute(
-        new Runnable() {
-          @Override
-          public void run() {
-            try {
-              invokeSubscriberMethod(event);
-            } catch (InvocationTargetException e) {
-              bus.handleSubscriberException(e.getCause(), context(event));
-            }
+        () -> {
+          try {
+            invokeSubscriberMethod(event);
+          } catch (InvocationTargetException e) {
+            bus.handleSubscriberException(e.getCause(), context(event));
           }
         });
   }
diff --git a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
index c4be6b6..797468b 100644
--- a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
+++ b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
@@ -21,7 +21,6 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Sets;
@@ -115,31 +114,16 @@
               Iterators.concat(
                   Iterators.transform(
                       graph.predecessors(node).iterator(),
-                      new Function<N, EndpointPair<N>>() {
-                        @Override
-                        public EndpointPair<N> apply(N predecessor) {
-                          return EndpointPair.ordered(predecessor, node);
-                        }
-                      }),
+                      (N predecessor) -> EndpointPair.ordered(predecessor, node)),
                   Iterators.transform(
                       // filter out 'node' from successors (already covered by predecessors, above)
                       Sets.difference(graph.successors(node), ImmutableSet.of(node)).iterator(),
-                      new Function<N, EndpointPair<N>>() {
-                        @Override
-                        public EndpointPair<N> apply(N successor) {
-                          return EndpointPair.ordered(node, successor);
-                        }
-                      })));
+                      (N successor) -> EndpointPair.ordered(node, successor))));
         } else {
           return Iterators.unmodifiableIterator(
               Iterators.transform(
                   graph.adjacentNodes(node).iterator(),
-                  new Function<N, EndpointPair<N>>() {
-                    @Override
-                    public EndpointPair<N> apply(N adjacentNode) {
-                      return EndpointPair.unordered(node, adjacentNode);
-                    }
-                  }));
+                  (N adjacentNode) -> EndpointPair.unordered(node, adjacentNode)));
         }
       }
     };
diff --git a/android/guava/src/com/google/common/graph/DirectedGraphConnections.java b/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
index 23083da..0feb973 100644
--- a/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
+++ b/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
@@ -163,13 +163,13 @@
         orderedNodeConnections = null;
         break;
       case STABLE:
-        orderedNodeConnections = new ArrayList<NodeConnection<N>>();
+        orderedNodeConnections = new ArrayList<>();
         break;
       default:
         throw new AssertionError(incidentEdgeOrder.type());
     }
 
-    return new DirectedGraphConnections<N, V>(
+    return new DirectedGraphConnections<>(
         /* adjacentNodeValues = */ new HashMap<N, Object>(initialCapacity, INNER_LOAD_FACTOR),
         orderedNodeConnections,
         /* predecessorCount = */ 0,
@@ -239,8 +239,8 @@
       return new AbstractSet<N>() {
         @Override
         public UnmodifiableIterator<N> iterator() {
-          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
-          final Set<N> seenNodes = new HashSet<>();
+          Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          Set<N> seenNodes = new HashSet<>();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -276,7 +276,7 @@
       @Override
       public UnmodifiableIterator<N> iterator() {
         if (orderedNodeConnections == null) {
-          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -291,7 +291,7 @@
             }
           };
         } else {
-          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -326,7 +326,7 @@
       @Override
       public UnmodifiableIterator<N> iterator() {
         if (orderedNodeConnections == null) {
-          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -341,7 +341,7 @@
             }
           };
         } else {
-          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -371,46 +371,33 @@
   }
 
   @Override
-  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(N thisNode) {
     checkNotNull(thisNode);
 
-    final Iterator<EndpointPair<N>> resultWithDoubleSelfLoop;
+    Iterator<EndpointPair<N>> resultWithDoubleSelfLoop;
     if (orderedNodeConnections == null) {
       resultWithDoubleSelfLoop =
           Iterators.concat(
               Iterators.transform(
                   predecessors().iterator(),
-                  new Function<N, EndpointPair<N>>() {
-                    @Override
-                    public EndpointPair<N> apply(N predecessor) {
-                      return EndpointPair.ordered(predecessor, thisNode);
-                    }
-                  }),
+                  (N predecessor) -> EndpointPair.ordered(predecessor, thisNode)),
               Iterators.transform(
                   successors().iterator(),
-                  new Function<N, EndpointPair<N>>() {
-                    @Override
-                    public EndpointPair<N> apply(N successor) {
-                      return EndpointPair.ordered(thisNode, successor);
-                    }
-                  }));
+                  (N successor) -> EndpointPair.ordered(thisNode, successor)));
     } else {
       resultWithDoubleSelfLoop =
           Iterators.transform(
               orderedNodeConnections.iterator(),
-              new Function<NodeConnection<N>, EndpointPair<N>>() {
-                @Override
-                public EndpointPair<N> apply(NodeConnection<N> connection) {
-                  if (connection instanceof NodeConnection.Succ) {
-                    return EndpointPair.ordered(thisNode, connection.node);
-                  } else {
-                    return EndpointPair.ordered(connection.node, thisNode);
-                  }
+              (NodeConnection<N> connection) -> {
+                if (connection instanceof NodeConnection.Succ) {
+                  return EndpointPair.ordered(thisNode, connection.node);
+                } else {
+                  return EndpointPair.ordered(connection.node, thisNode);
                 }
               });
     }
 
-    final AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
+    AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
     return new AbstractIterator<EndpointPair<N>>() {
       @Override
       @CheckForNull
diff --git a/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java b/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
index 05f40c2..bd0e546 100644
--- a/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
@@ -93,7 +93,7 @@
   }
 
   @Override
-  public Set<E> edgesConnecting(final N node) {
+  public Set<E> edgesConnecting(N node) {
     return new MultiEdgesConnecting<E>(outEdgeMap, node) {
       @Override
       public int size() {
diff --git a/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java b/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java
index c2a25a5..e1db657 100644
--- a/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java
@@ -62,6 +62,6 @@
 
   @Override
   public Set<E> edgesConnecting(N node) {
-    return new EdgesConnecting<E>(((BiMap<E, N>) outEdgeMap).inverse(), node);
+    return new EdgesConnecting<>(((BiMap<E, N>) outEdgeMap).inverse(), node);
   }
 }
diff --git a/android/guava/src/com/google/common/graph/ElementOrder.java b/android/guava/src/com/google/common/graph/ElementOrder.java
index ea13674..b5985a2 100644
--- a/android/guava/src/com/google/common/graph/ElementOrder.java
+++ b/android/guava/src/com/google/common/graph/ElementOrder.java
@@ -80,7 +80,7 @@
 
   /** Returns an instance which specifies that no ordering is guaranteed. */
   public static <S> ElementOrder<S> unordered() {
-    return new ElementOrder<S>(Type.UNORDERED, null);
+    return new ElementOrder<>(Type.UNORDERED, null);
   }
 
   /**
@@ -120,19 +120,19 @@
    * @since 29.0
    */
   public static <S> ElementOrder<S> stable() {
-    return new ElementOrder<S>(Type.STABLE, null);
+    return new ElementOrder<>(Type.STABLE, null);
   }
 
   /** Returns an instance which specifies that insertion ordering is guaranteed. */
   public static <S> ElementOrder<S> insertion() {
-    return new ElementOrder<S>(Type.INSERTION, null);
+    return new ElementOrder<>(Type.INSERTION, null);
   }
 
   /**
    * Returns an instance which specifies that the natural ordering of the elements is guaranteed.
    */
   public static <S extends Comparable<? super S>> ElementOrder<S> natural() {
-    return new ElementOrder<S>(Type.SORTED, Ordering.<S>natural());
+    return new ElementOrder<>(Type.SORTED, Ordering.<S>natural());
   }
 
   /**
@@ -140,7 +140,7 @@
    * determined by {@code comparator}.
    */
   public static <S> ElementOrder<S> sorted(Comparator<S> comparator) {
-    return new ElementOrder<S>(Type.SORTED, checkNotNull(comparator));
+    return new ElementOrder<>(Type.SORTED, checkNotNull(comparator));
   }
 
   /** Returns the type of ordering used. */
diff --git a/android/guava/src/com/google/common/graph/EndpointPair.java b/android/guava/src/com/google/common/graph/EndpointPair.java
index 7aa3860..fe2397c 100644
--- a/android/guava/src/com/google/common/graph/EndpointPair.java
+++ b/android/guava/src/com/google/common/graph/EndpointPair.java
@@ -51,13 +51,13 @@
 
   /** Returns an {@link EndpointPair} representing the endpoints of a directed edge. */
   public static <N> EndpointPair<N> ordered(N source, N target) {
-    return new Ordered<N>(source, target);
+    return new Ordered<>(source, target);
   }
 
   /** Returns an {@link EndpointPair} representing the endpoints of an undirected edge. */
   public static <N> EndpointPair<N> unordered(N nodeU, N nodeV) {
     // Swap nodes on purpose to prevent callers from relying on the "ordering" of an unordered pair.
-    return new Unordered<N>(nodeV, nodeU);
+    return new Unordered<>(nodeV, nodeU);
   }
 
   /** Returns an {@link EndpointPair} representing the endpoints of an edge in {@code graph}. */
diff --git a/android/guava/src/com/google/common/graph/GraphBuilder.java b/android/guava/src/com/google/common/graph/GraphBuilder.java
index d57ed37..8c0871b 100644
--- a/android/guava/src/com/google/common/graph/GraphBuilder.java
+++ b/android/guava/src/com/google/common/graph/GraphBuilder.java
@@ -171,7 +171,7 @@
 
   /** Returns an empty {@link MutableGraph} with the properties of this {@link GraphBuilder}. */
   public <N1 extends N> MutableGraph<N1> build() {
-    return new StandardMutableGraph<N1>(this);
+    return new StandardMutableGraph<>(this);
   }
 
   GraphBuilder<N> copy() {
diff --git a/android/guava/src/com/google/common/graph/ImmutableGraph.java b/android/guava/src/com/google/common/graph/ImmutableGraph.java
index afad211..f829e96 100644
--- a/android/guava/src/com/google/common/graph/ImmutableGraph.java
+++ b/android/guava/src/com/google/common/graph/ImmutableGraph.java
@@ -87,7 +87,7 @@
     for (N node : graph.nodes()) {
       nodeConnections.put(node, connectionsOf(graph, node));
     }
-    return nodeConnections.build();
+    return nodeConnections.buildOrThrow();
   }
 
   @SuppressWarnings("unchecked")
diff --git a/android/guava/src/com/google/common/graph/ImmutableNetwork.java b/android/guava/src/com/google/common/graph/ImmutableNetwork.java
index cb636aa..c29f8a3 100644
--- a/android/guava/src/com/google/common/graph/ImmutableNetwork.java
+++ b/android/guava/src/com/google/common/graph/ImmutableNetwork.java
@@ -73,7 +73,7 @@
 
   @Override
   public ImmutableGraph<N> asGraph() {
-    return new ImmutableGraph<N>(super.asGraph()); // safe because the view is effectively immutable
+    return new ImmutableGraph<>(super.asGraph()); // safe because the view is effectively immutable
   }
 
   private static <N, E> Map<N, NetworkConnections<N, E>> getNodeConnections(Network<N, E> network) {
@@ -84,7 +84,7 @@
     for (N node : network.nodes()) {
       nodeConnections.put(node, connectionsOf(network, node));
     }
-    return nodeConnections.build();
+    return nodeConnections.buildOrThrow();
   }
 
   private static <N, E> Map<E, N> getEdgeToReferenceNode(Network<N, E> network) {
@@ -95,7 +95,7 @@
     for (E edge : network.edges()) {
       edgeToReferenceNode.put(edge, network.incidentNodes(edge).nodeU());
     }
-    return edgeToReferenceNode.build();
+    return edgeToReferenceNode.buildOrThrow();
   }
 
   private static <N, E> NetworkConnections<N, E> connectionsOf(Network<N, E> network, N node) {
@@ -115,31 +115,16 @@
     }
   }
 
-  private static <N, E> Function<E, N> sourceNodeFn(final Network<N, E> network) {
-    return new Function<E, N>() {
-      @Override
-      public N apply(E edge) {
-        return network.incidentNodes(edge).source();
-      }
-    };
+  private static <N, E> Function<E, N> sourceNodeFn(Network<N, E> network) {
+    return (E edge) -> network.incidentNodes(edge).source();
   }
 
-  private static <N, E> Function<E, N> targetNodeFn(final Network<N, E> network) {
-    return new Function<E, N>() {
-      @Override
-      public N apply(E edge) {
-        return network.incidentNodes(edge).target();
-      }
-    };
+  private static <N, E> Function<E, N> targetNodeFn(Network<N, E> network) {
+    return (E edge) -> network.incidentNodes(edge).target();
   }
 
-  private static <N, E> Function<E, N> adjacentNodeFn(final Network<N, E> network, final N node) {
-    return new Function<E, N>() {
-      @Override
-      public N apply(E edge) {
-        return network.incidentNodes(edge).adjacentNode(node);
-      }
-    };
+  private static <N, E> Function<E, N> adjacentNodeFn(Network<N, E> network, N node) {
+    return (E edge) -> network.incidentNodes(edge).adjacentNode(node);
   }
 
   /**
diff --git a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
index a1567da..eb17067 100644
--- a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
+++ b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
@@ -75,7 +75,7 @@
 
   @Override
   public ImmutableGraph<N> asGraph() {
-    return new ImmutableGraph<N>(this); // safe because the view is effectively immutable
+    return new ImmutableGraph<>(this); // safe because the view is effectively immutable
   }
 
   private static <N, V> ImmutableMap<N, GraphConnections<N, V>> getNodeConnections(
@@ -87,19 +87,14 @@
     for (N node : graph.nodes()) {
       nodeConnections.put(node, connectionsOf(graph, node));
     }
-    return nodeConnections.build();
+    return nodeConnections.buildOrThrow();
   }
 
-  private static <N, V> GraphConnections<N, V> connectionsOf(
-      final ValueGraph<N, V> graph, final N node) {
+  private static <N, V> GraphConnections<N, V> connectionsOf(ValueGraph<N, V> graph, N node) {
     Function<N, V> successorNodeToValueFn =
-        new Function<N, V>() {
-          @Override
-          public V apply(N successorNode) {
+        (N successorNode) ->
             // requireNonNull is safe because the endpoint pair comes from the graph.
-            return requireNonNull(graph.edgeValueOrDefault(node, successorNode, null));
-          }
-        };
+            requireNonNull(graph.edgeValueOrDefault(node, successorNode, null));
     return graph.isDirected()
         ? DirectedGraphConnections.ofImmutable(
             node, graph.incidentEdges(node), successorNodeToValueFn)
diff --git a/android/guava/src/com/google/common/graph/MapIteratorCache.java b/android/guava/src/com/google/common/graph/MapIteratorCache.java
index aae9187..05cdde8 100644
--- a/android/guava/src/com/google/common/graph/MapIteratorCache.java
+++ b/android/guava/src/com/google/common/graph/MapIteratorCache.java
@@ -108,7 +108,7 @@
     return new AbstractSet<K>() {
       @Override
       public UnmodifiableIterator<K> iterator() {
-        final Iterator<Entry<K, V>> entryIterator = backingMap.entrySet().iterator();
+        Iterator<Entry<K, V>> entryIterator = backingMap.entrySet().iterator();
 
         return new UnmodifiableIterator<K>() {
           @Override
diff --git a/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java b/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java
index 8a4250e..620f986 100644
--- a/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java
+++ b/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java
@@ -48,7 +48,7 @@
 
   @Override
   public UnmodifiableIterator<E> iterator() {
-    final Iterator<? extends Entry<E, ?>> entries = outEdgeToNode.entrySet().iterator();
+    Iterator<? extends Entry<E, ?>> entries = outEdgeToNode.entrySet().iterator();
     return new AbstractIterator<E>() {
       @Override
       @CheckForNull
diff --git a/android/guava/src/com/google/common/graph/ParametricNullness.java b/android/guava/src/com/google/common/graph/ParametricNullness.java
index 62534eb..87ff930 100644
--- a/android/guava/src/com/google/common/graph/ParametricNullness.java
+++ b/android/guava/src/com/google/common/graph/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/graph/StandardValueGraph.java b/android/guava/src/com/google/common/graph/StandardValueGraph.java
index f2c71bc..ab3ae58 100644
--- a/android/guava/src/com/google/common/graph/StandardValueGraph.java
+++ b/android/guava/src/com/google/common/graph/StandardValueGraph.java
@@ -118,7 +118,7 @@
 
   @Override
   public Set<EndpointPair<N>> incidentEdges(N node) {
-    final GraphConnections<N, V> connections = checkedConnections(node);
+    GraphConnections<N, V> connections = checkedConnections(node);
 
     return new IncidentEdgeSet<N>(this, node) {
       @Override
diff --git a/android/guava/src/com/google/common/graph/Traverser.java b/android/guava/src/com/google/common/graph/Traverser.java
index 5a36f9f..fb594b4 100644
--- a/android/guava/src/com/google/common/graph/Traverser.java
+++ b/android/guava/src/com/google/common/graph/Traverser.java
@@ -96,7 +96,7 @@
    *
    * @param graph {@link SuccessorsFunction} representing a general graph that may have cycles.
    */
-  public static <N> Traverser<N> forGraph(final SuccessorsFunction<N> graph) {
+  public static <N> Traverser<N> forGraph(SuccessorsFunction<N> graph) {
     return new Traverser<N>(graph) {
       @Override
       Traversal<N> newTraversal() {
@@ -178,7 +178,7 @@
    * @param tree {@link SuccessorsFunction} representing a directed acyclic graph that has at most
    *     one path between any two nodes
    */
-  public static <N> Traverser<N> forTree(final SuccessorsFunction<N> tree) {
+  public static <N> Traverser<N> forTree(SuccessorsFunction<N> tree) {
     if (tree instanceof BaseGraph) {
       checkArgument(((BaseGraph<?>) tree).isDirected(), "Undirected graphs can never be trees.");
     }
@@ -239,7 +239,7 @@
    * @since 24.1
    */
   public final Iterable<N> breadthFirst(Iterable<? extends N> startNodes) {
-    final ImmutableSet<N> validated = validate(startNodes);
+    ImmutableSet<N> validated = validate(startNodes);
     return new Iterable<N>() {
       @Override
       public Iterator<N> iterator() {
@@ -294,7 +294,7 @@
    * @since 24.1
    */
   public final Iterable<N> depthFirstPreOrder(Iterable<? extends N> startNodes) {
-    final ImmutableSet<N> validated = validate(startNodes);
+    ImmutableSet<N> validated = validate(startNodes);
     return new Iterable<N>() {
       @Override
       public Iterator<N> iterator() {
@@ -349,7 +349,7 @@
    * @since 24.1
    */
   public final Iterable<N> depthFirstPostOrder(Iterable<? extends N> startNodes) {
-    final ImmutableSet<N> validated = validate(startNodes);
+    ImmutableSet<N> validated = validate(startNodes);
     return new Iterable<N>() {
       @Override
       public Iterator<N> iterator() {
@@ -382,7 +382,7 @@
     }
 
     static <N> Traversal<N> inGraph(SuccessorsFunction<N> graph) {
-      final Set<N> visited = new HashSet<>();
+      Set<N> visited = new HashSet<>();
       return new Traversal<N>(graph) {
         @Override
         @CheckForNull
@@ -438,8 +438,8 @@
      * determined by the {@code InsertionOrder} parameter: nieces are placed at the FRONT before
      * aunts for pre-order; while in BFS they are placed at the BACK after aunts.
      */
-    private Iterator<N> topDown(Iterator<? extends N> startNodes, final InsertionOrder order) {
-      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+    private Iterator<N> topDown(Iterator<? extends N> startNodes, InsertionOrder order) {
+      Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
@@ -463,8 +463,8 @@
     }
 
     final Iterator<N> postOrder(Iterator<? extends N> startNodes) {
-      final Deque<N> ancestorStack = new ArrayDeque<>();
-      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+      Deque<N> ancestorStack = new ArrayDeque<>();
+      Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
diff --git a/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java b/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
index 085e3a7..4eeb232 100644
--- a/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
+++ b/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
@@ -20,7 +20,6 @@
 import static com.google.common.graph.GraphConstants.INNER_CAPACITY;
 import static com.google.common.graph.GraphConstants.INNER_LOAD_FACTOR;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterators;
 import java.util.Collections;
@@ -79,15 +78,10 @@
   }
 
   @Override
-  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(N thisNode) {
     return Iterators.transform(
         adjacentNodeValues.keySet().iterator(),
-        new Function<N, EndpointPair<N>>() {
-          @Override
-          public EndpointPair<N> apply(N incidentNode) {
-            return EndpointPair.unordered(thisNode, incidentNode);
-          }
-        });
+        (N incidentNode) -> EndpointPair.unordered(thisNode, incidentNode));
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java b/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
index a5c45ca..6caac3b 100644
--- a/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
@@ -73,7 +73,7 @@
   }
 
   @Override
-  public Set<E> edgesConnecting(final N node) {
+  public Set<E> edgesConnecting(N node) {
     return new MultiEdgesConnecting<E>(incidentEdgeMap, node) {
       @Override
       public int size() {
diff --git a/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java b/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
index 38cb763..190897f 100644
--- a/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
@@ -54,6 +54,6 @@
 
   @Override
   public Set<E> edgesConnecting(N node) {
-    return new EdgesConnecting<E>(((BiMap<E, N>) incidentEdgeMap).inverse(), node);
+    return new EdgesConnecting<>(((BiMap<E, N>) incidentEdgeMap).inverse(), node);
   }
 }
diff --git a/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java b/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
index 4b69bb7..820fe96 100644
--- a/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
+++ b/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
@@ -70,7 +70,7 @@
     return fromHashers(hashers);
   }
 
-  private Hasher fromHashers(final Hasher[] hashers) {
+  private Hasher fromHashers(Hasher[] hashers) {
     return new Hasher() {
       @Override
       public Hasher putByte(byte b) {
diff --git a/android/guava/src/com/google/common/hash/BloomFilter.java b/android/guava/src/com/google/common/hash/BloomFilter.java
index 6ffe583..331d160 100644
--- a/android/guava/src/com/google/common/hash/BloomFilter.java
+++ b/android/guava/src/com/google/common/hash/BloomFilter.java
@@ -23,6 +23,7 @@
 import com.google.common.base.Predicate;
 import com.google.common.hash.BloomFilterStrategies.LockFreeBitArray;
 import com.google.common.math.DoubleMath;
+import com.google.common.math.LongMath;
 import com.google.common.primitives.SignedBytes;
 import com.google.common.primitives.UnsignedBytes;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -540,11 +541,13 @@
       dataLength = din.readInt();
 
       Strategy strategy = BloomFilterStrategies.values()[strategyOrdinal];
-      long[] data = new long[dataLength];
-      for (int i = 0; i < data.length; i++) {
-        data[i] = din.readLong();
+
+      LockFreeBitArray dataArray = new LockFreeBitArray(LongMath.checkedMultiply(dataLength, 64L));
+      for (int i = 0; i < dataLength; i++) {
+        dataArray.putData(i, din.readLong());
       }
-      return new BloomFilter<T>(new LockFreeBitArray(data), numHashFunctions, funnel, strategy);
+
+      return new BloomFilter<T>(dataArray, numHashFunctions, funnel, strategy);
     } catch (RuntimeException e) {
       String message =
           "Unable to deserialize BloomFilter from InputStream."
diff --git a/android/guava/src/com/google/common/hash/BloomFilterStrategies.java b/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
index 3a012f3..876269e 100644
--- a/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
+++ b/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
@@ -263,27 +263,38 @@
           data.length(),
           other.data.length());
       for (int i = 0; i < data.length(); i++) {
-        long otherLong = other.data.get(i);
-
-        long ourLongOld;
-        long ourLongNew;
-        boolean changedAnyBits = true;
-        do {
-          ourLongOld = data.get(i);
-          ourLongNew = ourLongOld | otherLong;
-          if (ourLongOld == ourLongNew) {
-            changedAnyBits = false;
-            break;
-          }
-        } while (!data.compareAndSet(i, ourLongOld, ourLongNew));
-
-        if (changedAnyBits) {
-          int bitsAdded = Long.bitCount(ourLongNew) - Long.bitCount(ourLongOld);
-          bitCount.add(bitsAdded);
-        }
+        putData(i, other.data.get(i));
       }
     }
 
+    /**
+     * ORs the bits encoded in the {@code i}th {@code long} in the underlying {@link
+     * AtomicLongArray} with the given value.
+     */
+    void putData(int i, long longValue) {
+      long ourLongOld;
+      long ourLongNew;
+      boolean changedAnyBits = true;
+      do {
+        ourLongOld = data.get(i);
+        ourLongNew = ourLongOld | longValue;
+        if (ourLongOld == ourLongNew) {
+          changedAnyBits = false;
+          break;
+        }
+      } while (!data.compareAndSet(i, ourLongOld, ourLongNew));
+
+      if (changedAnyBits) {
+        int bitsAdded = Long.bitCount(ourLongNew) - Long.bitCount(ourLongOld);
+        bitCount.add(bitsAdded);
+      }
+    }
+
+    /** Returns the number of {@code long}s in the underlying {@link AtomicLongArray}. */
+    int dataLength() {
+      return data.length();
+    }
+
     @Override
     public boolean equals(@CheckForNull Object o) {
       if (o instanceof LockFreeBitArray) {
diff --git a/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java b/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java
index 7d6a398..3437b00 100644
--- a/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java
+++ b/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java
@@ -170,7 +170,7 @@
    * Compute an 8-byte hash of a byte array of length greater than 64 bytes.
    */
   private static long hashLength65Plus(byte[] bytes, int offset, int length) {
-    final int seed = 81;
+    int seed = 81;
     // For strings over 64 bytes we loop. Internal state consists of 56 bytes: v, w, x, y, and z.
     long x = seed;
     @SuppressWarnings("ConstantOverflow")
diff --git a/android/guava/src/com/google/common/hash/Fingerprint2011.java b/android/guava/src/com/google/common/hash/Fingerprint2011.java
new file mode 100644
index 0000000..1b01e00
--- /dev/null
+++ b/android/guava/src/com/google/common/hash/Fingerprint2011.java
@@ -0,0 +1,198 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package com.google.common.hash;
+
+import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static com.google.common.hash.LittleEndianByteArray.load64;
+import static com.google.common.hash.LittleEndianByteArray.load64Safely;
+import static java.lang.Long.rotateRight;
+
+import com.google.common.annotations.VisibleForTesting;
+
+/**
+ * Implementation of Geoff Pike's fingerprint2011 hash function. See {@link Hashing#fingerprint2011}
+ * for information on the behaviour of the algorithm.
+ *
+ * <p>On Intel Core2 2.66, on 1000 bytes, fingerprint2011 takes 0.9 microseconds compared to
+ * fingerprint at 4.0 microseconds and md5 at 4.5 microseconds.
+ *
+ * <p>Note to maintainers: This implementation relies on signed arithmetic being bit-wise equivalent
+ * to unsigned arithmetic in all cases except:
+ *
+ * <ul>
+ *   <li>comparisons (signed values can be negative)
+ *   <li>division (avoided here)
+ *   <li>shifting (right shift must be unsigned)
+ * </ul>
+ *
+ * @author kylemaddison@google.com (Kyle Maddison)
+ * @author gpike@google.com (Geoff Pike)
+ */
+@ElementTypesAreNonnullByDefault
+final class Fingerprint2011 extends AbstractNonStreamingHashFunction {
+  static final HashFunction FINGERPRINT_2011 = new Fingerprint2011();
+
+  // Some primes between 2^63 and 2^64 for various uses.
+  private static final long K0 = 0xa5b85c5e198ed849L;
+  private static final long K1 = 0x8d58ac26afe12e47L;
+  private static final long K2 = 0xc47b6e9e3a970ed3L;
+  private static final long K3 = 0xc6a4a7935bd1e995L;
+
+  @Override
+  public HashCode hashBytes(byte[] input, int off, int len) {
+    checkPositionIndexes(off, off + len, input.length);
+    return HashCode.fromLong(fingerprint(input, off, len));
+  }
+
+  @Override
+  public int bits() {
+    return 64;
+  }
+
+  @Override
+  public String toString() {
+    return "Hashing.fingerprint2011()";
+  }
+
+  // End of public functions.
+
+  @VisibleForTesting
+  static long fingerprint(byte[] bytes, int offset, int length) {
+    long result;
+
+    if (length <= 32) {
+      result = murmurHash64WithSeed(bytes, offset, length, K0 ^ K1 ^ K2);
+    } else if (length <= 64) {
+      result = hashLength33To64(bytes, offset, length);
+    } else {
+      result = fullFingerprint(bytes, offset, length);
+    }
+
+    long u = length >= 8 ? load64(bytes, offset) : K0;
+    long v = length >= 9 ? load64(bytes, offset + length - 8) : K0;
+    result = hash128to64(result + v, u);
+    return result == 0 || result == 1 ? result + ~1 : result;
+  }
+
+  private static long shiftMix(long val) {
+    return val ^ (val >>> 47);
+  }
+
+  /** Implementation of Hash128to64 from util/hash/hash128to64.h */
+  @VisibleForTesting
+  static long hash128to64(long high, long low) {
+    long a = (low ^ high) * K3;
+    a ^= (a >>> 47);
+    long b = (high ^ a) * K3;
+    b ^= (b >>> 47);
+    b *= K3;
+    return b;
+  }
+
+  /**
+   * Computes intermediate hash of 32 bytes of byte array from the given offset. Results are
+   * returned in the output array - this is 12% faster than allocating new arrays every time.
+   */
+  private static void weakHashLength32WithSeeds(
+      byte[] bytes, int offset, long seedA, long seedB, long[] output) {
+    long part1 = load64(bytes, offset);
+    long part2 = load64(bytes, offset + 8);
+    long part3 = load64(bytes, offset + 16);
+    long part4 = load64(bytes, offset + 24);
+
+    seedA += part1;
+    seedB = rotateRight(seedB + seedA + part4, 51);
+    long c = seedA;
+    seedA += part2;
+    seedA += part3;
+    seedB += rotateRight(seedA, 23);
+    output[0] = seedA + part4;
+    output[1] = seedB + c;
+  }
+
+  /*
+   * Compute an 8-byte hash of a byte array of length greater than 64 bytes.
+   */
+  private static long fullFingerprint(byte[] bytes, int offset, int length) {
+    // For lengths over 64 bytes we hash the end first, and then as we
+    // loop we keep 56 bytes of state: v, w, x, y, and z.
+    long x = load64(bytes, offset);
+    long y = load64(bytes, offset + length - 16) ^ K1;
+    long z = load64(bytes, offset + length - 56) ^ K0;
+    long[] v = new long[2];
+    long[] w = new long[2];
+    weakHashLength32WithSeeds(bytes, offset + length - 64, length, y, v);
+    weakHashLength32WithSeeds(bytes, offset + length - 32, length * K1, K0, w);
+    z += shiftMix(v[1]) * K1;
+    x = rotateRight(z + x, 39) * K1;
+    y = rotateRight(y, 33) * K1;
+
+    // Decrease length to the nearest multiple of 64, and operate on 64-byte chunks.
+    length = (length - 1) & ~63;
+    do {
+      x = rotateRight(x + y + v[0] + load64(bytes, offset + 16), 37) * K1;
+      y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * K1;
+      x ^= w[1];
+      y ^= v[0];
+      z = rotateRight(z ^ w[0], 33);
+      weakHashLength32WithSeeds(bytes, offset, v[1] * K1, x + w[0], v);
+      weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y, w);
+      long tmp = z;
+      z = x;
+      x = tmp;
+      offset += 64;
+      length -= 64;
+    } while (length != 0);
+    return hash128to64(hash128to64(v[0], w[0]) + shiftMix(y) * K1 + z, hash128to64(v[1], w[1]) + x);
+  }
+
+  private static long hashLength33To64(byte[] bytes, int offset, int length) {
+    long z = load64(bytes, offset + 24);
+    long a = load64(bytes, offset) + (length + load64(bytes, offset + length - 16)) * K0;
+    long b = rotateRight(a + z, 52);
+    long c = rotateRight(a, 37);
+    a += load64(bytes, offset + 8);
+    c += rotateRight(a, 7);
+    a += load64(bytes, offset + 16);
+    long vf = a + z;
+    long vs = b + rotateRight(a, 31) + c;
+    a = load64(bytes, offset + 16) + load64(bytes, offset + length - 32);
+    z = load64(bytes, offset + length - 8);
+    b = rotateRight(a + z, 52);
+    c = rotateRight(a, 37);
+    a += load64(bytes, offset + length - 24);
+    c += rotateRight(a, 7);
+    a += load64(bytes, offset + length - 16);
+    long wf = a + z;
+    long ws = b + rotateRight(a, 31) + c;
+    long r = shiftMix((vf + ws) * K2 + (wf + vs) * K0);
+    return shiftMix(r * K0 + vs) * K2;
+  }
+
+  @VisibleForTesting
+  static long murmurHash64WithSeed(byte[] bytes, int offset, int length, long seed) {
+    long mul = K3;
+    int topBit = 0x7;
+
+    int lengthAligned = length & ~topBit;
+    int lengthRemainder = length & topBit;
+    long hash = seed ^ (length * mul);
+
+    for (int i = 0; i < lengthAligned; i += 8) {
+      long loaded = load64(bytes, offset + i);
+      long data = shiftMix(loaded * mul) * mul;
+      hash ^= data;
+      hash *= mul;
+    }
+
+    if (lengthRemainder != 0) {
+      long data = load64Safely(bytes, offset + lengthAligned, lengthRemainder);
+      hash ^= data;
+      hash *= mul;
+    }
+
+    hash = shiftMix(hash) * mul;
+    hash = shiftMix(hash);
+    return hash;
+  }
+}
diff --git a/android/guava/src/com/google/common/hash/Funnels.java b/android/guava/src/com/google/common/hash/Funnels.java
index 6673836..b8e63d5 100644
--- a/android/guava/src/com/google/common/hash/Funnels.java
+++ b/android/guava/src/com/google/common/hash/Funnels.java
@@ -168,7 +168,7 @@
    */
   public static <E extends @Nullable Object> Funnel<Iterable<? extends E>> sequentialFunnel(
       Funnel<E> elementFunnel) {
-    return new SequentialFunnel<E>(elementFunnel);
+    return new SequentialFunnel<>(elementFunnel);
   }
 
   private static class SequentialFunnel<E extends @Nullable Object>
diff --git a/android/guava/src/com/google/common/hash/Hashing.java b/android/guava/src/com/google/common/hash/Hashing.java
index dd65367..afff20c 100644
--- a/android/guava/src/com/google/common/hash/Hashing.java
+++ b/android/guava/src/com/google/common/hash/Hashing.java
@@ -17,11 +17,11 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.Immutable;
 import java.security.Key;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.zip.Adler32;
@@ -42,7 +42,6 @@
  * @author Kurt Alfred Kluever
  * @since 11.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class Hashing {
   /**
@@ -470,6 +469,30 @@
   }
 
   /**
+   * Returns a hash function implementing the Fingerprint2011 hashing function (64 hash bits).
+   *
+   * <p>This is designed for generating persistent fingerprints of strings. It isn't
+   * cryptographically secure, but it produces a high-quality hash with few collisions. Fingerprints
+   * generated using this are byte-wise identical to those created using the C++ version, but note
+   * that this uses unsigned integers (see {@link com.google.common.primitives.UnsignedInts}).
+   * Comparisons between the two should take this into account.
+   *
+   * <p>Fingerprint2011() is a form of Murmur2 on strings up to 32 bytes and a form of CityHash for
+   * longer strings. It could have been one or the other throughout. The main advantage of the
+   * combination is that CityHash has a bunch of special cases for short strings that don't need to
+   * be replicated here. The result will never be 0 or 1.
+   *
+   * <p>This function is best understood as a <a
+   * href="https://en.wikipedia.org/wiki/Fingerprint_(computing)">fingerprint</a> rather than a true
+   * <a href="https://en.wikipedia.org/wiki/Hash_function">hash function</a>.
+   *
+   * @since 31.1
+   */
+  public static HashFunction fingerprint2011() {
+    return Fingerprint2011.FINGERPRINT_2011;
+  }
+
+  /**
    * Assigns to {@code hashCode} a "bucket" in the range {@code [0, buckets)}, in a uniform manner
    * that minimizes the need for remapping as {@code buckets} grows. That is, {@code
    * consistentHash(h, n)} equals:
@@ -621,7 +644,7 @@
     List<HashFunction> list = new ArrayList<>();
     list.add(first);
     list.add(second);
-    list.addAll(Arrays.asList(rest));
+    Collections.addAll(list, rest);
     return new ConcatenatedHashFunction(list.toArray(new HashFunction[0]));
   }
 
@@ -642,7 +665,7 @@
     for (HashFunction hashFunction : hashFunctions) {
       list.add(hashFunction);
     }
-    checkArgument(list.size() > 0, "number of hash functions (%s) must be > 0", list.size());
+    checkArgument(!list.isEmpty(), "number of hash functions (%s) must be > 0", list.size());
     return new ConcatenatedHashFunction(list.toArray(new HashFunction[0]));
   }
 
diff --git a/android/guava/src/com/google/common/hash/LittleEndianByteArray.java b/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
index 15d8b2c..6252015 100644
--- a/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
+++ b/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
@@ -243,7 +243,7 @@
        * which will have an efficient native implementation in JDK 9.
        *
        */
-      final String arch = System.getProperty("os.arch");
+      String arch = System.getProperty("os.arch");
       if ("amd64".equals(arch)) {
         theGetter =
             ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)
diff --git a/android/guava/src/com/google/common/hash/LongAddables.java b/android/guava/src/com/google/common/hash/LongAddables.java
index 370030d..7c371ec 100644
--- a/android/guava/src/com/google/common/hash/LongAddables.java
+++ b/android/guava/src/com/google/common/hash/LongAddables.java
@@ -29,7 +29,8 @@
   static {
     Supplier<LongAddable> supplier;
     try {
-      new LongAdder(); // trigger static initialization of the LongAdder class, which may fail
+      // trigger static initialization of the LongAdder class, which may fail
+      LongAdder unused = new LongAdder();
       supplier =
           new Supplier<LongAddable>() {
             @Override
diff --git a/android/guava/src/com/google/common/hash/MacHashFunction.java b/android/guava/src/com/google/common/hash/MacHashFunction.java
index 031b1c0..6d53a54 100644
--- a/android/guava/src/com/google/common/hash/MacHashFunction.java
+++ b/android/guava/src/com/google/common/hash/MacHashFunction.java
@@ -58,7 +58,7 @@
 
   private static boolean supportsClone(Mac mac) {
     try {
-      mac.clone();
+      Object unused = mac.clone();
       return true;
     } catch (CloneNotSupportedException e) {
       return false;
diff --git a/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java b/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java
index 48b47b0..43fc087 100644
--- a/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java
+++ b/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java
@@ -61,7 +61,7 @@
 
   private static boolean supportsClone(MessageDigest digest) {
     try {
-      digest.clone();
+      Object unused = digest.clone();
       return true;
     } catch (CloneNotSupportedException e) {
       return false;
diff --git a/android/guava/src/com/google/common/hash/ParametricNullness.java b/android/guava/src/com/google/common/hash/ParametricNullness.java
index 2ae8d42..460106c 100644
--- a/android/guava/src/com/google/common/hash/ParametricNullness.java
+++ b/android/guava/src/com/google/common/hash/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/html/ParametricNullness.java b/android/guava/src/com/google/common/html/ParametricNullness.java
index 9a62c35..61b4461 100644
--- a/android/guava/src/com/google/common/html/ParametricNullness.java
+++ b/android/guava/src/com/google/common/html/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/io/BaseEncoding.java b/android/guava/src/com/google/common/io/BaseEncoding.java
index f42857c..0d6f2e0 100644
--- a/android/guava/src/com/google/common/io/BaseEncoding.java
+++ b/android/guava/src/com/google/common/io/BaseEncoding.java
@@ -176,7 +176,7 @@
    * Returns a {@code ByteSink} that writes base-encoded bytes to the specified {@code CharSink}.
    */
   @GwtIncompatible // ByteSink,CharSink
-  public final ByteSink encodingSink(final CharSink encodedSink) {
+  public final ByteSink encodingSink(CharSink encodedSink) {
     checkNotNull(encodedSink);
     return new ByteSink() {
       @Override
@@ -247,7 +247,7 @@
    * CharSource}.
    */
   @GwtIncompatible // ByteSource,CharSource
-  public final ByteSource decodingSource(final CharSource encodedSource) {
+  public final ByteSource decodingSource(CharSource encodedSource) {
     checkNotNull(encodedSource);
     return new ByteSource() {
       @Override
@@ -588,7 +588,7 @@
 
     @GwtIncompatible // Writer,OutputStream
     @Override
-    public OutputStream encodingStream(final Writer out) {
+    public OutputStream encodingStream(Writer out) {
       checkNotNull(out);
       return new OutputStream() {
         int bitBuffer = 0;
@@ -650,7 +650,7 @@
         bitBuffer <<= 8; // Add additional zero byte in the end.
       }
       // Position of first character is length of bitBuffer minus bitsPerChar.
-      final int bitOffset = (len + 1) * 8 - alphabet.bitsPerChar;
+      int bitOffset = (len + 1) * 8 - alphabet.bitsPerChar;
       int bitsProcessed = 0;
       while (bitsProcessed < len * 8) {
         int charIndex = (int) (bitBuffer >>> (bitOffset - bitsProcessed)) & alphabet.mask;
@@ -718,7 +718,7 @@
             chunk |= alphabet.decode(chars.charAt(charIdx + charsProcessed++));
           }
         }
-        final int minOffset = alphabet.bytesPerChunk * 8 - charsProcessed * alphabet.bitsPerChar;
+        int minOffset = alphabet.bytesPerChunk * 8 - charsProcessed * alphabet.bitsPerChar;
         for (int offset = (alphabet.bytesPerChunk - 1) * 8; offset >= minOffset; offset -= 8) {
           target[bytesWritten++] = (byte) ((chunk >>> offset) & 0xFF);
         }
@@ -728,7 +728,7 @@
 
     @Override
     @GwtIncompatible // Reader,InputStream
-    public InputStream decodingStream(final Reader reader) {
+    public InputStream decodingStream(Reader reader) {
       checkNotNull(reader);
       return new InputStream() {
         int bitBuffer = 0;
@@ -992,7 +992,7 @@
   }
 
   @GwtIncompatible
-  static Reader ignoringReader(final Reader delegate, final String toIgnore) {
+  static Reader ignoringReader(Reader delegate, String toIgnore) {
     checkNotNull(delegate);
     checkNotNull(toIgnore);
     return new Reader() {
@@ -1018,7 +1018,7 @@
   }
 
   static Appendable separatingAppendable(
-      final Appendable delegate, final String separator, final int afterEveryChars) {
+      Appendable delegate, String separator, int afterEveryChars) {
     checkNotNull(delegate);
     checkNotNull(separator);
     checkArgument(afterEveryChars > 0);
@@ -1049,10 +1049,8 @@
   }
 
   @GwtIncompatible // Writer
-  static Writer separatingWriter(
-      final Writer delegate, final String separator, final int afterEveryChars) {
-    final Appendable separatingAppendable =
-        separatingAppendable(delegate, separator, afterEveryChars);
+  static Writer separatingWriter(Writer delegate, String separator, int afterEveryChars) {
+    Appendable separatingAppendable = separatingAppendable(delegate, separator, afterEveryChars);
     return new Writer() {
       @Override
       public void write(int c) throws IOException {
@@ -1103,7 +1101,7 @@
 
     @GwtIncompatible // Writer,OutputStream
     @Override
-    public OutputStream encodingStream(final Writer output) {
+    public OutputStream encodingStream(Writer output) {
       return delegate.encodingStream(separatingWriter(output, separator, afterEveryChars));
     }
 
@@ -1143,7 +1141,7 @@
 
     @Override
     @GwtIncompatible // Reader,InputStream
-    public InputStream decodingStream(final Reader reader) {
+    public InputStream decodingStream(Reader reader) {
       return delegate.decodingStream(ignoringReader(reader, separator));
     }
 
diff --git a/android/guava/src/com/google/common/io/ByteStreams.java b/android/guava/src/com/google/common/io/ByteStreams.java
index 2f1f669..99213bf 100644
--- a/android/guava/src/com/google/common/io/ByteStreams.java
+++ b/android/guava/src/com/google/common/io/ByteStreams.java
@@ -18,6 +18,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static java.lang.Math.max;
+import static java.lang.Math.min;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -170,13 +172,18 @@
    */
   private static byte[] toByteArrayInternal(InputStream in, Queue<byte[]> bufs, int totalLen)
       throws IOException {
-    // Starting with an 8k buffer, double the size of each successive buffer. Buffers are retained
-    // in a deque so that there's no copying between buffers while reading and so all of the bytes
-    // in each new allocated buffer are available for reading from the stream.
-    for (int bufSize = BUFFER_SIZE;
+    // Roughly size to match what has been read already. Some file systems, such as procfs, return 0
+    // as their length. These files are very small, so it's wasteful to allocate an 8KB buffer.
+    int initialBufferSize = min(BUFFER_SIZE, max(128, Integer.highestOneBit(totalLen) * 2));
+    // Starting with an 8k buffer, double the size of each successive buffer. Smaller buffers
+    // quadruple in size until they reach 8k, to minimize the number of small reads for longer
+    // streams. Buffers are retained in a deque so that there's no copying between buffers while
+    // reading and so all of the bytes in each new allocated buffer are available for reading from
+    // the stream.
+    for (int bufSize = initialBufferSize;
         totalLen < MAX_ARRAY_LEN;
-        bufSize = IntMath.saturatedMultiply(bufSize, 2)) {
-      byte[] buf = new byte[Math.min(bufSize, MAX_ARRAY_LEN - totalLen)];
+        bufSize = IntMath.saturatedMultiply(bufSize, bufSize < 4096 ? 4 : 2)) {
+      byte[] buf = new byte[min(bufSize, MAX_ARRAY_LEN - totalLen)];
       bufs.add(buf);
       int off = 0;
       while (off < buf.length) {
@@ -200,11 +207,18 @@
   }
 
   private static byte[] combineBuffers(Queue<byte[]> bufs, int totalLen) {
-    byte[] result = new byte[totalLen];
-    int remaining = totalLen;
+    if (bufs.isEmpty()) {
+      return new byte[0];
+    }
+    byte[] result = bufs.remove();
+    if (result.length == totalLen) {
+      return result;
+    }
+    int remaining = totalLen - result.length;
+    result = Arrays.copyOf(result, totalLen);
     while (remaining > 0) {
       byte[] buf = bufs.remove();
-      int bytesToCopy = Math.min(remaining, buf.length);
+      int bytesToCopy = min(remaining, buf.length);
       int resultOffset = totalLen - remaining;
       System.arraycopy(buf, 0, result, resultOffset, bytesToCopy);
       remaining -= bytesToCopy;
@@ -256,7 +270,7 @@
     }
 
     // the stream was longer, so read the rest normally
-    Queue<byte[]> bufs = new ArrayDeque<byte[]>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
+    Queue<byte[]> bufs = new ArrayDeque<>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
     bufs.add(bytes);
     bufs.add(new byte[] {(byte) b});
     return toByteArrayInternal(in, bufs, bytes.length + 1);
@@ -657,6 +671,7 @@
         @Override
         public void write(byte[] b, int off, int len) {
           checkNotNull(b);
+          checkPositionIndexes(off, off + len, b.length);
         }
 
         @Override
@@ -819,7 +834,7 @@
    * either the full amount has been skipped or until the end of the stream is reached, whichever
    * happens first. Returns the total number of bytes skipped.
    */
-  static long skipUpTo(InputStream in, final long n) throws IOException {
+  static long skipUpTo(InputStream in, long n) throws IOException {
     long totalSkipped = 0;
     // A buffer is allocated if skipSafely does not skip any bytes.
     byte[] buf = null;
diff --git a/android/guava/src/com/google/common/io/CharStreams.java b/android/guava/src/com/google/common/io/CharStreams.java
index c414194..d36f9a3 100644
--- a/android/guava/src/com/google/common/io/CharStreams.java
+++ b/android/guava/src/com/google/common/io/CharStreams.java
@@ -34,8 +34,6 @@
 /**
  * Provides utility methods for working with character streams.
  *
- * <p>All method parameters must be non-null unless documented otherwise.
- *
  * <p>Some of the methods in this class take arguments with a generic type of {@code Readable &
  * Closeable}. A {@link java.io.Reader} implements both of those interfaces. Similarly for {@code
  * Appendable & Closeable} and {@link java.io.Writer}.
diff --git a/android/guava/src/com/google/common/io/Files.java b/android/guava/src/com/google/common/io/Files.java
index bf6289e..ba5528f 100644
--- a/android/guava/src/com/google/common/io/Files.java
+++ b/android/guava/src/com/google/common/io/Files.java
@@ -32,6 +32,7 @@
 import com.google.common.hash.HashCode;
 import com.google.common.hash.HashFunction;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.InlineMe;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -85,7 +86,6 @@
    *     helpful predefined constants
    * @return the buffered reader
    */
-  @Beta
   public static BufferedReader newReader(File file, Charset charset) throws FileNotFoundException {
     checkNotNull(file);
     checkNotNull(charset);
@@ -104,7 +104,6 @@
    *     helpful predefined constants
    * @return the buffered writer
    */
-  @Beta
   public static BufferedWriter newWriter(File file, Charset charset) throws FileNotFoundException {
     checkNotNull(file);
     checkNotNull(charset);
@@ -235,7 +234,6 @@
    *     (2^31 - 1)
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static byte[] toByteArray(File file) throws IOException {
     return asByteSource(file).read();
   }
@@ -248,11 +246,12 @@
    *     helpful predefined constants
    * @return a string containing all the characters from the file
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(file, charset).read()}. This method is scheduled to be
-   *     removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(file, charset).read()}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(file, charset).read()",
+      imports = "com.google.common.io.Files")
   public static String toString(File file, Charset charset) throws IOException {
     return asCharSource(file, charset).read();
   }
@@ -267,7 +266,6 @@
    * @param to the destination file
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static void write(byte[] from, File to) throws IOException {
     asByteSink(to).write(from);
   }
@@ -280,11 +278,12 @@
    * @param charset the charset used to encode the output stream; see {@link StandardCharsets} for
    *     helpful predefined constants
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSink(to, charset).write(from)}. This method is scheduled to be
-   *     removed in October 2019.
+   * @deprecated Prefer {@code asCharSink(to, charset).write(from)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSink(to, charset).write(from)",
+      imports = "com.google.common.io.Files")
   public static void write(CharSequence from, File to, Charset charset) throws IOException {
     asCharSink(to, charset).write(from);
   }
@@ -299,7 +298,6 @@
    * @param to the output stream
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static void copy(File from, OutputStream to) throws IOException {
     asByteSource(from).copyTo(to);
   }
@@ -323,7 +321,6 @@
    * @throws IOException if an I/O error occurs
    * @throws IllegalArgumentException if {@code from.equals(to)}
    */
-  @Beta
   public static void copy(File from, File to) throws IOException {
     checkArgument(!from.equals(to), "Source %s and destination %s must be different", from, to);
     asByteSource(from).copyTo(asByteSink(to));
@@ -337,11 +334,12 @@
    *     helpful predefined constants
    * @param to the appendable object
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(from, charset).copyTo(to)}. This method is scheduled to
-   *     be removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(from, charset).copyTo(to)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(from, charset).copyTo(to)",
+      imports = "com.google.common.io.Files")
   public
   static void copy(File from, Charset charset, Appendable to) throws IOException {
     asCharSource(from, charset).copyTo(to);
@@ -358,8 +356,10 @@
    * @deprecated Prefer {@code asCharSink(to, charset, FileWriteMode.APPEND).write(from)}. This
    *     method is scheduled to be removed in October 2019.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSink(to, charset, FileWriteMode.APPEND).write(from)",
+      imports = {"com.google.common.io.FileWriteMode", "com.google.common.io.Files"})
   public
   static void append(CharSequence from, File to, Charset charset) throws IOException {
     asCharSink(to, charset, FileWriteMode.APPEND).write(from);
@@ -370,7 +370,6 @@
    *
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static boolean equal(File file1, File file2) throws IOException {
     checkNotNull(file1);
     checkNotNull(file2);
@@ -452,7 +451,6 @@
    * @param file the file to create or update
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   @SuppressWarnings("GoodTime") // reading system time without TimeSource
   public static void touch(File file) throws IOException {
     checkNotNull(file);
@@ -470,7 +468,6 @@
    *     directories of the specified file could not be created.
    * @since 4.0
    */
-  @Beta
   public static void createParentDirs(File file) throws IOException {
     checkNotNull(file);
     File parent = file.getCanonicalFile().getParentFile();
@@ -501,7 +498,6 @@
    * @throws IOException if an I/O error occurs
    * @throws IllegalArgumentException if {@code from.equals(to)}
    */
-  @Beta
   public static void move(File from, File to) throws IOException {
     checkNotNull(from);
     checkNotNull(to);
@@ -527,11 +523,12 @@
    *     helpful predefined constants
    * @return the first line, or null if the file is empty
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(file, charset).readFirstLine()}. This method is
-   *     scheduled to be removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(file, charset).readFirstLine()}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(file, charset).readFirstLine()",
+      imports = "com.google.common.io.Files")
   @CheckForNull
   public
   static String readFirstLine(File file, Charset charset) throws IOException {
@@ -554,7 +551,6 @@
    * @return a mutable {@link List} containing all the lines
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static List<String> readLines(File file, Charset charset) throws IOException {
     // don't use asCharSource(file, charset).readLines() because that returns
     // an immutable list, which would change the behavior of this method
@@ -586,11 +582,12 @@
    * @param callback the {@link LineProcessor} to use to handle the lines
    * @return the output of processing the lines
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(file, charset).readLines(callback)}. This method is
-   *     scheduled to be removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(file, charset).readLines(callback)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(file, charset).readLines(callback)",
+      imports = "com.google.common.io.Files")
   @CanIgnoreReturnValue // some processors won't return a useful result
   @ParametricNullness
   public
@@ -608,11 +605,12 @@
    * @param processor the object to which the bytes of the file are passed.
    * @return the result of the byte processor
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asByteSource(file).read(processor)}. This method is scheduled to be
-   *     removed in October 2019.
+   * @deprecated Prefer {@code asByteSource(file).read(processor)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asByteSource(file).read(processor)",
+      imports = "com.google.common.io.Files")
   @CanIgnoreReturnValue // some processors won't return a useful result
   @ParametricNullness
   public
@@ -629,11 +627,12 @@
    * @return the {@link HashCode} of all of the bytes in the file
    * @throws IOException if an I/O error occurs
    * @since 12.0
-   * @deprecated Prefer {@code asByteSource(file).hash(hashFunction)}. This method is scheduled to
-   *     be removed in October 2019.
+   * @deprecated Prefer {@code asByteSource(file).hash(hashFunction)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asByteSource(file).hash(hashFunction)",
+      imports = "com.google.common.io.Files")
   public
   static HashCode hash(File file, HashFunction hashFunction) throws IOException {
     return asByteSource(file).hash(hashFunction);
@@ -654,7 +653,6 @@
    * @see FileChannel#map(MapMode, long, long)
    * @since 2.0
    */
-  @Beta
   public static MappedByteBuffer map(File file) throws IOException {
     checkNotNull(file);
     return map(file, MapMode.READ_ONLY);
@@ -677,7 +675,6 @@
    * @see FileChannel#map(MapMode, long, long)
    * @since 2.0
    */
-  @Beta
   public static MappedByteBuffer map(File file, MapMode mode) throws IOException {
     return mapInternal(file, mode, -1);
   }
@@ -701,7 +698,6 @@
    * @see FileChannel#map(MapMode, long, long)
    * @since 2.0
    */
-  @Beta
   public static MappedByteBuffer map(File file, MapMode mode, long size) throws IOException {
     checkArgument(size >= 0, "size (%s) may not be negative", size);
     return mapInternal(file, mode, size);
@@ -745,7 +741,6 @@
    *
    * @since 11.0
    */
-  @Beta
   public static String simplifyPath(String pathname) {
     checkNotNull(pathname);
     if (pathname.length() == 0) {
@@ -806,7 +801,6 @@
    *
    * @since 11.0
    */
-  @Beta
   public static String getFileExtension(String fullName) {
     checkNotNull(fullName);
     String fileName = new File(fullName).getName();
@@ -824,7 +818,6 @@
    * @return The file name without its path or extension.
    * @since 14.0
    */
-  @Beta
   public static String getNameWithoutExtension(String file) {
     checkNotNull(file);
     String fileName = new File(file).getName();
@@ -880,7 +873,6 @@
    *
    * @since 15.0
    */
-  @Beta
   public static Predicate<File> isDirectory() {
     return FilePredicate.IS_DIRECTORY;
   }
@@ -890,7 +882,6 @@
    *
    * @since 15.0
    */
-  @Beta
   public static Predicate<File> isFile() {
     return FilePredicate.IS_FILE;
   }
diff --git a/android/guava/src/com/google/common/io/ParametricNullness.java b/android/guava/src/com/google/common/io/ParametricNullness.java
index afa0db1..98da765 100644
--- a/android/guava/src/com/google/common/io/ParametricNullness.java
+++ b/android/guava/src/com/google/common/io/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/io/Resources.java b/android/guava/src/com/google/common/io/Resources.java
index cc595fc..d1e3707 100644
--- a/android/guava/src/com/google/common/io/Resources.java
+++ b/android/guava/src/com/google/common/io/Resources.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Charsets;
 import com.google.common.base.MoreObjects;
@@ -36,14 +35,11 @@
  * methods use {@link URL} parameters, they are usually not appropriate for HTTP or other
  * non-classpath resources.
  *
- * <p>All method parameters must be non-null unless documented otherwise.
- *
  * @author Chris Nokleberg
  * @author Ben Yu
  * @author Colin Decker
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 @ElementTypesAreNonnullByDefault
 public final class Resources {
diff --git a/android/guava/src/com/google/common/math/LongMath.java b/android/guava/src/com/google/common/math/LongMath.java
index 1e67812..dd5ff06 100644
--- a/android/guava/src/com/google/common/math/LongMath.java
+++ b/android/guava/src/com/google/common/math/LongMath.java
@@ -425,7 +425,7 @@
         // subtracting two nonnegative longs can't overflow
         // cmpRemToHalfDivisor has the same sign as compare(abs(rem), abs(q) / 2).
         if (cmpRemToHalfDivisor == 0) { // exactly on the half mark
-          increment = (mode == HALF_UP | (mode == HALF_EVEN & (div & 1) != 0));
+          increment = (mode == HALF_UP || (mode == HALF_EVEN && (div & 1) != 0));
         } else {
           increment = cmpRemToHalfDivisor > 0; // closer to the UP value
         }
diff --git a/android/guava/src/com/google/common/math/ParametricNullness.java b/android/guava/src/com/google/common/math/ParametricNullness.java
index c079b97..8e57826 100644
--- a/android/guava/src/com/google/common/math/ParametricNullness.java
+++ b/android/guava/src/com/google/common/math/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/net/HostAndPort.java b/android/guava/src/com/google/common/net/HostAndPort.java
index 19e6b67..a27eb65 100644
--- a/android/guava/src/com/google/common/net/HostAndPort.java
+++ b/android/guava/src/com/google/common/net/HostAndPort.java
@@ -18,11 +18,11 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
 import javax.annotation.CheckForNull;
@@ -60,7 +60,6 @@
  * @author Paul Marks
  * @since 10.0
  */
-@Beta
 @Immutable
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
@@ -164,6 +163,7 @@
    * @return if parsing was successful, a populated HostAndPort object.
    * @throws IllegalArgumentException if nothing meaningful could be parsed.
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static HostAndPort fromString(String hostPortString) {
     checkNotNull(hostPortString);
     String host;
@@ -274,6 +274,7 @@
    * @return {@code this}, to enable chaining of calls.
    * @throws IllegalArgumentException if bracketless IPv6 is detected.
    */
+  @CanIgnoreReturnValue
   public HostAndPort requireBracketsForIPv6() {
     checkArgument(!hasBracketlessColons, "Possible bracketless IPv6 literal: %s", host);
     return this;
diff --git a/android/guava/src/com/google/common/net/HostSpecifier.java b/android/guava/src/com/google/common/net/HostSpecifier.java
index 7448944..c57f3d9 100644
--- a/android/guava/src/com/google/common/net/HostSpecifier.java
+++ b/android/guava/src/com/google/common/net/HostSpecifier.java
@@ -14,9 +14,9 @@
 
 package com.google.common.net;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.net.InetAddress;
 import java.text.ParseException;
 import javax.annotation.CheckForNull;
@@ -41,7 +41,6 @@
  * @author Craig Berry
  * @since 5.0
  */
-@Beta
 @GwtIncompatible
 @ElementTypesAreNonnullByDefault
 public final class HostSpecifier {
@@ -71,9 +70,9 @@
   public static HostSpecifier fromValid(String specifier) {
     // Verify that no port was specified, and strip optional brackets from
     // IPv6 literals.
-    final HostAndPort parsedHost = HostAndPort.fromString(specifier);
+    HostAndPort parsedHost = HostAndPort.fromString(specifier);
     Preconditions.checkArgument(!parsedHost.hasPort());
-    final String host = parsedHost.getHost();
+    String host = parsedHost.getHost();
 
     // Try to interpret the specifier as an IP address. Note we build
     // the address rather than using the .is* methods because we want to
@@ -93,7 +92,7 @@
     // It is not any kind of IP address; must be a domain name or invalid.
 
     // TODO(user): different versions of this for different factories?
-    final InternetDomainName domain = InternetDomainName.from(host);
+    InternetDomainName domain = InternetDomainName.from(host);
 
     if (domain.hasPublicSuffix()) {
       return new HostSpecifier(domain.toString());
@@ -110,6 +109,7 @@
    *
    * @throws ParseException if the specifier is not valid.
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static HostSpecifier from(String specifier) throws ParseException {
     try {
       return fromValid(specifier);
@@ -130,7 +130,7 @@
    */
   public static boolean isValid(String specifier) {
     try {
-      fromValid(specifier);
+      HostSpecifier unused = fromValid(specifier);
       return true;
     } catch (IllegalArgumentException e) {
       return false;
@@ -144,7 +144,7 @@
     }
 
     if (other instanceof HostSpecifier) {
-      final HostSpecifier that = (HostSpecifier) other;
+      HostSpecifier that = (HostSpecifier) other;
       return this.canonicalForm.equals(that.canonicalForm);
     }
 
diff --git a/android/guava/src/com/google/common/net/HttpHeaders.java b/android/guava/src/com/google/common/net/HttpHeaders.java
index f318da1..2ecbfaa 100644
--- a/android/guava/src/com/google/common/net/HttpHeaders.java
+++ b/android/guava/src/com/google/common/net/HttpHeaders.java
@@ -14,7 +14,6 @@
 
 package com.google.common.net;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 
 /**
@@ -102,7 +101,6 @@
    *
    * @since 17.0
    */
-  @Beta
   public static final String FOLLOW_ONLY_WHEN_PRERENDER_SHOWN = "Follow-Only-When-Prerender-Shown";
   /** The HTTP {@code Host} header field name. */
   public static final String HOST = "Host";
@@ -201,6 +199,14 @@
   public static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
   /** The HTTP {@code Access-Control-Allow-Origin} header field name. */
   public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
+  /**
+   * The HTTP <a href="https://wicg.github.io/private-network-access/#headers">{@code
+   * Access-Control-Allow-Private-Network}</a> header field name.
+   *
+   * @since 31.1
+   */
+  public static final String ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK =
+      "Access-Control-Allow-Private-Network";
   /** The HTTP {@code Access-Control-Allow-Credentials} header field name. */
   public static final String ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials";
   /** The HTTP {@code Access-Control-Expose-Headers} header field name. */
@@ -357,7 +363,7 @@
    *
    * @since 27.1
    */
-  @Beta public static final String SOURCE_MAP = "SourceMap";
+  public static final String SOURCE_MAP = "SourceMap";
 
   /**
    * The HTTP <a href="http://tools.ietf.org/html/rfc6797#section-6.1">{@code
@@ -455,14 +461,14 @@
    *
    * @since 15.0
    */
-  @Beta public static final String PUBLIC_KEY_PINS = "Public-Key-Pins";
+  public static final String PUBLIC_KEY_PINS = "Public-Key-Pins";
   /**
    * The HTTP <a href="http://tools.ietf.org/html/draft-evans-palmer-key-pinning">{@code
    * Public-Key-Pins-Report-Only}</a> header field name.
    *
    * @since 15.0
    */
-  @Beta public static final String PUBLIC_KEY_PINS_REPORT_ONLY = "Public-Key-Pins-Report-Only";
+  public static final String PUBLIC_KEY_PINS_REPORT_ONLY = "Public-Key-Pins-Report-Only";
   /**
    * The HTTP {@code X-Request-ID} header field name.
    *
@@ -482,7 +488,7 @@
    *
    * @since 24.1
    */
-  @Beta public static final String X_DOWNLOAD_OPTIONS = "X-Download-Options";
+  public static final String X_DOWNLOAD_OPTIONS = "X-Download-Options";
   /** The HTTP {@code X-XSS-Protection} header field name. */
   public static final String X_XSS_PROTECTION = "X-XSS-Protection";
   /**
@@ -665,9 +671,17 @@
    * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-full-version">{@code
    * Sec-CH-UA-Full-Version}</a> header field name.
    *
+   * @deprecated Prefer {@link SEC_CH_UA_FULL_VERSION_LIST}.
    * @since 30.0
    */
-  public static final String SEC_CH_UA_FULL_VERSION = "Sec-CH-UA-Full-Version";
+  @Deprecated public static final String SEC_CH_UA_FULL_VERSION = "Sec-CH-UA-Full-Version";
+  /**
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-full-version-list">{@code
+   * Sec-CH-UA-Full-Version}</a> header field name.
+   *
+   * @since 31.1
+   */
+  public static final String SEC_CH_UA_FULL_VERSION_LIST = "Sec-CH-UA-Full-Version-List";
   /**
    * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-mobile">{@code
    * Sec-CH-UA-Mobile}</a> header field name.
diff --git a/android/guava/src/com/google/common/net/InetAddresses.java b/android/guava/src/com/google/common/net/InetAddresses.java
index 4e2aa69..d3e68db 100644
--- a/android/guava/src/com/google/common/net/InetAddresses.java
+++ b/android/guava/src/com/google/common/net/InetAddresses.java
@@ -17,13 +17,13 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.MoreObjects;
 import com.google.common.hash.Hashing;
 import com.google.common.io.ByteStreams;
 import com.google.common.primitives.Ints;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
@@ -95,7 +95,6 @@
  * @author Erik Kline
  * @since 5.0
  */
-@Beta
 @GwtIncompatible
 @ElementTypesAreNonnullByDefault
 public final class InetAddresses {
@@ -144,6 +143,7 @@
    * @return {@link InetAddress} representing the argument
    * @throws IllegalArgumentException if the argument is not a valid IP string literal
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static InetAddress forString(String ipString) {
     byte[] addr = ipStringToBytes(ipString);
 
@@ -667,7 +667,6 @@
    *
    * @since 5.0
    */
-  @Beta
   public static final class TeredoInfo {
     private final Inet4Address server;
     private final Inet4Address client;
diff --git a/android/guava/src/com/google/common/net/InternetDomainName.java b/android/guava/src/com/google/common/net/InternetDomainName.java
index 5873449..d71a9d5 100644
--- a/android/guava/src/com/google/common/net/InternetDomainName.java
+++ b/android/guava/src/com/google/common/net/InternetDomainName.java
@@ -18,7 +18,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Ascii;
 import com.google.common.base.CharMatcher;
@@ -26,6 +25,7 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import com.google.thirdparty.publicsuffix.PublicSuffixPatterns;
 import com.google.thirdparty.publicsuffix.PublicSuffixType;
@@ -71,7 +71,6 @@
  * @author Catherine Berry
  * @since 5.0
  */
-@Beta
 @GwtCompatible(emulated = true)
 @Immutable
 @ElementTypesAreNonnullByDefault
@@ -163,7 +162,7 @@
    * Otherwise, it finds the first suffix of any type.
    */
   private int findSuffixOfType(Optional<PublicSuffixType> desiredType) {
-    final int partsSize = parts.size();
+    int partsSize = parts.size();
 
     for (int i = 0; i < partsSize; i++) {
       String ancestorName = DOT_JOINER.join(parts.subList(i, partsSize));
@@ -206,6 +205,7 @@
    *     {@link #isValid}
    * @since 10.0 (previously named {@code fromLenient})
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static InternetDomainName from(String domain) {
     return new InternetDomainName(checkNotNull(domain));
   }
@@ -217,7 +217,7 @@
    * @return Is the domain name syntactically valid?
    */
   private static boolean validateSyntax(List<String> parts) {
-    final int lastIndex = parts.size() - 1;
+    int lastIndex = parts.size() - 1;
 
     // Validate the last part specially, as it has different syntax rules.
 
@@ -584,7 +584,7 @@
    */
   public static boolean isValid(String name) {
     try {
-      from(name);
+      InternetDomainName unused = from(name);
       return true;
     } catch (IllegalArgumentException e) {
       return false;
diff --git a/android/guava/src/com/google/common/net/MediaType.java b/android/guava/src/com/google/common/net/MediaType.java
index ca47161..a713d0b 100644
--- a/android/guava/src/com/google/common/net/MediaType.java
+++ b/android/guava/src/com/google/common/net/MediaType.java
@@ -21,11 +21,9 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Ascii;
 import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Joiner.MapJoiner;
 import com.google.common.base.MoreObjects;
@@ -37,12 +35,12 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.nio.charset.Charset;
 import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
-import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
 import javax.annotation.CheckForNull;
@@ -72,7 +70,6 @@
  * @since 12.0
  * @author Gregory Kick
  */
-@Beta
 @GwtCompatible
 @Immutable
 @ElementTypesAreNonnullByDefault
@@ -792,14 +789,7 @@
   }
 
   private Map<String, ImmutableMultiset<String>> parametersAsMap() {
-    return Maps.transformValues(
-        parameters.asMap(),
-        new Function<Collection<String>, ImmutableMultiset<String>>() {
-          @Override
-          public ImmutableMultiset<String> apply(Collection<String> input) {
-            return ImmutableMultiset.copyOf(input);
-          }
-        });
+    return Maps.transformValues(parameters.asMap(), ImmutableMultiset::copyOf);
   }
 
   /**
@@ -1049,6 +1039,7 @@
    *
    * @throws IllegalArgumentException if the input is not parsable
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static MediaType parse(String input) {
     checkNotNull(input);
     Tokenizer tokenizer = new Tokenizer(input);
@@ -1063,7 +1054,7 @@
         tokenizer.consumeTokenIfPresent(LINEAR_WHITE_SPACE);
         String attribute = tokenizer.consumeToken(TOKEN_MATCHER);
         tokenizer.consumeCharacter('=');
-        final String value;
+        String value;
         if ('"' == tokenizer.previewChar()) {
           tokenizer.consumeCharacter('"');
           StringBuilder valueBuilder = new StringBuilder();
@@ -1096,6 +1087,7 @@
       this.input = input;
     }
 
+    @CanIgnoreReturnValue
     String consumeTokenIfPresent(CharMatcher matcher) {
       checkState(hasMore());
       int startPosition = position;
@@ -1118,6 +1110,7 @@
       return c;
     }
 
+    @CanIgnoreReturnValue
     char consumeCharacter(char c) {
       checkState(hasMore());
       checkState(previewChar() == c);
@@ -1185,14 +1178,10 @@
       Multimap<String, String> quotedParameters =
           Multimaps.transformValues(
               parameters,
-              new Function<String, String>() {
-                @Override
-                public String apply(String value) {
-                  return (TOKEN_MATCHER.matchesAllOf(value) && !value.isEmpty())
+              (String value) ->
+                  (TOKEN_MATCHER.matchesAllOf(value) && !value.isEmpty())
                       ? value
-                      : escapeAndQuote(value);
-                }
-              });
+                      : escapeAndQuote(value));
       PARAMETER_JOINER.appendTo(builder, quotedParameters.entries());
     }
     return builder.toString();
diff --git a/android/guava/src/com/google/common/net/ParametricNullness.java b/android/guava/src/com/google/common/net/ParametricNullness.java
index acc3eab..1ad2e27 100644
--- a/android/guava/src/com/google/common/net/ParametricNullness.java
+++ b/android/guava/src/com/google/common/net/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/net/PercentEscaper.java b/android/guava/src/com/google/common/net/PercentEscaper.java
index 7c7de9b..9290147 100644
--- a/android/guava/src/com/google/common/net/PercentEscaper.java
+++ b/android/guava/src/com/google/common/net/PercentEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.UnicodeEscaper;
 import javax.annotation.CheckForNull;
@@ -50,7 +49,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class PercentEscaper extends UnicodeEscaper {
diff --git a/android/guava/src/com/google/common/net/package-info.java b/android/guava/src/com/google/common/net/package-info.java
index d9db266..d55642d 100644
--- a/android/guava/src/com/google/common/net/package-info.java
+++ b/android/guava/src/com/google/common/net/package-info.java
@@ -21,7 +21,9 @@
  *
  * @author Craig Berry
  */
+@CheckReturnValue
 @ParametersAreNonnullByDefault
 package com.google.common.net;
 
+import com.google.errorprone.annotations.CheckReturnValue;
 import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/android/guava/src/com/google/common/primitives/ParametricNullness.java b/android/guava/src/com/google/common/primitives/ParametricNullness.java
index 17d606c..4289b9b 100644
--- a/android/guava/src/com/google/common/primitives/ParametricNullness.java
+++ b/android/guava/src/com/google/common/primitives/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/primitives/UnsignedBytes.java b/android/guava/src/com/google/common/primitives/UnsignedBytes.java
index bf9a306..db4f489 100644
--- a/android/guava/src/com/google/common/primitives/UnsignedBytes.java
+++ b/android/guava/src/com/google/common/primitives/UnsignedBytes.java
@@ -365,7 +365,7 @@
 
       @Override
       public int compare(byte[] left, byte[] right) {
-        final int stride = 8;
+        int stride = 8;
         int minLength = Math.min(left.length, right.length);
         int strideLimit = minLength & ~(stride - 1);
         int i;
diff --git a/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java b/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
index 4666f99..ff92195 100644
--- a/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
+++ b/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
@@ -14,7 +14,6 @@
 
 package com.google.common.reflect;
 
-import com.google.common.annotations.Beta;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
@@ -39,7 +38,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public abstract class AbstractInvocationHandler implements InvocationHandler {
 
diff --git a/android/guava/src/com/google/common/reflect/ClassPath.java b/android/guava/src/com/google/common/reflect/ClassPath.java
index de693da..d15bb50 100644
--- a/android/guava/src/com/google/common/reflect/ClassPath.java
+++ b/android/guava/src/com/google/common/reflect/ClassPath.java
@@ -20,10 +20,8 @@
 import static com.google.common.base.StandardSystemProperty.PATH_SEPARATOR;
 import static java.util.logging.Level.WARNING;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.CharMatcher;
-import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
@@ -92,7 +90,6 @@
  * @author Ben Yu
  * @since 14.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class ClassPath {
   private static final Logger logger = Logger.getLogger(ClassPath.class.getName());
@@ -167,13 +164,7 @@
   public ImmutableSet<ClassInfo> getTopLevelClasses() {
     return FluentIterable.from(resources)
         .filter(ClassInfo.class)
-        .filter(
-            new Predicate<ClassInfo>() {
-              @Override
-              public boolean apply(ClassInfo info) {
-                return info.isTopLevel();
-              }
-            })
+        .filter(ClassInfo::isTopLevel)
         .toSet();
   }
 
@@ -211,7 +202,6 @@
    *
    * @since 14.0
    */
-  @Beta
   public static class ResourceInfo {
     private final File file;
     private final String resourceName;
@@ -307,7 +297,6 @@
    *
    * @since 14.0
    */
-  @Beta
   public static final class ClassInfo extends ResourceInfo {
     private final String className;
 
diff --git a/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java b/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
index 7fad5de..6273704 100644
--- a/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
+++ b/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
@@ -14,12 +14,12 @@
 
 package com.google.common.reflect;
 
-import com.google.common.annotations.Beta;
 import com.google.common.collect.ForwardingMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotCall;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 
 /**
  * A type-to-instance map backed by an {@link ImmutableMap}. See also {@link
@@ -28,18 +28,18 @@
  * @author Ben Yu
  * @since 13.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public final class ImmutableTypeToInstanceMap<B> extends ForwardingMap<TypeToken<? extends B>, B>
     implements TypeToInstanceMap<B> {
 
   /** Returns an empty type to instance map. */
   public static <B> ImmutableTypeToInstanceMap<B> of() {
-    return new ImmutableTypeToInstanceMap<B>(ImmutableMap.<TypeToken<? extends B>, B>of());
+    return new ImmutableTypeToInstanceMap<>(ImmutableMap.<TypeToken<? extends B>, B>of());
   }
 
   /** Returns a new builder. */
   public static <B> Builder<B> builder() {
-    return new Builder<B>();
+    return new Builder<>();
   }
 
   /**
@@ -58,7 +58,6 @@
    *
    * @since 13.0
    */
-  @Beta
   public static final class Builder<B> {
     private final ImmutableMap.Builder<TypeToken<? extends B>, B> mapBuilder =
         ImmutableMap.builder();
@@ -91,7 +90,7 @@
      * @throws IllegalArgumentException if duplicate keys were added
      */
     public ImmutableTypeToInstanceMap<B> build() {
-      return new ImmutableTypeToInstanceMap<B>(mapBuilder.build());
+      return new ImmutableTypeToInstanceMap<>(mapBuilder.buildOrThrow());
     }
   }
 
@@ -102,11 +101,13 @@
   }
 
   @Override
+  @CheckForNull
   public <T extends B> T getInstance(TypeToken<T> type) {
     return trustedGet(type.rejectTypeVariables());
   }
 
   @Override
+  @CheckForNull
   public <T extends B> T getInstance(Class<T> type) {
     return trustedGet(TypeToken.of(type));
   }
@@ -121,6 +122,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public <T extends B> T putInstance(TypeToken<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -135,6 +137,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public <T extends B> T putInstance(Class<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -149,6 +152,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException();
   }
@@ -172,6 +176,7 @@
   }
 
   @SuppressWarnings("unchecked") // value could not get in if not a T
+  @CheckForNull
   private <T extends B> T trustedGet(TypeToken<T> type) {
     return (T) delegate.get(type);
   }
diff --git a/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java b/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
index dccd298..9542e0a 100644
--- a/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
+++ b/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
@@ -16,8 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
 import com.google.common.collect.ForwardingMap;
 import com.google.common.collect.ForwardingMapEntry;
 import com.google.common.collect.ForwardingSet;
@@ -28,43 +26,47 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A mutable type-to-instance map. See also {@link ImmutableTypeToInstanceMap}.
  *
+ * <p>This implementation <i>does</i> support null values, despite how it is annotated; see
+ * discussion at {@link TypeToInstanceMap}.
+ *
  * @author Ben Yu
  * @since 13.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public final class MutableTypeToInstanceMap<B> extends ForwardingMap<TypeToken<? extends B>, B>
     implements TypeToInstanceMap<B> {
 
   private final Map<TypeToken<? extends B>, B> backingMap = Maps.newHashMap();
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public <T extends B> T getInstance(Class<T> type) {
     return trustedGet(TypeToken.of(type));
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public <T extends B> T getInstance(TypeToken<T> type) {
     return trustedGet(type.rejectTypeVariables());
   }
 
   @Override
   @CanIgnoreReturnValue
-  @NullableDecl
-  public <T extends B> T putInstance(Class<T> type, @NullableDecl T value) {
+  @CheckForNull
+  public <T extends B> T putInstance(Class<T> type, T value) {
     return trustedPut(TypeToken.of(type), value);
   }
 
   @Override
   @CanIgnoreReturnValue
-  @NullableDecl
-  public <T extends B> T putInstance(TypeToken<T> type, @NullableDecl T value) {
+  @CheckForNull
+  public <T extends B> T putInstance(TypeToken<T> type, T value) {
     return trustedPut(type.rejectTypeVariables(), value);
   }
 
@@ -78,6 +80,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException("Please use putInstance() instead.");
   }
@@ -106,13 +109,13 @@
   }
 
   @SuppressWarnings("unchecked") // value could not get in if not a T
-  @NullableDecl
-  private <T extends B> T trustedPut(TypeToken<T> type, @NullableDecl T value) {
+  @CheckForNull
+  private <T extends B> T trustedPut(TypeToken<T> type, T value) {
     return (T) backingMap.put(type, value);
   }
 
   @SuppressWarnings("unchecked") // value could not get in if not a T
-  @NullableDecl
+  @CheckForNull
   private <T extends B> T trustedGet(TypeToken<T> type) {
     return (T) backingMap.get(type);
   }
@@ -121,7 +124,7 @@
 
     private final Entry<K, V> delegate;
 
-    static <K, V> Set<Entry<K, V>> transformEntries(final Set<Entry<K, V>> entries) {
+    static <K, V> Set<Entry<K, V>> transformEntries(Set<Entry<K, V>> entries) {
       return new ForwardingSet<Map.Entry<K, V>>() {
         @Override
         protected Set<Entry<K, V>> delegate() {
@@ -135,25 +138,27 @@
 
         @Override
         public Object[] toArray() {
-          return standardToArray();
+          /*
+           * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it
+           * can be used with collections that may contain null. This collection is a collection of
+           * non-null Entry objects (Entry objects that might contain null values but are not
+           * themselves null), so we can treat it as a plain `Object[]`.
+           */
+          @SuppressWarnings("nullness")
+          Object[] result = standardToArray();
+          return result;
         }
 
         @Override
-        public <T> T[] toArray(T[] array) {
+        @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+        public <T extends @Nullable Object> T[] toArray(T[] array) {
           return standardToArray(array);
         }
       };
     }
 
     private static <K, V> Iterator<Entry<K, V>> transformEntries(Iterator<Entry<K, V>> entries) {
-      return Iterators.transform(
-          entries,
-          new Function<Entry<K, V>, Entry<K, V>>() {
-            @Override
-            public Entry<K, V> apply(Entry<K, V> entry) {
-              return new UnmodifiableEntry<>(entry);
-            }
-          });
+      return Iterators.transform(entries, UnmodifiableEntry::new);
     }
 
     private UnmodifiableEntry(java.util.Map.Entry<K, V> delegate) {
diff --git a/android/guava/src/com/google/common/reflect/Parameter.java b/android/guava/src/com/google/common/reflect/Parameter.java
index a55734a..a5be09d 100644
--- a/android/guava/src/com/google/common/reflect/Parameter.java
+++ b/android/guava/src/com/google/common/reflect/Parameter.java
@@ -27,6 +27,10 @@
 /**
  * Represents a method or constructor parameter.
  *
+ * <p><b>Note:</b> Since Java 8 introduced {@link java.lang.reflect.Parameter} to represent method
+ * and constructor parameters, this class is no longer necessary. We intend to deprecate it in a
+ * future version.
+ *
  * @author Ben Yu
  * @since 14.0
  */
diff --git a/android/guava/src/com/google/common/reflect/ParametricNullness.java b/android/guava/src/com/google/common/reflect/ParametricNullness.java
index 588aa5f..b6331ac 100644
--- a/android/guava/src/com/google/common/reflect/ParametricNullness.java
+++ b/android/guava/src/com/google/common/reflect/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/reflect/Reflection.java b/android/guava/src/com/google/common/reflect/Reflection.java
index fa35f7f..9544963 100644
--- a/android/guava/src/com/google/common/reflect/Reflection.java
+++ b/android/guava/src/com/google/common/reflect/Reflection.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
 
@@ -26,7 +25,6 @@
  *
  * @since 12.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class Reflection {
 
diff --git a/android/guava/src/com/google/common/reflect/TypeParameter.java b/android/guava/src/com/google/common/reflect/TypeParameter.java
index 9c64abb..69cd829 100644
--- a/android/guava/src/com/google/common/reflect/TypeParameter.java
+++ b/android/guava/src/com/google/common/reflect/TypeParameter.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.annotations.Beta;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import javax.annotation.CheckForNull;
@@ -34,7 +33,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 /*
  * A nullable bound would let users create a TypeParameter instance for a parameter with a nullable
diff --git a/android/guava/src/com/google/common/reflect/TypeResolver.java b/android/guava/src/com/google/common/reflect/TypeResolver.java
index fbe48c1..32517eb 100644
--- a/android/guava/src/com/google/common/reflect/TypeResolver.java
+++ b/android/guava/src/com/google/common/reflect/TypeResolver.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Arrays.asList;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableMap;
@@ -51,7 +50,6 @@
  * @author Ben Yu
  * @since 15.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class TypeResolver {
 
@@ -123,7 +121,7 @@
   }
 
   private static void populateTypeMappings(
-      final Map<TypeVariableKey, Type> mappings, final Type from, final Type to) {
+      Map<TypeVariableKey, Type> mappings, Type from, Type to) {
     if (from.equals(to)) {
       return;
     }
@@ -296,11 +294,11 @@
         checkArgument(!variable.equalsType(type), "Type variable %s bound to itself", variable);
         builder.put(variable, type);
       }
-      return new TypeTable(builder.build());
+      return new TypeTable(builder.buildOrThrow());
     }
 
-    final Type resolve(final TypeVariable<?> var) {
-      final TypeTable unguarded = this;
+    final Type resolve(TypeVariable<?> var) {
+      TypeTable unguarded = this;
       TypeTable guarded =
           new TypeTable() {
             @Override
@@ -414,7 +412,7 @@
       visit(t.getUpperBounds());
     }
 
-    private void map(final TypeVariableKey var, final Type arg) {
+    private void map(TypeVariableKey var, Type arg) {
       if (mappings.containsKey(var)) {
         // Mapping already established
         // This is possible when following both superClass -> enclosingClass
@@ -504,7 +502,7 @@
       return Types.newArtificialTypeVariable(WildcardCapturer.class, name, upperBounds);
     }
 
-    private WildcardCapturer forTypeVariable(final TypeVariable<?> typeParam) {
+    private WildcardCapturer forTypeVariable(TypeVariable<?> typeParam) {
       return new WildcardCapturer(id) {
         @Override
         TypeVariable<?> captureAsTypeVariable(Type[] upperBounds) {
diff --git a/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java b/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java
index 80396bc..8a418df 100644
--- a/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java
+++ b/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java
@@ -14,11 +14,10 @@
 
 package com.google.common.reflect;
 
-import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A map, each entry of which maps a {@link TypeToken} to an instance of that type. In addition to
@@ -35,12 +34,15 @@
  * <p>Like any other {@code Map<Class, Object>}, this map may contain entries for primitive types,
  * and a primitive type and its corresponding wrapper type may map to different values.
  *
+ * <p>This class's support for {@code null} requires some explanation. For details, see {@link
+ * ClassToInstanceMap}. Its explanation applies equally well to {@code TypeToInstanceMap}.
+ *
  * @param <B> the common supertype that all entries must share; often this is simply {@link Object}
  * @author Ben Yu
  * @since 13.0
  */
-@Beta
 @DoNotMock("Use ImmutableTypeToInstanceMap or MutableTypeToInstanceMap")
+@ElementTypesAreNonnullByDefault
 public interface TypeToInstanceMap<B> extends Map<TypeToken<? extends B>, B> {
 
   /**
@@ -51,7 +53,7 @@
    * <p>{@code getInstance(Foo.class)} is equivalent to {@code
    * getInstance(TypeToken.of(Foo.class))}.
    */
-  @NullableDecl
+  @CheckForNull
   <T extends B> T getInstance(Class<T> type);
 
   /**
@@ -59,7 +61,7 @@
    * present. This will only return a value that was bound to this specific type, not a value that
    * may have been bound to a subtype.
    */
-  @NullableDecl
+  @CheckForNull
   <T extends B> T getInstance(TypeToken<T> type);
 
   /**
@@ -73,8 +75,8 @@
    *     null} if there was no previous entry.
    */
   @CanIgnoreReturnValue
-  @NullableDecl
-  <T extends B> T putInstance(Class<T> type, @NullableDecl T value);
+  @CheckForNull
+  <T extends B> T putInstance(Class<T> type, T value);
 
   /**
    * Maps the specified type to the specified value. Does <i>not</i> associate this value with any
@@ -84,6 +86,6 @@
    *     if there was no previous entry.
    */
   @CanIgnoreReturnValue
-  @NullableDecl
-  <T extends B> T putInstance(TypeToken<T> type, @NullableDecl T value);
+  @CheckForNull
+  <T extends B> T putInstance(TypeToken<T> type, T value);
 }
diff --git a/android/guava/src/com/google/common/reflect/TypeToken.java b/android/guava/src/com/google/common/reflect/TypeToken.java
index f107b70..fea1d53 100644
--- a/android/guava/src/com/google/common/reflect/TypeToken.java
+++ b/android/guava/src/com/google/common/reflect/TypeToken.java
@@ -97,7 +97,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @SuppressWarnings("serial") // SimpleTypeToken is the serialized form.
 @ElementTypesAreNonnullByDefault
 public abstract class TypeToken<T> extends TypeCapture<T> implements Serializable {
@@ -168,7 +167,7 @@
 
   /** Returns an instance of type token that wraps {@code type}. */
   public static <T> TypeToken<T> of(Class<T> type) {
-    return new SimpleTypeToken<T>(type);
+    return new SimpleTypeToken<>(type);
   }
 
   /** Returns an instance of type token that wraps {@code type}. */
@@ -240,7 +239,7 @@
                 ImmutableMap.of(
                     new TypeResolver.TypeVariableKey(typeParam.typeVariable), typeArg.runtimeType));
     // If there's any type error, we'd report now rather than later.
-    return new SimpleTypeToken<T>(resolver.resolveType(runtimeType));
+    return new SimpleTypeToken<>(resolver.resolveType(runtimeType));
   }
 
   /**
@@ -591,6 +590,7 @@
    *
    * @since 14.0
    */
+  @Beta
   public final Invokable<T, Object> method(Method method) {
     checkArgument(
         this.someRawTypeIsSubclassOf(method.getDeclaringClass()),
@@ -630,6 +630,7 @@
    *
    * @since 14.0
    */
+  @Beta
   public final Invokable<T, T> constructor(Constructor<?> constructor) {
     checkArgument(
         constructor.getDeclaringClass() == getRawType(),
@@ -746,15 +747,7 @@
       @SuppressWarnings({"unchecked", "rawtypes"})
       ImmutableList<Class<? super T>> collectedTypes =
           (ImmutableList) TypeCollector.FOR_RAW_TYPE.collectTypes(getRawTypes());
-      return FluentIterable.from(collectedTypes)
-          .filter(
-              new Predicate<Class<?>>() {
-                @Override
-                public boolean apply(Class<?> type) {
-                  return type.isInterface();
-                }
-              })
-          .toSet();
+      return FluentIterable.from(collectedTypes).filter(Class::isInterface).toSet();
     }
 
     @Override
@@ -1103,7 +1096,7 @@
   }
 
   private ImmutableSet<Class<? super T>> getRawTypes() {
-    final ImmutableSet.Builder<Class<?>> builder = ImmutableSet.builder();
+    ImmutableSet.Builder<Class<?>> builder = ImmutableSet.builder();
     new TypeVisitor() {
       @Override
       void visitTypeVariable(TypeVariable<?> t) {
@@ -1428,7 +1421,7 @@
     }
 
     private static <K, V> ImmutableList<K> sortKeysByValue(
-        final Map<K, V> map, final Comparator<? super V> valueComparator) {
+        Map<K, V> map, Comparator<? super V> valueComparator) {
       Ordering<K> keyOrdering =
           new Ordering<K>() {
             @Override
diff --git a/android/guava/src/com/google/common/reflect/Types.java b/android/guava/src/com/google/common/reflect/Types.java
index 0dc327d..e69b42a 100644
--- a/android/guava/src/com/google/common/reflect/Types.java
+++ b/android/guava/src/com/google/common/reflect/Types.java
@@ -20,7 +20,6 @@
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.base.Predicates;
@@ -57,14 +56,6 @@
 final class Types {
 
   /** Class#toString without the "class " and "interface " prefixes */
-  private static final Function<Type, String> TYPE_NAME =
-      new Function<Type, String>() {
-        @Override
-        public String apply(Type from) {
-          return JavaVersion.CURRENT.typeName(from);
-        }
-      };
-
   private static final Joiner COMMA_JOINER = Joiner.on(", ").useForNull("null");
 
   /** Returns the array type of {@code componentType}. */
@@ -180,7 +171,7 @@
   @CheckForNull
   static Type getComponentType(Type type) {
     checkNotNull(type);
-    final AtomicReference<@Nullable Type> result = new AtomicReference<>();
+    AtomicReference<@Nullable Type> result = new AtomicReference<>();
     new TypeVisitor() {
       @Override
       void visitTypeVariable(TypeVariable<?> t) {
@@ -303,7 +294,7 @@
       return builder
           .append(rawType.getName())
           .append('<')
-          .append(COMMA_JOINER.join(transform(argumentsList, TYPE_NAME)))
+          .append(COMMA_JOINER.join(transform(argumentsList, JavaVersion.CURRENT::typeName)))
           .append('>')
           .toString();
     }
@@ -331,8 +322,7 @@
 
   private static <D extends GenericDeclaration> TypeVariable<D> newTypeVariableImpl(
       D genericDeclaration, String name, Type[] bounds) {
-    TypeVariableImpl<D> typeVariableImpl =
-        new TypeVariableImpl<D>(genericDeclaration, name, bounds);
+    TypeVariableImpl<D> typeVariableImpl = new TypeVariableImpl<>(genericDeclaration, name, bounds);
     @SuppressWarnings("unchecked")
     TypeVariable<D> typeVariable =
         Reflection.newProxy(
@@ -382,7 +372,7 @@
           builder.put(method.getName(), method);
         }
       }
-      typeVariableMethods = builder.build();
+      typeVariableMethods = builder.buildKeepingLast();
     }
 
     private final TypeVariableImpl<?> typeVariableImpl;
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java b/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
index 624caa9..3e08045 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
@@ -78,7 +78,7 @@
     implements ListenableFuture<V> {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
-  private static final boolean GENERATE_CANCELLATION_CAUSES;
+  static final boolean GENERATE_CANCELLATION_CAUSES;
 
   static {
     // System.getProperty may throw if the security policy does not permit access.
@@ -1084,7 +1084,6 @@
    * method returns @Nullable, too. However, we're not sure if we want to make any changes to that
    * class, since it's in a separate artifact that we planned to release only a single version of.
    */
-  @SuppressWarnings("nullness")
   @CheckForNull
   protected final Throwable tryInternalFastPathGetFailure() {
     if (this instanceof Trusted) {
@@ -1108,10 +1107,7 @@
 
   /** Releases all threads in the {@link #waiters} list, and clears the list. */
   private void releaseWaiters() {
-    Waiter head;
-    do {
-      head = waiters;
-    } while (!ATOMIC_HELPER.casWaiters(this, head, Waiter.TOMBSTONE));
+    Waiter head = ATOMIC_HELPER.gasWaiters(this, Waiter.TOMBSTONE);
     for (Waiter currentWaiter = head; currentWaiter != null; currentWaiter = currentWaiter.next) {
       currentWaiter.unpark();
     }
@@ -1129,10 +1125,7 @@
     // 2. reverse the linked list, because despite our rather clear contract, people depend on us
     //    executing listeners in the order they were added
     // 3. push all the items onto 'onto' and return the new head of the stack
-    Listener head;
-    do {
-      head = listeners;
-    } while (!ATOMIC_HELPER.casListeners(this, head, Listener.TOMBSTONE));
+    Listener head = ATOMIC_HELPER.gasListeners(this, Listener.TOMBSTONE);
     Listener reversedList = onto;
     while (head != null) {
       Listener tmp = head;
@@ -1301,6 +1294,12 @@
     abstract boolean casListeners(
         AbstractFuture<?> future, @CheckForNull Listener expect, Listener update);
 
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    abstract Waiter gasWaiters(AbstractFuture<?> future, Waiter update);
+
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    abstract Listener gasListeners(AbstractFuture<?> future, Listener update);
+
     /** Performs a CAS operation on the {@link #value} field. */
     abstract boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update);
   }
@@ -1383,6 +1382,34 @@
       return UNSAFE.compareAndSwapObject(future, LISTENERS_OFFSET, expect, update);
     }
 
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    @Override
+    Listener gasListeners(AbstractFuture<?> future, Listener update) {
+      while (true) {
+        Listener listener = future.listeners;
+        if (update == listener) {
+          return listener;
+        }
+        if (casListeners(future, listener, update)) {
+          return listener;
+        }
+      }
+    }
+
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    @Override
+    Waiter gasWaiters(AbstractFuture<?> future, Waiter update) {
+      while (true) {
+        Waiter waiter = future.waiters;
+        if (update == waiter) {
+          return waiter;
+        }
+        if (casWaiters(future, waiter, update)) {
+          return waiter;
+        }
+      }
+    }
+
     /** Performs a CAS operation on the {@link #value} field. */
     @Override
     boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
@@ -1433,6 +1460,18 @@
       return listenersUpdater.compareAndSet(future, expect, update);
     }
 
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    @Override
+    Listener gasListeners(AbstractFuture<?> future, Listener update) {
+      return listenersUpdater.getAndSet(future, update);
+    }
+
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    @Override
+    Waiter gasWaiters(AbstractFuture<?> future, Waiter update) {
+      return waitersUpdater.getAndSet(future, update);
+    }
+
     @Override
     boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       return valueUpdater.compareAndSet(future, expect, update);
@@ -1479,6 +1518,30 @@
       }
     }
 
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    @Override
+    Listener gasListeners(AbstractFuture<?> future, Listener update) {
+      synchronized (future) {
+        Listener old = future.listeners;
+        if (old != update) {
+          future.listeners = update;
+        }
+        return old;
+      }
+    }
+
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    @Override
+    Waiter gasWaiters(AbstractFuture<?> future, Waiter update) {
+      synchronized (future) {
+        Waiter old = future.waiters;
+        if (old != update) {
+          future.waiters = update;
+        }
+        return old;
+      }
+    }
+
     @Override
     boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       synchronized (future) {
diff --git a/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java b/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
index a32e76c..6d2ed9c 100644
--- a/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
@@ -135,29 +135,26 @@
       // This is not actually a problem, since the foreach only needs this.futures to be non-null
       // at the beginning of the loop.
       int i = 0;
-      for (final ListenableFuture<? extends InputT> future : futures) {
-        final int index = i++;
+      for (ListenableFuture<? extends InputT> future : futures) {
+        int index = i++;
         future.addListener(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  if (future.isCancelled()) {
-                    // Clear futures prior to cancelling children. This sets our own state but lets
-                    // the input futures keep running, as some of them may be used elsewhere.
-                    futures = null;
-                    cancel(false);
-                  } else {
-                    collectValueFromNonCancelledFuture(index, future);
-                  }
-                } finally {
-                  /*
-                   * "null" means: There is no need to access `futures` again during
-                   * `processCompleted` because we're reading each value during a call to
-                   * handleOneInputDone.
-                   */
-                  decrementCountAndMaybeComplete(null);
+            () -> {
+              try {
+                if (future.isCancelled()) {
+                  // Clear futures prior to cancelling children. This sets our own state but lets
+                  // the input futures keep running, as some of them may be used elsewhere.
+                  futures = null;
+                  cancel(false);
+                } else {
+                  collectValueFromNonCancelledFuture(index, future);
                 }
+              } finally {
+                /*
+                 * "null" means: There is no need to access `futures` again during
+                 * `processCompleted` because we're reading each value during a call to
+                 * handleOneInputDone.
+                 */
+                decrementCountAndMaybeComplete(null);
               }
             },
             directExecutor());
@@ -179,15 +176,9 @@
        * could actually hurt in some cases, as it forces us to keep all inputs in memory until the
        * final input completes.
        */
-      final ImmutableCollection<? extends Future<? extends InputT>> localFutures =
+      ImmutableCollection<? extends Future<? extends InputT>> localFutures =
           collectsValues ? futures : null;
-      Runnable listener =
-          new Runnable() {
-            @Override
-            public void run() {
-              decrementCountAndMaybeComplete(localFutures);
-            }
-          };
+      Runnable listener = () -> decrementCountAndMaybeComplete(localFutures);
       for (ListenableFuture<? extends InputT> future : futures) {
         future.addListener(listener, directExecutor());
       }
@@ -247,8 +238,18 @@
     checkNotNull(seen);
     if (!isCancelled()) {
       /*
-       * requireNonNull is safe because this is a TrustedFuture, and we're calling this method only
-       * if it has failed.
+       * requireNonNull is safe because:
+       *
+       * - This is a TrustedFuture, so tryInternalFastPathGetFailure will in fact return the failure
+       *   cause if this Future has failed.
+       *
+       * - And this future *has* failed: This method is called only from handleException (through
+       *   getOrInitSeenExceptions). handleException tried to call setException and failed, so
+       *   either this Future was cancelled (which we ruled out with the isCancelled check above),
+       *   or it had already failed. (It couldn't have completed *successfully* or even had
+       *   setFuture called on it: Neither of those can happen until we've finished processing all
+       *   the completed inputs. And we're still processing at least one input, the one that
+       *   triggered handleException.)
        *
        * TODO(cpovirk): Think about whether we could/should use Verify to check the return value of
        * addCausalChain.
diff --git a/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java b/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java
index 7ee831e..99167db 100644
--- a/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java
+++ b/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java
@@ -14,7 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.Future;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -28,7 +27,6 @@
  *
  * @since 20.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public interface AsyncCallable<V extends @Nullable Object> {
diff --git a/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java b/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
index 161fca8..0da3715 100644
--- a/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
+++ b/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
@@ -164,6 +164,7 @@
    *
    * @param delta the value to add
    * @return the updated value
+   * @since 31.1
    */
   @CanIgnoreReturnValue
   public final double addAndGet(double delta) {
diff --git a/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java b/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
index 58407f5..fc8deed 100644
--- a/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
+++ b/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
@@ -69,7 +69,7 @@
    * @throws NullPointerException if array is null
    */
   public AtomicDoubleArray(double[] array) {
-    final int len = array.length;
+    int len = array.length;
     long[] longArray = new long[len];
     for (int i = 0; i < len; i++) {
       longArray[i] = doubleToRawLongBits(array[i]);
@@ -188,6 +188,7 @@
    * @param i the index
    * @param delta the value to add
    * @return the updated value
+   * @since 31.1
    */
   @CanIgnoreReturnValue
   public double addAndGet(int i, double delta) {
diff --git a/android/guava/src/com/google/common/util/concurrent/Callables.java b/android/guava/src/com/google/common/util/concurrent/Callables.java
index 47b5264..3b52c2e 100644
--- a/android/guava/src/com/google/common/util/concurrent/Callables.java
+++ b/android/guava/src/com/google/common/util/concurrent/Callables.java
@@ -35,15 +35,8 @@
   private Callables() {}
 
   /** Creates a {@code Callable} which immediately returns a preset value each time it is called. */
-  public static <T extends @Nullable Object> Callable<T> returning(
-      @ParametricNullness final T value) {
-    return new Callable<T>() {
-      @Override
-      @ParametricNullness
-      public T call() {
-        return value;
-      }
-    };
+  public static <T extends @Nullable Object> Callable<T> returning(@ParametricNullness T value) {
+    return () -> value;
   }
 
   /**
@@ -57,15 +50,10 @@
   @Beta
   @GwtIncompatible
   public static <T extends @Nullable Object> AsyncCallable<T> asAsyncCallable(
-      final Callable<T> callable, final ListeningExecutorService listeningExecutorService) {
+      Callable<T> callable, ListeningExecutorService listeningExecutorService) {
     checkNotNull(callable);
     checkNotNull(listeningExecutorService);
-    return new AsyncCallable<T>() {
-      @Override
-      public ListenableFuture<T> call() throws Exception {
-        return listeningExecutorService.submit(callable);
-      }
-    };
+    return () -> listeningExecutorService.submit(callable);
   }
 
   /**
@@ -78,22 +66,18 @@
    */
   @GwtIncompatible // threads
   static <T extends @Nullable Object> Callable<T> threadRenaming(
-      final Callable<T> callable, final Supplier<String> nameSupplier) {
+      Callable<T> callable, Supplier<String> nameSupplier) {
     checkNotNull(nameSupplier);
     checkNotNull(callable);
-    return new Callable<T>() {
-      @Override
-      @ParametricNullness
-      public T call() throws Exception {
-        Thread currentThread = Thread.currentThread();
-        String oldName = currentThread.getName();
-        boolean restoreName = trySetName(nameSupplier.get(), currentThread);
-        try {
-          return callable.call();
-        } finally {
-          if (restoreName) {
-            boolean unused = trySetName(oldName, currentThread);
-          }
+    return () -> {
+      Thread currentThread = Thread.currentThread();
+      String oldName = currentThread.getName();
+      boolean restoreName = trySetName(nameSupplier.get(), currentThread);
+      try {
+        return callable.call();
+      } finally {
+        if (restoreName) {
+          boolean unused = trySetName(oldName, currentThread);
         }
       }
     };
@@ -108,21 +92,18 @@
    *     for each invocation of the wrapped callable.
    */
   @GwtIncompatible // threads
-  static Runnable threadRenaming(final Runnable task, final Supplier<String> nameSupplier) {
+  static Runnable threadRenaming(Runnable task, Supplier<String> nameSupplier) {
     checkNotNull(nameSupplier);
     checkNotNull(task);
-    return new Runnable() {
-      @Override
-      public void run() {
-        Thread currentThread = Thread.currentThread();
-        String oldName = currentThread.getName();
-        boolean restoreName = trySetName(nameSupplier.get(), currentThread);
-        try {
-          task.run();
-        } finally {
-          if (restoreName) {
-            boolean unused = trySetName(oldName, currentThread);
-          }
+    return () -> {
+      Thread currentThread = Thread.currentThread();
+      String oldName = currentThread.getName();
+      boolean restoreName = trySetName(nameSupplier.get(), currentThread);
+      try {
+        task.run();
+      } finally {
+        if (restoreName) {
+          boolean unused = trySetName(oldName, currentThread);
         }
       }
     };
@@ -130,7 +111,7 @@
 
   /** Tries to set name of the given {@link Thread}, returns true if successful. */
   @GwtIncompatible // threads
-  private static boolean trySetName(final String threadName, Thread currentThread) {
+  private static boolean trySetName(String threadName, Thread currentThread) {
     /*
      * setName should usually succeed, but the security manager can prohibit it. Is there a way to
      * see if we have the modifyThread permission without catching an exception?
diff --git a/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java b/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
index c5ce0c4..b8aec03 100644
--- a/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
@@ -36,7 +36,6 @@
 import static java.util.logging.Level.SEVERE;
 import static java.util.logging.Level.WARNING;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.collect.FluentIterable;
@@ -191,7 +190,6 @@
  * @since 30.0
  */
 // TODO(dpb): Consider reusing one CloseableList for the entire pipeline, modulo combinations.
-@Beta // @Beta for one release.
 @DoNotMock("Use ClosingFuture.from(Futures.immediate*Future)")
 @ElementTypesAreNonnullByDefault
 // TODO(dpb): GWT compatibility.
diff --git a/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java b/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
index b6b161d..decb5f1 100644
--- a/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
+++ b/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
@@ -283,7 +283,7 @@
     checkNotNull(policy);
     @SuppressWarnings("unchecked")
     Map<E, LockGraphNode> lockGraphNodes = (Map<E, LockGraphNode>) getOrCreateNodes(enumClass);
-    return new WithExplicitOrdering<E>(policy, lockGraphNodes);
+    return new WithExplicitOrdering<>(policy, lockGraphNodes);
   }
 
   @SuppressWarnings("unchecked")
@@ -308,7 +308,7 @@
   static <E extends Enum<E>> Map<E, LockGraphNode> createNodes(Class<E> clazz) {
     EnumMap<E, LockGraphNode> map = Maps.newEnumMap(clazz);
     E[] keys = clazz.getEnumConstants();
-    final int numKeys = keys.length;
+    int numKeys = keys.length;
     ArrayList<LockGraphNode> nodes = Lists.newArrayListWithCapacity(numKeys);
     // Create a LockGraphNode for each enum value.
     for (E key : keys) {
diff --git a/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java b/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
index 148f50b..80c7779 100644
--- a/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
+++ b/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
@@ -25,7 +25,6 @@
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicReference;
@@ -39,7 +38,14 @@
  * until the {@code Future} it returned is {@linkplain Future#isDone done} (successful, failed, or
  * cancelled).
  *
- * <p>This class has limited support for cancellation and other "early completion":
+ * <p>This class serializes execution of <i>submitted</i> tasks but not any <i>listeners</i> of
+ * those tasks.
+ *
+ * <p>Submitted tasks have a happens-before order as defined in the Java Language Specification.
+ * Tasks execute with the same happens-before order that the function calls to {@link #submit} and
+ * {@link #submitAsync} that submitted those tasks had.
+ *
+ * <p>This class has limited support for cancellation and other "early completions":
  *
  * <ul>
  *   <li>While calls to {@code submit} and {@code submitAsync} return a {@code Future} that can be
@@ -60,9 +66,6 @@
  *       safe for the next task to start.</i>
  * </ul>
  *
- * <p>An additional limitation: this class serializes execution of <i>tasks</i> but not any
- * <i>listeners</i> of those tasks.
- *
  * <p>This class is similar to {@link MoreExecutors#newSequentialExecutor}. This class is different
  * in a few ways:
  *
@@ -80,7 +83,6 @@
  *
  * @since 26.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class ExecutionSequencer {
 
@@ -141,7 +143,7 @@
    * {@link Callable#call()} will not be invoked.
    */
   public <T extends @Nullable Object> ListenableFuture<T> submit(
-      final Callable<T> callable, Executor executor) {
+      Callable<T> callable, Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
     return submitAsync(
@@ -167,11 +169,11 @@
    * {@link AsyncCallable#call()} is invoked, {@link AsyncCallable#call()} will not be invoked.
    */
   public <T extends @Nullable Object> ListenableFuture<T> submitAsync(
-      final AsyncCallable<T> callable, final Executor executor) {
+      AsyncCallable<T> callable, Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
-    final TaskNonReentrantExecutor taskExecutor = new TaskNonReentrantExecutor(executor, this);
-    final AsyncCallable<T> task =
+    TaskNonReentrantExecutor taskExecutor = new TaskNonReentrantExecutor(executor, this);
+    AsyncCallable<T> task =
         new AsyncCallable<T>() {
           @Override
           public ListenableFuture<T> call() throws Exception {
@@ -197,58 +199,55 @@
      * have completed - namely after oldFuture is done, and taskFuture has either completed or been
      * cancelled before the callable started execution.
      */
-    final SettableFuture<@Nullable Void> newFuture = SettableFuture.create();
+    SettableFuture<@Nullable Void> newFuture = SettableFuture.create();
 
-    final ListenableFuture<@Nullable Void> oldFuture = ref.getAndSet(newFuture);
+    ListenableFuture<@Nullable Void> oldFuture = ref.getAndSet(newFuture);
 
     // Invoke our task once the previous future completes.
-    final TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
+    TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
     oldFuture.addListener(taskFuture, taskExecutor);
 
-    final ListenableFuture<T> outputFuture = Futures.nonCancellationPropagating(taskFuture);
+    ListenableFuture<T> outputFuture = Futures.nonCancellationPropagating(taskFuture);
 
     // newFuture's lifetime is determined by taskFuture, which can't complete before oldFuture
     // unless taskFuture is cancelled, in which case it falls back to oldFuture. This ensures that
     // if the future we return is cancelled, we don't begin execution of the next task until after
     // oldFuture completes.
     Runnable listener =
-        new Runnable() {
-          @Override
-          public void run() {
-            if (taskFuture.isDone()) {
-              // Since the value of oldFuture can only ever be immediateFuture(null) or setFuture of
-              // a future that eventually came from immediateFuture(null), this doesn't leak
-              // throwables or completion values.
-              newFuture.setFuture(oldFuture);
-            } else if (outputFuture.isCancelled() && taskExecutor.trySetCancelled()) {
-              // If this CAS succeeds, we know that the provided callable will never be invoked,
-              // so when oldFuture completes it is safe to allow the next submitted task to
-              // proceed. Doing this immediately here lets the next task run without waiting for
-              // the cancelled task's executor to run the noop AsyncCallable.
-              //
-              // ---
-              //
-              // If the CAS fails, the provided callable already started running (or it is about
-              // to). Our contract promises:
-              //
-              // 1. not to execute a new callable until the old one has returned
-              //
-              // If we were to cancel taskFuture, that would let the next task start while the old
-              // one is still running.
-              //
-              // Now, maybe we could tweak our implementation to not start the next task until the
-              // callable actually completes. (We could detect completion in our wrapper
-              // `AsyncCallable task`.) However, our contract also promises:
-              //
-              // 2. not to cancel any Future the user returned from an AsyncCallable
-              //
-              // We promise this because, once we cancel that Future, we would no longer be able to
-              // tell when any underlying work it is doing is done. Thus, we might start a new task
-              // while that underlying work is still running.
-              //
-              // So that is why we cancel only in the case of CAS success.
-              taskFuture.cancel(false);
-            }
+        () -> {
+          if (taskFuture.isDone()) {
+            // Since the value of oldFuture can only ever be immediateFuture(null) or setFuture of
+            // a future that eventually came from immediateFuture(null), this doesn't leak
+            // throwables or completion values.
+            newFuture.setFuture(oldFuture);
+          } else if (outputFuture.isCancelled() && taskExecutor.trySetCancelled()) {
+            // If this CAS succeeds, we know that the provided callable will never be invoked,
+            // so when oldFuture completes it is safe to allow the next submitted task to
+            // proceed. Doing this immediately here lets the next task run without waiting for
+            // the cancelled task's executor to run the noop AsyncCallable.
+            //
+            // ---
+            //
+            // If the CAS fails, the provided callable already started running (or it is about
+            // to). Our contract promises:
+            //
+            // 1. not to execute a new callable until the old one has returned
+            //
+            // If we were to cancel taskFuture, that would let the next task start while the old
+            // one is still running.
+            //
+            // Now, maybe we could tweak our implementation to not start the next task until the
+            // callable actually completes. (We could detect completion in our wrapper
+            // `AsyncCallable task`.) However, our contract also promises:
+            //
+            // 2. not to cancel any Future the user returned from an AsyncCallable
+            //
+            // We promise this because, once we cancel that Future, we would no longer be able to
+            // tell when any underlying work it is doing is done. Thus, we might start a new task
+            // while that underlying work is still running.
+            //
+            // So that is why we cancel only in the case of CAS success.
+            taskFuture.cancel(false);
           }
         };
     // Adding the listener to both futures guarantees that newFuture will aways be set. Adding to
@@ -422,7 +421,7 @@
         Executor queuedExecutor;
         // Intentionally using non-short-circuit operator
         while ((queuedTask = executingTaskQueue.nextTask) != null
-            & (queuedExecutor = executingTaskQueue.nextExecutor) != null) {
+            && (queuedExecutor = executingTaskQueue.nextExecutor) != null) {
           executingTaskQueue.nextTask = null;
           executingTaskQueue.nextExecutor = null;
           queuedExecutor.execute(queuedTask);
diff --git a/android/guava/src/com/google/common/util/concurrent/FluentFuture.java b/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
index 2b6ef9f..683944c 100644
--- a/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
@@ -70,7 +70,6 @@
  *
  * @since 23.0
  */
-@Beta
 @DoNotMock("Use FluentFuture.from(Futures.immediate*Future) or SettableFuture")
 @GwtCompatible(emulated = true)
 @ElementTypesAreNonnullByDefault
@@ -184,6 +183,7 @@
    * @param executor the executor that runs {@code fallback} if the input fails
    */
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
+  @Beta
   public final <X extends Throwable> FluentFuture<V> catching(
       Class<X> exceptionType, Function<? super X, ? extends V> fallback, Executor executor) {
     return (FluentFuture<V>) Futures.catching(this, exceptionType, fallback, executor);
@@ -248,6 +248,7 @@
    * @param executor the executor that runs {@code fallback} if the input fails
    */
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
+  @Beta
   public final <X extends Throwable> FluentFuture<V> catchingAsync(
       Class<X> exceptionType, AsyncFunction<? super X, ? extends V> fallback, Executor executor) {
     return (FluentFuture<V>) Futures.catchingAsync(this, exceptionType, fallback, executor);
@@ -265,6 +266,7 @@
    */
   @GwtIncompatible // ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
+  @Beta
   public final FluentFuture<V> withTimeout(
       long timeout, TimeUnit unit, ScheduledExecutorService scheduledExecutor) {
     return (FluentFuture<V>) Futures.withTimeout(this, timeout, unit, scheduledExecutor);
@@ -309,6 +311,7 @@
    * @return A future that holds result of the function (if the input succeeded) or the original
    *     input's failure (if not)
    */
+  @Beta
   public final <T extends @Nullable Object> FluentFuture<T> transformAsync(
       AsyncFunction<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transformAsync(this, function, executor);
@@ -346,6 +349,7 @@
    * @param executor Executor to run the function in.
    * @return A future that holds result of the transformation.
    */
+  @Beta
   public final <T extends @Nullable Object> FluentFuture<T> transform(
       Function<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transform(this, function, executor);
diff --git a/android/guava/src/com/google/common/util/concurrent/Futures.java b/android/guava/src/com/google/common/util/concurrent/Futures.java
index e6bf7a7..6bd68b4 100644
--- a/android/guava/src/com/google/common/util/concurrent/Futures.java
+++ b/android/guava/src/com/google/common/util/concurrent/Futures.java
@@ -170,7 +170,11 @@
    * @since 14.0
    */
   public static <V extends @Nullable Object> ListenableFuture<V> immediateCancelledFuture() {
-    return new ImmediateCancelledFuture<V>();
+    ListenableFuture<Object> instance = ImmediateCancelledFuture.INSTANCE;
+    if (instance != null) {
+      return (ListenableFuture<V>) instance;
+    }
+    return new ImmediateCancelledFuture<>();
   }
 
   /**
@@ -179,7 +183,6 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 28.2
    */
-  @Beta
   public static <O extends @Nullable Object> ListenableFuture<O> submit(
       Callable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
@@ -194,7 +197,6 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 28.2
    */
-  @Beta
   public static ListenableFuture<@Nullable Void> submit(Runnable runnable, Executor executor) {
     TrustedListenableFutureTask<@Nullable Void> task =
         TrustedListenableFutureTask.create(runnable, null);
@@ -208,7 +210,6 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 23.0
    */
-  @Beta
   public static <O extends @Nullable Object> ListenableFuture<O> submitAsync(
       AsyncCallable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
@@ -222,9 +223,9 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 23.0
    */
-  @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
+  // TODO(cpovirk): Return ListenableScheduledFuture?
   public static <O extends @Nullable Object> ListenableFuture<O> scheduleAsync(
       AsyncCallable<O> callable,
       long delay,
@@ -743,7 +744,6 @@
    *
    * @since 15.0
    */
-  @Beta
   public static <V extends @Nullable Object> ListenableFuture<V> nonCancellationPropagating(
       ListenableFuture<V> future) {
     if (future.isDone()) {
@@ -807,22 +807,22 @@
    * @return a future that provides a list of the results of the component futures
    * @since 10.0
    */
-  /*
-   * Another way to express this signature would be to bound <V> by @NonNull and accept LF<? extends
-   * @Nullable V>. That might be better: There's currently no difference between the outputs users
-   * get when calling this with <Foo> and calling it with <@Nullable Foo>. The only difference is
-   * that calling it with <Foo> won't work when an input Future has a @Nullable type. So why even
-   * make that error possible by giving callers the choice?
-   *
-   * On the other hand, the current signature is consistent with the similar allAsList method. And
-   * eventually this method may go away entirely in favor of an API like
-   * whenAllComplete().collectSuccesses(). That API would have a signature more like the current
-   * one.
-   */
   @Beta
   @SafeVarargs
   public static <V extends @Nullable Object> ListenableFuture<List<@Nullable V>> successfulAsList(
       ListenableFuture<? extends V>... futures) {
+    /*
+     * Another way to express this signature would be to bound <V> by @NonNull and accept
+     * LF<? extends @Nullable V>. That might be better: There's currently no difference between the
+     * outputs users get when calling this with <Foo> and calling it with <@Nullable Foo>. The only
+     * difference is that calling it with <Foo> won't work when an input Future has a @Nullable
+     * type. So why even make that error possible by giving callers the choice?
+     *
+     * On the other hand, the current signature is consistent with the similar allAsList method. And
+     * eventually this method may go away entirely in favor of an API like
+     * whenAllComplete().collectSuccesses(). That API would have a signature more like the current
+     * one.
+     */
     return new ListFuture<V>(ImmutableList.copyOf(futures), false);
   }
 
@@ -871,7 +871,6 @@
    *
    * @since 17.0
    */
-  @Beta
   public static <T extends @Nullable Object> ImmutableList<ListenableFuture<T>> inCompletionOrder(
       Iterable<? extends ListenableFuture<? extends T>> futures) {
     ListenableFuture<? extends T>[] copy = gwtCompatibleToArray(futures);
diff --git a/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java b/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
index 81912f5..8b1c17a 100644
--- a/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
@@ -98,6 +98,9 @@
   }
 
   static final class ImmediateCancelledFuture<V extends @Nullable Object> extends TrustedFuture<V> {
+    static final @Nullable ImmediateCancelledFuture<Object> INSTANCE =
+        AbstractFuture.GENERATE_CANCELLATION_CAUSES ? null : new ImmediateCancelledFuture<>();
+
     ImmediateCancelledFuture() {
       cancel(false);
     }
diff --git a/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java b/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
index 168adf2..bcec007 100644
--- a/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
+++ b/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
@@ -240,7 +240,7 @@
   @Override
   public final String toString() {
     Runnable state = get();
-    final String result;
+    String result;
     if (state == DONE) {
       result = "running=[DONE]";
     } else if (state instanceof Blocker) {
diff --git a/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java b/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
index 82f8d95..0b0db45 100644
--- a/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
+++ b/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
@@ -56,7 +56,7 @@
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
     }
-    return new ListenableFutureAdapter<V>(future);
+    return new ListenableFutureAdapter<>(future);
   }
 
   /**
@@ -85,7 +85,7 @@
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
     }
-    return new ListenableFutureAdapter<V>(future, executor);
+    return new ListenableFutureAdapter<>(future, executor);
   }
 
   /**
@@ -150,22 +150,19 @@
 
         // TODO(lukes): handle RejectedExecutionException
         adapterExecutor.execute(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  /*
-                   * Threads from our private pool are never interrupted. Threads from a
-                   * user-supplied executor might be, but... what can we do? This is another reason
-                   * to return a proper ListenableFuture instead of using listenInPoolThread.
-                   */
-                  getUninterruptibly(delegate);
-                } catch (Throwable e) {
-                  // ExecutionException / CancellationException / RuntimeException / Error
-                  // The task is presumably done, run the listeners.
-                }
-                executionList.execute();
+            () -> {
+              try {
+                /*
+                 * Threads from our private pool are never interrupted. Threads from a
+                 * user-supplied executor might be, but... what can we do? This is another reason
+                 * to return a proper ListenableFuture instead of using listenInPoolThread.
+                 */
+                getUninterruptibly(delegate);
+              } catch (Throwable e) {
+                // ExecutionException / CancellationException / RuntimeException / Error
+                // The task is presumably done, run the listeners.
               }
+              executionList.execute();
             });
       }
     }
diff --git a/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java b/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
index cf0199a..a8d9dd4 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -116,15 +116,7 @@
  * put in a special hack for us: https://issuetracker.google.com/issues/131431257)
  */
 @DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
-/*
- * It would make sense to also annotate this class with @ElementTypesAreNonnullByDefault. However,
- * it makes no difference because this class is already covered by the package-level
- * @ParametersAreNonnullByDefault, and this class declares only parameters, not return types or
- * fields. (Not to mention that we'll be removing all @*AreNonnullByDefault annotations after tools
- * understand .) And it's fortunate that the annotation makes no difference, because
- * we're seeing a breakage internally when we add that annotation :)
- *
- */
+@ElementTypesAreNonnullByDefault
 public interface ListenableFuture<V extends @Nullable Object> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
diff --git a/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java b/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
index 9fdcc53..678a6c6 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
@@ -59,7 +59,7 @@
    * @since 10.0
    */
   public static <V extends @Nullable Object> ListenableFutureTask<V> create(Callable<V> callable) {
-    return new ListenableFutureTask<V>(callable);
+    return new ListenableFutureTask<>(callable);
   }
 
   /**
@@ -74,7 +74,7 @@
    */
   public static <V extends @Nullable Object> ListenableFutureTask<V> create(
       Runnable runnable, @ParametricNullness V result) {
-    return new ListenableFutureTask<V>(runnable, result);
+    return new ListenableFutureTask<>(runnable, result);
   }
 
   ListenableFutureTask(Callable<V> callable) {
diff --git a/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java b/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
index e5aa5e3..f6e5d9f 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
@@ -14,7 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.ScheduledFuture;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -25,7 +24,6 @@
  * @author Anthony Zana
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public interface ListenableScheduledFuture<V extends @Nullable Object>
diff --git a/android/guava/src/com/google/common/util/concurrent/Monitor.java b/android/guava/src/com/google/common/util/concurrent/Monitor.java
index d88a8bc..d8da62d 100644
--- a/android/guava/src/com/google/common/util/concurrent/Monitor.java
+++ b/android/guava/src/com/google/common/util/concurrent/Monitor.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.primitives.Longs;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
@@ -197,7 +196,6 @@
  * @author Martin Buchholz
  * @since 10.0
  */
-@Beta
 @GwtIncompatible
 @SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
 @ElementTypesAreNonnullByDefault
@@ -301,7 +299,6 @@
    *
    * @since 10.0
    */
-  @Beta
   public abstract static class Guard {
 
     @Weak final Monitor monitor;
@@ -735,7 +732,7 @@
    * @throws InterruptedException if interrupted while waiting
    */
   public void waitFor(Guard guard) throws InterruptedException {
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (!guard.isSatisfied()) {
@@ -753,7 +750,7 @@
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean waitFor(Guard guard, long time, TimeUnit unit) throws InterruptedException {
     final long timeoutNanos = toSafeNanos(time, unit);
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (guard.isSatisfied()) {
@@ -770,7 +767,7 @@
    * currently occupying this monitor.
    */
   public void waitForUninterruptibly(Guard guard) {
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (!guard.isSatisfied()) {
@@ -787,7 +784,7 @@
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean waitForUninterruptibly(Guard guard, long time, TimeUnit unit) {
     final long timeoutNanos = toSafeNanos(time, unit);
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (guard.isSatisfied()) {
diff --git a/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java b/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
index eaf6501..791a417 100644
--- a/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
+++ b/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
@@ -379,14 +379,22 @@
    * difficult to reproduce because they depend on timing. For example:
    *
    * <ul>
-   *   <li>A call like {@code future.transform(function, directExecutor())} may execute the function
-   *       immediately in the thread that is calling {@code transform}. (This specific case happens
-   *       if the future is already completed.) If {@code transform} call was made from a UI thread
-   *       or other latency-sensitive thread, a heavyweight function can harm responsiveness.
-   *   <li>If the task will be executed later, consider which thread will trigger the execution --
-   *       since that thread will execute the task inline. If the thread is a shared system thread
-   *       like an RPC network thread, a heavyweight task can stall progress of the whole system or
-   *       even deadlock it.
+   *   <li>When a {@code ListenableFuture} listener is registered to run under {@code
+   *       directExecutor}, the listener can execute in any of three possible threads:
+   *       <ol>
+   *         <li>When a thread attaches a listener to a {@code ListenableFuture} that's already
+   *             complete, the listener runs immediately in that thread.
+   *         <li>When a thread attaches a listener to a {@code ListenableFuture} that's
+   *             <em>in</em>complete and the {@code ListenableFuture} later completes normally, the
+   *             listener runs in the the thread that completes the {@code ListenableFuture}.
+   *         <li>When a listener is attached to a {@code ListenableFuture} and the {@code
+   *             ListenableFuture} gets cancelled, the listener runs immediately in the the thread
+   *             that cancelled the {@code Future}.
+   *       </ol>
+   *       Given all these possibilities, it is frequently possible for listeners to execute in UI
+   *       threads, RPC network threads, or other latency-sensitive threads. In those cases, slow
+   *       listeners can harm responsiveness, slow the system as a whole, or worse. (See also the
+   *       note about locking below.)
    *   <li>If many tasks will be triggered by the same event, one heavyweight task may delay other
    *       tasks -- even tasks that are not themselves {@code directExecutor} tasks.
    *   <li>If many such tasks are chained together (such as with {@code
@@ -402,9 +410,11 @@
    *       terminate whichever thread happens to trigger the execution.
    * </ul>
    *
-   * Additionally, beware of executing tasks with {@code directExecutor} while holding a lock. Since
-   * the task you submit to the executor (or any other arbitrary work the executor does) may do slow
-   * work or acquire other locks, you risk deadlocks.
+   * A specific warning about locking: Code that executes user-supplied tasks, such as {@code
+   * ListenableFuture} listeners, should take care not to do so while holding a lock. Additionally,
+   * as a further line of defense, prefer not to perform any locking inside a task that will be run
+   * under {@code directExecutor}: Not only might the wait for a lock be long, but if the running
+   * thread was holding a lock, the listener may deadlock or break lock isolation.
    *
    * <p>This instance is equivalent to:
    *
@@ -427,8 +437,11 @@
 
   /**
    * Returns an {@link Executor} that runs each task executed sequentially, such that no two tasks
-   * are running concurrently. Submitted tasks have a happens-before order as defined in the Java
-   * Language Specification.
+   * are running concurrently.
+   *
+   * <p>{@linkplain Executor#execute executed} tasks have a happens-before order as defined in the
+   * Java Language Specification. Tasks execute with the same happens-before order that the function
+   * calls to {@link Executor#execute `execute()`} that submitted those tasks had.
    *
    * <p>The executor uses {@code delegate} in order to {@link Executor#execute execute} each task in
    * turn, and does not create any threads of its own.
@@ -466,7 +479,6 @@
    *
    * @since 23.3 (since 23.1 as {@code sequentialExecutor})
    */
-  @Beta
   @GwtIncompatible
   public static Executor newSequentialExecutor(Executor delegate) {
     return new SequentialExecutor(delegate);
diff --git a/android/guava/src/com/google/common/util/concurrent/NullnessCasts.java b/android/guava/src/com/google/common/util/concurrent/NullnessCasts.java
index 0a0d719..a3a914e 100644
--- a/android/guava/src/com/google/common/util/concurrent/NullnessCasts.java
+++ b/android/guava/src/com/google/common/util/concurrent/NullnessCasts.java
@@ -65,7 +65,8 @@
    * return to a caller, the code needs to a way to return {@code null} from a method that returns
    * "plain {@code T}." This API provides that.
    */
-  @SuppressWarnings("nullness")
+  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals", "ReturnMissingNullable"})
+  // The warnings are legitimate. Each time we use this method, we document why.
   @ParametricNullness
   static <T extends @Nullable Object> T uncheckedNull() {
     return null;
diff --git a/android/guava/src/com/google/common/util/concurrent/ParametricNullness.java b/android/guava/src/com/google/common/util/concurrent/ParametricNullness.java
index ebc5928..a745bf7 100644
--- a/android/guava/src/com/google/common/util/concurrent/ParametricNullness.java
+++ b/android/guava/src/com/google/common/util/concurrent/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java b/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
index 052c7e0..d0b600b 100644
--- a/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
+++ b/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
@@ -96,10 +96,10 @@
    * execution of tasks will stop until a call to this method is made.
    */
   @Override
-  public void execute(final Runnable task) {
+  public void execute(Runnable task) {
     checkNotNull(task);
-    final Runnable submittedTask;
-    final long oldRunCount;
+    Runnable submittedTask;
+    long oldRunCount;
     synchronized (queue) {
       // If the worker is already running (or execute() on the delegate returned successfully, and
       // the worker has yet to start) then we don't need to start the worker.
diff --git a/android/guava/src/com/google/common/util/concurrent/ServiceManager.java b/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
index 2e1c21a..5177b5a 100644
--- a/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
+++ b/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
@@ -262,8 +262,7 @@
   @CanIgnoreReturnValue
   public ServiceManager startAsync() {
     for (Service service : services) {
-      State state = service.state();
-      checkState(state == NEW, "Service %s is %s, cannot start it.", service, state);
+      checkState(service.state() == NEW, "Not all services are NEW, cannot start %s", this);
     }
     for (Service service : services) {
       try {
diff --git a/android/guava/src/com/google/common/util/concurrent/SettableFuture.java b/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
index 893161e..0a9e194 100644
--- a/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
@@ -40,7 +40,7 @@
    * Creates a new {@code SettableFuture} that can be completed or cancelled by a later method call.
    */
   public static <V extends @Nullable Object> SettableFuture<V> create() {
-    return new SettableFuture<V>();
+    return new SettableFuture<>();
   }
 
   @CanIgnoreReturnValue
diff --git a/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java b/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
index 5a1969e..c6ade6a 100644
--- a/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
@@ -73,35 +73,27 @@
 
   @Override
   public <T> T newProxy(
-      final T target,
-      Class<T> interfaceType,
-      final long timeoutDuration,
-      final TimeUnit timeoutUnit) {
+      T target, Class<T> interfaceType, long timeoutDuration, TimeUnit timeoutUnit) {
     checkNotNull(target);
     checkNotNull(interfaceType);
     checkNotNull(timeoutUnit);
     checkPositiveTimeout(timeoutDuration);
     checkArgument(interfaceType.isInterface(), "interfaceType must be an interface type");
 
-    final Set<Method> interruptibleMethods = findInterruptibleMethods(interfaceType);
+    Set<Method> interruptibleMethods = findInterruptibleMethods(interfaceType);
 
     InvocationHandler handler =
         new InvocationHandler() {
           @Override
           @CheckForNull
-          public Object invoke(
-              Object obj, final Method method, @CheckForNull final @Nullable Object[] args)
+          public Object invoke(Object obj, Method method, @CheckForNull @Nullable Object[] args)
               throws Throwable {
             Callable<@Nullable Object> callable =
-                new Callable<@Nullable Object>() {
-                  @Override
-                  @CheckForNull
-                  public Object call() throws Exception {
-                    try {
-                      return method.invoke(target, args);
-                    } catch (InvocationTargetException e) {
-                      throw throwCause(e, false /* combineStackTraces */);
-                    }
+                () -> {
+                  try {
+                    return method.invoke(target, args);
+                  } catch (InvocationTargetException e) {
+                    throw throwCause(e, false /* combineStackTraces */);
                   }
                 };
             return callWithTimeout(
diff --git a/android/guava/src/com/google/common/util/concurrent/Striped.java b/android/guava/src/com/google/common/util/concurrent/Striped.java
index fc8bcd8..2ea61cb 100644
--- a/android/guava/src/com/google/common/util/concurrent/Striped.java
+++ b/android/guava/src/com/google/common/util/concurrent/Striped.java
@@ -206,14 +206,7 @@
    * @return a new {@code Striped<Lock>}
    */
   public static Striped<Lock> lock(int stripes) {
-    return custom(
-        stripes,
-        new Supplier<Lock>() {
-          @Override
-          public Lock get() {
-            return new PaddedLock();
-          }
-        });
+    return custom(stripes, PaddedLock::new);
   }
 
   /**
@@ -224,14 +217,7 @@
    * @return a new {@code Striped<Lock>}
    */
   public static Striped<Lock> lazyWeakLock(int stripes) {
-    return lazy(
-        stripes,
-        new Supplier<Lock>() {
-          @Override
-          public Lock get() {
-            return new ReentrantLock(false);
-          }
-        });
+    return lazy(stripes, () -> new ReentrantLock(false));
   }
 
   private static <L> Striped<L> lazy(int stripes, Supplier<L> supplier) {
@@ -248,15 +234,8 @@
    * @param permits the number of permits in each semaphore
    * @return a new {@code Striped<Semaphore>}
    */
-  public static Striped<Semaphore> semaphore(int stripes, final int permits) {
-    return custom(
-        stripes,
-        new Supplier<Semaphore>() {
-          @Override
-          public Semaphore get() {
-            return new PaddedSemaphore(permits);
-          }
-        });
+  public static Striped<Semaphore> semaphore(int stripes, int permits) {
+    return custom(stripes, () -> new PaddedSemaphore(permits));
   }
 
   /**
@@ -267,15 +246,8 @@
    * @param permits the number of permits in each semaphore
    * @return a new {@code Striped<Semaphore>}
    */
-  public static Striped<Semaphore> lazyWeakSemaphore(int stripes, final int permits) {
-    return lazy(
-        stripes,
-        new Supplier<Semaphore>() {
-          @Override
-          public Semaphore get() {
-            return new Semaphore(permits, false);
-          }
-        });
+  public static Striped<Semaphore> lazyWeakSemaphore(int stripes, int permits) {
+    return lazy(stripes, () -> new Semaphore(permits, false));
   }
 
   /**
@@ -286,7 +258,7 @@
    * @return a new {@code Striped<ReadWriteLock>}
    */
   public static Striped<ReadWriteLock> readWriteLock(int stripes) {
-    return custom(stripes, READ_WRITE_LOCK_SUPPLIER);
+    return custom(stripes, ReentrantReadWriteLock::new);
   }
 
   /**
@@ -297,25 +269,8 @@
    * @return a new {@code Striped<ReadWriteLock>}
    */
   public static Striped<ReadWriteLock> lazyWeakReadWriteLock(int stripes) {
-    return lazy(stripes, WEAK_SAFE_READ_WRITE_LOCK_SUPPLIER);
+    return lazy(stripes, WeakSafeReadWriteLock::new);
   }
-
-  private static final Supplier<ReadWriteLock> READ_WRITE_LOCK_SUPPLIER =
-      new Supplier<ReadWriteLock>() {
-        @Override
-        public ReadWriteLock get() {
-          return new ReentrantReadWriteLock();
-        }
-      };
-
-  private static final Supplier<ReadWriteLock> WEAK_SAFE_READ_WRITE_LOCK_SUPPLIER =
-      new Supplier<ReadWriteLock>() {
-        @Override
-        public ReadWriteLock get() {
-          return new WeakSafeReadWriteLock();
-        }
-      };
-
   /**
    * ReadWriteLock implementation whose read and write locks retain a reference back to this lock.
    * Otherwise, a reference to just the read lock or just the write lock would not suffice to ensure
@@ -441,7 +396,7 @@
     final AtomicReferenceArray<@Nullable ArrayReference<? extends L>> locks;
     final Supplier<L> supplier;
     final int size;
-    final ReferenceQueue<L> queue = new ReferenceQueue<L>();
+    final ReferenceQueue<L> queue = new ReferenceQueue<>();
 
     SmallLazyStriped(int stripes, Supplier<L> supplier) {
       super(stripes);
@@ -461,7 +416,7 @@
         return existing;
       }
       L created = supplier.get();
-      ArrayReference<L> newRef = new ArrayReference<L>(created, index, queue);
+      ArrayReference<L> newRef = new ArrayReference<>(created, index, queue);
       while (!locks.compareAndSet(index, existingRef, newRef)) {
         // we raced, we need to re-read and try again
         existingRef = locks.get(index);
diff --git a/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java b/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
index 1027f3c..091f56e 100644
--- a/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
+++ b/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
@@ -151,15 +151,15 @@
   // Split out so that the anonymous ThreadFactory can't contain a reference back to the builder.
   // At least, I assume that's why. TODO(cpovirk): Check, and maybe add a test for this.
   private static ThreadFactory doBuild(ThreadFactoryBuilder builder) {
-    final String nameFormat = builder.nameFormat;
-    final Boolean daemon = builder.daemon;
-    final Integer priority = builder.priority;
-    final UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler;
-    final ThreadFactory backingThreadFactory =
+    String nameFormat = builder.nameFormat;
+    Boolean daemon = builder.daemon;
+    Integer priority = builder.priority;
+    UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler;
+    ThreadFactory backingThreadFactory =
         (builder.backingThreadFactory != null)
             ? builder.backingThreadFactory
             : Executors.defaultThreadFactory();
-    final AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
+    AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
     return new ThreadFactory() {
       @Override
       public Thread newThread(Runnable runnable) {
diff --git a/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java b/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
index 219a098..ed8a7bf 100644
--- a/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
@@ -161,7 +161,7 @@
     if (localInputFuture != null) {
       String message = "inputFuture=[" + localInputFuture + "]";
       if (localTimer != null) {
-        final long delay = localTimer.getDelay(TimeUnit.MILLISECONDS);
+        long delay = localTimer.getDelay(TimeUnit.MILLISECONDS);
         // Negative delays look confusing in an error message
         if (delay > 0) {
           message += ", remaining delay=[" + delay + " ms]";
diff --git a/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java b/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
index a2c2115..929c9fb 100644
--- a/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
+++ b/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
@@ -37,11 +37,11 @@
 
   static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
       AsyncCallable<V> callable) {
-    return new TrustedListenableFutureTask<V>(callable);
+    return new TrustedListenableFutureTask<>(callable);
   }
 
   static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(Callable<V> callable) {
-    return new TrustedListenableFutureTask<V>(callable);
+    return new TrustedListenableFutureTask<>(callable);
   }
 
   /**
@@ -55,7 +55,7 @@
    */
   static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
       Runnable runnable, @ParametricNullness V result) {
-    return new TrustedListenableFutureTask<V>(Executors.callable(runnable, result));
+    return new TrustedListenableFutureTask<>(Executors.callable(runnable, result));
   }
 
   /*
diff --git a/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java b/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
index a33ba82..c2c6f7c 100644
--- a/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
+++ b/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Verify.verify;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
@@ -410,7 +409,6 @@
    *
    * @since 30.0
    */
-  @Beta
   @GwtIncompatible // concurrency
   public static void awaitTerminationUninterruptibly(ExecutorService executor) {
     // TODO(cpovirk): We could optimize this to avoid calling nanoTime() at all.
@@ -423,7 +421,6 @@
    *
    * @since 30.0
    */
-  @Beta
   @GwtIncompatible // concurrency
   @SuppressWarnings("GoodTime")
   public static boolean awaitTerminationUninterruptibly(
diff --git a/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java b/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
index 03c08cc..5a3c392 100644
--- a/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
@@ -62,16 +62,13 @@
    * delegates to {@link #wrapTask(Callable)}.
    */
   protected Runnable wrapTask(Runnable command) {
-    final Callable<Object> wrapped = wrapTask(Executors.callable(command, null));
-    return new Runnable() {
-      @Override
-      public void run() {
-        try {
-          wrapped.call();
-        } catch (Exception e) {
-          throwIfUnchecked(e);
-          throw new RuntimeException(e);
-        }
+    Callable<Object> wrapped = wrapTask(Executors.callable(command, null));
+    return () -> {
+      try {
+        wrapped.call();
+      } catch (Exception e) {
+        throwIfUnchecked(e);
+        throw new RuntimeException(e);
       }
     };
   }
diff --git a/android/guava/src/com/google/common/xml/ParametricNullness.java b/android/guava/src/com/google/common/xml/ParametricNullness.java
index a476558..e4e5d12 100644
--- a/android/guava/src/com/google/common/xml/ParametricNullness.java
+++ b/android/guava/src/com/google/common/xml/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/xml/XmlEscapers.java b/android/guava/src/com/google/common/xml/XmlEscapers.java
index a1c637c..33241f3 100644
--- a/android/guava/src/com/google/common/xml/XmlEscapers.java
+++ b/android/guava/src/com/google/common/xml/XmlEscapers.java
@@ -14,7 +14,6 @@
 
 package com.google.common.xml;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.Escaper;
 import com.google.common.escape.Escapers;
@@ -38,7 +37,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public class XmlEscapers {
diff --git a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
index 9e5f173..c987065 100644
--- a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
+++ b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
@@ -42,7 +42,7 @@
   /** If a hostname is contained as a key in this map, it is a public suffix. */
   public static final ImmutableMap<String, PublicSuffixType> EXACT =
       TrieParser.parseTrie(
-          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?3np8lv81qo3--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?sr,t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,p&i-on,ohsdaerpsym,?sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?moc?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?moc?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,xc,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?rrd,ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??sum?tic??l!.&gro?moc?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog??c??t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?moc?ten?ude?v&g:.d,,og???q??wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,golbw,hcs?lim?o&c!.topsgolb,?g??palf,r&egolb,o??sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&a&bura-vnej.&1ti,abura.rue.1ti,?tcepsrep,xo:.&ku,nt,?,?bewilek:.sc,,citsalej.piv,drayknil,elej,gnitsohdnert.&ed,hc,?letemirp:.ku,,m&edaid,ialcer.&ac,ku,su,??n&evueluk,woru,?r&epolroov,o&pav,tnemele,??tenraxa.1-se,ululetoj,xelpciffart,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,nevueluk.yxorpze,pohsdaerpsym,snoitulostsohretni.duolc,topsgolb,?ortal?ut!uoy???c&0krbd4--nx?a&lp!.oc,?ps!.&lla4sx,rebu,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,b&ow-nrefeilgitsng--nx,rb-ni,vz-nelletsebgitsng--nx,?decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,e&lletsebgitsnüg,sgnutiel,?i&emtsi,lreb-n&i,yd,??oitatsksid-ygolonys,pv&-n&i,yd,?nyd,?refeilgitsnüg,?orp-ytinummoc,p&h21,iog:ol,,ohsdaerpsym,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??a&lg?rt!.oby,??i&sdoow?ug??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il??g!.&gro?lim?moc?t&en?vp??ude?vog??a&f?gtrom?p!.&3xlh,kselp,sndp,tengam,xlh,ycvrp,??rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&pohsdaerpsym,topsgolb,vog??tilop?v&bba?om???j!.&fo,gro?oc?ten???k!.&c&a?s??e&m?n??ibom?o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,pct,?66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?qbw,r&aegelif,idcm,ofsnd,?s&dym,ndd,ti!bt,?umhol,?t&en?s&acdnuos,ohon,??u&a-raegelif,de?tcn,?v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.&egats-oree,oree,ysrab,??w??o!.&derno:.gnigats,,ecivres,knilemoh,r&ednu,of,??hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?mo&c?n??t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.&e&rawpohs,saberots,?yflles,??taeht?u&ces?sni?t&inruf?necca??za???s!.&a!bap.us,?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!ohsdaerpsym,p??r!owebdluocti,?s!serp?yspoi,?t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&areduolc,e&lej,nilnigol,r&etnim,ocevon,?winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,thrs,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?og??ce&r?t??erots?gro?lim?m&oc?rif??o&c?fni??stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l!.xlh,?rd?ssergorp??ol??w&kct--nx?r??xul?y!.&gro?lim?moc?ten?ude?vog????f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?moc?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx!.&a14--nx,b8lea1j--nx,c&avc0aaa08--nx,ma09--nx,?f&a1a09--nx,ea1j--nx,?gva1c--nx,nha1h--nx,pda1j--nx,zila1h--nx,??ns??ea1j--nx?fo?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram!.&htiw,morf,??hgil?lusnoc?neg?ov?soh!.tfarcnepo,??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.&duolc,etalsnart,???r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?ibptth,o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?dylimaf,eirfotatophcuoc,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,igude,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&delacsne,gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?moc?o&c?g??ro?topsgolb,??v!.ta,a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,p&h21,ohsdaerpsym,?sndtog,topsgolb,wolf.e&a.1pla,nigneppa,?xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??pib,ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh!.arh,?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?moc?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?iki,mroftalpduolc.if,nenikkäh,pohsdaerpsym,retnecatad.&omed,saap,?topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,ppatig,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?moc?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme?ud??d!.&erots,ger,mrif,oc,pohsdaerpsym,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc??npqic--nx?saaces,t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?moc?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&morf,ot,?ten!.&htumiza,nolt,o&c,vra,??doof???s!.topsgolb,?t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??nnoc,o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?omida,p&i-on,ohsdaerpsym,?t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?psoh,shn?t&en?nmyp,?vog!.eci&ffoemoh,vres,??ysrab,???l&04sr4w--nx?a!.&gro?lim?moc?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?oc?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?moc?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.&egapvar,topsgolb,??ten?vog??a&f?m&e?g?toh???m?r?xil??l&a&b&esab?t&eksab!.&sua,zn,??oof???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,pohsdaerpsym,retsulc-gnitsoh,topsgolb,wsma,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.&ed,rotnemele,??hcs??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&erapohs,img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats?uolc&inu,sds,??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks??klwwortso?ohs!daerpsym,??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?moc?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,5sndd,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?g,ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw:.sj,,tsohecapsppa,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,iafaw.&d&ej,yr,?nol,?meaeboda,panqym:-&ahpla,ved,?,smetsystuo,tekcilc,ved&j,pw,??vreser,wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilno&-evreser,ysrab,?og-si,?r&alfduolcyrt,ehwynanohtyp:.ue,,ihcec,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,xiw,??omer-sndnyd,upmocsma,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-&raeghtua,swennwot,?ksndd,robsikrow,?o&fgp,lb&-sndnyd,pawodni,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am&-sndnyd,detsohpw,??l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofererac-htlaeh,sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dc&hsums,umpw,xirtrepmi,?eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,r&italik,tap-el-tse,?s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,hce-namtsop,jodsnd,m&-morf,ed-baltlow,?n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ym&eerf,teg,??ohsdaerpsym,pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&iv&erp-yb-detsoh.saap,orpnwo,?ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb&-a-si,ndi,?h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.&cpj-rev-duolcj,duolcj,?s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,ituob,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&areleccalabolgswa,c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,e&tsoh.&duolc-gar,hc-duolc-gar,?ugolb-nom-tse,?omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,vnacremarf,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,t&isro,yskciuq,??i&ht2tniop,pa&elgoog,tneltneg,??jfac,k&-morf,aerf-ten,colb&egrof,pohsym,??m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppa&raeghtua,tneg,?r&ac-otni-si,e&ntrap-paelut,tsohmaerd,??s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&a&llicno,zno,?ilay,lacarac,re&gitnef,motsuc,?sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,???t&arcomed-a-si,c&-morf,etedatad.&ecnatsni,omed,??eel&-si,rebu-si,?hgilfhtiwletoh,m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,e&capsppa,lbavresbo.citats,?pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,w-morf,?w&o&lpwons-yrt,zok,?ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,l&erottad,pezam,?wetag-llawerif,?dnacsekil,fipohsym,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.r&iaper,of,??po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?moc?ten?ude???i!.&bew,c&a?in??dni?esabapus,gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p?v?w!.taht,?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?ude?vog???o&dnol!.&fo,ni,??i&hsaf!.fo,?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?nhojcs?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&d&ni?uolcegnaro,?esnefed?gro?ltni?m&oc!nim??siruot??n&erut?if??o&fni?srep??sn&e?r??t&an?en!irga?ude??rnr??unr?vog??m??u&f?r!.&bdnevar,lper,sh,tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?esabapus,gro?ipym,l&im?per:.di,,?m&o&c!.topsgolb,?n??rif?udon,?ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e?in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&iaznab.ppa,ropav,?rd,??e&c&apsinu.1rf-duolc,ivedniser,?donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&i&beulb,snoehtnap,?newtu,ybeeb.saap,??gni&gatsniser.secived,tsohytsoh,?k&coregrof.di,orgn,ramytefasresworb,?m&oc?udon,?n&mtsp:.kcom,,yded,?ot&oq,pyrctfihs,?p&opilol,pa&-arusah,e&nalpkcab,tybeeb.1dkes,???r&e&tsneum-hf,vres&cisab,lautriv,??ial.sppa,?s&codehtdaer,gnihtbew,nemeis-om,pparevelc,tacdnas,?t&e&kcubtib,notorp,?i&belet,detfihs,kecaps,?raedon.egats,s&ohg,udgniht.&cersid.&dvreser,tsuc,?dorp.tsuc,gnitset.&dvreser,tsuc,?ved.&dvreser,tsuc,????vgib.0ku,whs,x&bslprbv.g,cq,rotide,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?ohsdaerpsym,p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t??o&c,fni??pohs,stra?t&n?opsgolb,?www??e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!.uj,ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew:erif,,e&niln&igol,okoob,?tupmocegde,?lecrev,n&aecolatigidno,ur:.a,,?poon,remarf,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&acisum?bog?gro?lim?moc!.topsgolb,?rut?t&en?ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.&duolclautriv.elacs.sresu,topsgolb,???nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&c&sid?tfiws??rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?lipuog,rianiretev??hny,i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?pohsdaerpsym,s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?moc?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??pohsdaerpsym,ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,etisinim,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?ni?oc?topsgolb,ude?vog?xo,yldnerb.pohs,?a&c?p?tiug??c?e&dliub!.etisduolc,?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&em?gro?hcs?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.oc,???rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&e&f?lacsne.xhp,?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???u&olcrim,rd,??e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n!.elbaeciton,??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?p&h21,ohsdaerpsym,?r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0&002cilc,rab,?1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,irgevissam.saap.&1-&gs,nol,rf,yn,?2-&nol,yn,??nab-eht-ni,uolc&meaeboda,nievas.c&di-etsedron,itsalej,?xednay:.e&garots,tisbew,?,??e&c&narusnihtlaehezitavirp,rofelacs.j,?gdirbtib,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?n&ilno-evreser,ozdop,?rehurht,s:abapus,,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,sirkcilc,tsohnnylf,?olb&evres,tsaf,??k&catsvano,eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?i&bed,llerk,??dcduabkcalb,i,pv-ni,?o&c-morf,duppa,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,h&bew,sdaerpsym,??pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&gde-ndc,suohsyub,t&isbeweruza,ys,??k&catstsaf,ekokohcs,?n&d&-won,d,golb,npv,?oitcnufduolc,?ppacitatseruza:.&2suts&ae,ew,?aisatsae,eporuetsew,sulartnec,?,s&a-skcik,ecca&-citats,duolc,???t&adies,ce&ffeym,jorprot:.segap,,?e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,oh&-spv:.citsalej.&cir,lta,sjn,?,gnik,???u&h,nyd,r:eakust.citsalej,,?ved-naissalta.dorp.ndc,x&inuemoh,spym,tsale.&1ots-slj,2ots-slj,3ots-slj,?unilemoh,?y&awetag-llawerif,ffijduolc:.&ed-1arf,su-1tsew,?,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?moc?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i!t.nepo.citsalej.duolc,?ol?r??n&a!lim?sl&ab?ub???b?c?e!en.cj,v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?ohsdaerpsym,s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f?m!r??utni??je3a3abgm--nx?kh?l!.&topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.&ude,vog:.ecivres,,??d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?moc?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?moc?o&c?dalusnoc?hon,?ten?ude??a&cmoc?f??e&b?padub?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,lrupmet,s&pvtsaf,seccaduolc,?tsafym,vedumpw,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y!.gro,?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.&pohsdaerpsym,stelduolc.lem,topsgolb,??nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.topsgolb,?m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&3kl,a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,duolcrim,e&niram,rpcm,?g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,d&cm:.spv,,orue,?midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.topsgolb,?ed!.&enilnigol,gnigats-oned,hcetaidem,lecrev,o&ned,tpyrctfihs,?ppa-rettalp,s&egap,rekrow,?vr&esi,uc,?weiverpbuhtig,ylf,??ih?l!.&di?fnoc?gro?lim?moc?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?moc!.reliamym,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?moc?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex??rbgn--nx?s!.vog??x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot??g?lp?p!ila??rot?ssin?wdaorb??b!.&duolcym,fo?hcetaidem,lim?moc!.topsgolb,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??t&en?nemailrap??vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?moc?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude?vog??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog?zib??edaca!.laiciffo,?ra??n&a&ffit?pmoc!ylimafa???os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c?ledif?n&ifx?ummoc!.&bdnevar,gon,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?moc!.topsgolb,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?jsg,moc?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&cos?gro?lop?m&oc?t??ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&duolcj,gro?lim?moc?t&en?ropeletzak.saapu,?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&e&nozlacol,tisgolb,?gnitfarc,otpaz,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур!.&арамас,бпс,гро,зиб,ичос,ксм,м&ок,ырк,?рим,я,??тйас?фр?юе?յահ?לארשי?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
+          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?sr,t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,p&i-on,ohsdaerpsym,?sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?moc?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?moc?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,xc,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?rrd,ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,nwaps.secnatsni,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?esab,gro?l&aiciffo,im??moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??sum?tic??l!.&gro?moc?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog???t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?moc?ten?ude?v&g:.d,,og????wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,golbw,hcs?lim?o&c!.topsgolb,?g??palf,r&egolb,o??sepnop?ten?ym?zib??b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&a&bura-vnej.&1ti,abura.rue.1ti,?tcepsrep,xo:.&ku,nt,?,?b&dnevar,ewilek:.sc,,?citsalej.piv,drayknil,elej,gnitsohdnert.&ed,hc,?letemirp:.ku,,m&edaid,ialcer.&ac,ku,su,??n&evueluk,woru,?r&epolroov,o&pav,tnemele,??tenraxa.1-se,ululetoj,xelpciffart,yawocne.ue,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,nevueluk.yxorpze,pohsdaerpsym,snoitulostsohretni.duolc,topsgolb,?ortal?ut!uoy???c&0krbd4--nx?a&lp!.oc,?ps!.&lla4sx,rebu,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,b&ow-nrefeilgitsng--nx,rb-ni,vz-nelletsebgitsng--nx,?decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,e&lletsebgitsnüg,sgnutiel,?i&emtsi,lreb-n&i,yd,??norblieh-sh.ti.segap,oitatsksid-ygolonys,pv&-n&i,yd,?nyd,?refeilgitsnüg,?orp-ytinummoc,p&h21,iog:ol,,ohsdaerpsym,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??art!.oby,?i&sdoow?ug??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il??g!.&gro?lim?moc?t&en?vp??ude?vog??a&f?gtrom?p!.&3xlh,detalsnart,grebedoc,kselp,sndp,tengam,xlh,y&cvrp,kcor,???rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&pohsdaerpsym,topsgolb,vog??tilop?v&bba?om???j!.&fo,gro?oc?ten???k!.&c&a?s??e&m?n??ibom?o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,p&ct,v,??66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?qbw,r&aegelif,idcm,ofsnd,?s&dym,ndd,ti!bt,?umhol,?t&en?s&acdnuos,ohon,??u&a-raegelif,de??v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.&egats-oree,oree,ysrab,??w??o!.&derno:.gnigats,,ecivres,knilemoh,r&ednu,of,??hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?mo&c?n??t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.&e&rawpohs,saberots,?yflles,??taeht?u&ces?sni?t&inruf?necca??za???s!.&a!bap.us,?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!ohsdaerpsym,p??r!owebdluocti,?s!serp?yspoi,?t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&e&lej,nilnigol,r&etnim,ocevon,?winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,thrs,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?ib?og??ce&r?t??erots?gro?lim?m&o&c?n??rif??o&c?fni??rar?stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l!.xlh,?rd?ssergorp??ol??w&kct--nx?r??xul?y!.&gro?lim?moc?ten?ude?vog????f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?moc?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx!.&a14--nx,b8lea1j--nx,c&avc0aaa08--nx,ma09--nx,?f&a1a09--nx,ea1j--nx,?gva1c--nx,nha1h--nx,pda1j--nx,zila1h--nx,??ns??ea1j--nx?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram!.&htiw,morf,??hgil?lusnoc?neg?ov?soh!.tfarcnepo,??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.&duolc,etalsnart,???r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?ibptth,o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?d&ikcet.3s,ylimaf,?eirfotatophcuoc,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&delacsne,gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?moc?o&c?g??ro?topsgolb,??v!.ta,a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,p&h21,ohsdaerpsym,?sndtog,topsgolb,wolf.e&a.1pla,nigneppa,?xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??pib,ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh!.arh,?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?moc?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?i&ki,spak,?mroftalpduolc.if,nenikkäh,pohsdaerpsym,retnecatad.&omed,saap,?topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,ppatig,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?moc?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme??d!.&erots,ger,mrif,oc,pohsdaerpsym,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc??npqic--nx?saaces,t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?moc?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&morf,ot,?ten!.&htumiza,nolt,o&c,vra,??doof???s!.topsgolb,?t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,yr&ettoly&lkeew,tiniffa,?tneelffar,???lenap-tnednepedni,n&noc,oissimmoc-&layor,tnednepedni,??o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?omida,p&i-on,ohsdaerpsym,?t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?psoh,shn?t&en?nmyp,seuqni-tnednepedni,?vog!.&eci&ffoemoh,vres,?ipa,??weiver-tnednepedni,y&riuqni-&cilbup,tnednepedni,?srab,????l&04sr4w--nx?a!.&gro?lim?moc?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?oc?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?moc?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.&egapvar,redrotibat,topsgolb,??ten?vog??a&f?m&e?g?toh???m?r??l&a&b&esab?t&eksab!.&sua,zn,??oof???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&no&med,rtsic,?oc,pohsdaerpsym,retsulc-gnitsoh,topsgolb,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.&ed,rotnemele,??hcs??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&erapohs,img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats?uolc&inu,sds,??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks!emoh,??klwwortso?ohs!-ecremmoce,daerpsym,??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?moc?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,5sndd,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw:.sj,,tsohecapsppa,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,iafaw.&d&ej,yr,?nol,?meaeboda,panqym:-&ahpla,ved,?,smetsystuo,tekcilc,ved&j,pw,??vreser,wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilno&-evreser,ysrab,?og-si,?r&alfduolcyrt,ehwynanohtyp:.ue,,ihcec,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,xiw,??omer-sndnyd,upmocsma,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-&raeghtua,swennwot,?ksndd,robsikrow,tsoh-bt.etis,?o&fgp,lb&-sndnyd,pawodni,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am&-sndnyd,detsohpw,??l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofe&pyt.orp,rerac-htlaeh,?sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dc&hsums,umpw,xirtrepmi,?eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,r&italik,tap-el-tse,?s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,hce-namtsop,jodsnd,m&-morf,ed-baltlow,?n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ym&eerf,teg,??ohsdaerpsym,pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&iv&erp-yb-detsoh.saap,orpnwo,?ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb&-a-si,ndi,?h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.&cpj-rev-duolcj,duolcj,?s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,ituob,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&areleccalabolgswa,c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,e&tsoh.&duolc-gar,hc-duolc-gar,?ugolb-nom-tse,?omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,vnacremarf,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,t&i&iis,sro,?yskciuq,??i&ht2tniop,pa&elgoog,tneltneg,??jfac,k&-morf,aerf-ten,colb&egrof,pohsym,??m&-morf,cxolb,?n&d&-pmet,dyard,golb,htiwssem,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppa&raeghtua,tneg,?r&ac-otni-si,e&ntrap-paelut,tsohmaerd,??s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&a&llicno,zno,?ilay,lacarac,re&gitnef,motsuc,?sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,??yasdrocsid,?t&arcomed-a-si,c&-morf,etedatad.&ecnatsni,omed,??eel&-si,rebu-si,?hgilfhtiwletoh,m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,e&capsppa,donil.pi,lbavresbo.citats,?pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,rdlf,w-morf,?w&o&lpwons-yrt,zok,?ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,l&erottad,pezam,?wetag-llawerif,?dnacsekil,fipohsym,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orp&hsilbup,mapson.duolc,???zesdrocsid,?inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.r&iaper,of,??po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?moc?ten?ude???i!.&bew,c&a?in??dni?esabapus,gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p?v?w!.taht,?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?ude?vog???o&dnol!.&fo,ni,??i&hsaf!.fo,?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&d&ni?uolcegnaro,?gro?ltni?m&oc!nim??siruot??nif?o&fni?srep??sne?t&an?en??vog??m??u&f?r!.&bdnevar,lper,retropno,s&h,revres,?tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?esabapus,gro?ipym,l&im?per:.di,,?m&o&c!.topsgolb,?n??rif??ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e?in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?czh,d&in,u&olc&iaznab.ppa,ropav,?rd,??e&c&apsinu.1rf-duolc,ivedniser,?donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&i&beulb,snoehtnap,?newtu,ybeeb.saap,??gni&gatsniser.secived,tsohytsoh,?ilpu,k&coregrof.di,orgn,ramytefasresworb,?moc?n&mtsp:.kcom,,yded,?ot&oq,pyrctfihs,?p&opilol,pa&-arusah,e&nalpkcab,tybeeb.1dkes,???r&e&tsneum-hf,vres&cisab,lautriv,??ial.sppa,?s&codehtdaer,gnihtbew,nemeis-om,pparevelc,t&acdnas,ekcit,??t&e&kcubtib,notorp,?i&belet,detfihs,gude,kecaps,?raedon.egats,s&ohg,udgniht.&cersid.&dvreser,tsuc,?dorp.tsuc,gnitset.&dvreser,tsuc,?ved.&dvreser,tsuc,????vgib.0ku,whs,x&bslprbv.g,cq,rotide,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?ohsdaerpsym,p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t??o&c,fni??pohs,stra?t&n?opsgolb,?www?ysrab,?e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e!tfarcdnah,??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???lasrepus,mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????rotsnoihsaf,tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????pohs&eht,iiawak,yub,?r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!.uj,ac?j??nd?o&g?h&pih?s!.&esab,xilpoh,ysrab,???lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew:erif,,e&gatskrelc,niln&igol,okoob,?tupmocegde,virdhsalfno,?krelc,lecrev,n&aecolatigidno,ur:.a,,?poon,remarf,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&a&cisum?sanes??bog?gro?l&autum?im??moc!.topsgolb,?pooc?rut?t&e&b?n??ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.&duolclautriv.elacs.sresu,topsgolb,???nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&csid?rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?lipuog,rianiretev??hny,i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?pohsdaerpsym,s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?moc?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?ik?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??pohsdaerpsym,ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,etisinim,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?ni?oc?topsgolb,ude?vog?xo,yldnerb.pohs,?a&c?p?tiug??c?e&dliub!.etisduolc,?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&em?gro?hcs?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.&nibook,oc,????rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&e&f?lacsne.xhp,?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???u&olcrim,rd,??e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n!.elbaeciton,??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?p&h21,ohsdaerpsym,?r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0rab,1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,irgevissam.saap.&1-&gs,nol,rf,yn,?2-&nol,yn,??nab-eht-ni,uolc&meaeboda,nievas.c&di-etsedron,itsalej,?xednay:.e&garots,tisbew,?,??e&c&narusnihtlaehezitavirp,rofelacs.j,?gdirbtib,ht-no-eciffo,l&acs&liat.ateb,noom,?ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?n&ilno-evreser,ozdop,?rehurht,s:abapus,,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,sirkcilc,tsohnnylf,?olb&evres,tsaf,??k&catsvano,eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?i&bed,llerk,??dcduabkcalb,i,pv-ni,?o&c-morf,duppa,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,h&bew,sdaerpsym,??pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&gde-ndc,suohsyub,t&isbeweruza,ys,??k&catstsaf,ekokohcs,?n&d&-won,d,golb,npv,?oitcnufduolc,?ppacitatseruza:.&2suts&ae,ew,?aisatsae,eporuetsew,sulartnec,?,s&a-skcik,ecca&-citats,duolc,??t,?t&adies,ce&ffeym,jorprot:.segap,,lespohs,?e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,oh&-spv:.citsalej.&cir,lta,sjn,?,gnik,???u&h,nyd,r:eakust.citsalej,,?ved-naissalta.dorp.ndc,x&inuemoh,spym,tsale.&1ots-slj,2ots-slj,3ots-slj,?unilemoh,?y&awetag-llawerif,ffijduolc:.&ed-1arf,su-1tsew,?,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?moc?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i!t.nepo.citsalej.duolc,?ol?r??n&a!lim?sl&ab?ub???b?c?e!en.cj,v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?ohsdaerpsym,s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f?m?utni??je3a3abgm--nx?kh?l!.&topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.&ude,vog:.ecivres,,??d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?moc?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?moc?o&c?dalusnoc?hon,?ten?ude??a&cmoc?f??e&b?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,lrupmet,s&pvtsaf,seccaduolc,?tsafym,vedumpw,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y!.gro,?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.&pohsdaerpsym,stelduolc.lem,topsgolb,??nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.topsgolb,?m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&3kl,a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,duolcrim,e&niram,rpcm,?g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,d&cm:.spv,,orue,?midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.&emon?gro?moc?t&ni?opsgolb,?ude???ed!.&enilnigol,gnigats-oned,hcetaidem,lecrev,o&ned,tpyrctfihs,?ppa-rettalp,s&egap,rekrow,?vr&esi,uc,?weiverpbuhtig,ylf,??ih?l!.&di?fnoc?gro?lim?moc?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?moc!.reliamym,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?moc?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex??rbgn--nx?s!.vog??x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot!.emyfilauqerp,??g?lp?p!ila??rot?ssin?wdaorb??b!.&duolcym,fo?hcetaidem,lim?moc!.topsgolb,?vog??ab?gur??c!.&ca?dtl?gro?lim?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??ten?vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?moc?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog?zib??edaca!.laiciffo,?ra??n&a&ffit?pmoc??os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c?ledif?n&ifx?ummoc!.&bdnevar,gon,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?moc!.topsgolb,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?jsg,moc?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&cos?gro?lop?m&oc?t??ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&duolcj,gro?lim?moc?t&en?ropeletzak.saapu,?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&e&nozlacol,tisgolb,?gnitfarc,otpaz,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур!.&арамас,бпс,гро,зиб,ичос,ксм,м&ок,ырк,?рим,я,??тйас?фр?юе?յահ?לארשי?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
 
   /**
    * If a hostname is not a key in the EXCLUDE map, and if removing its leftmost component results
@@ -50,7 +50,7 @@
    */
   public static final ImmutableMap<String, PublicSuffixType> UNDER =
       TrieParser.parseTrie(
-          "ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.&ecapsrebu,yksurf,?noz.notirt,t&atse.etupmoc,is.&hsmroftalp,tst,???gp?h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,lrihwyap,mme0,osseccandcved,s&t&cejboedonil,nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???n&c.moc.swanozama.&ble,etupmoc,?ur.edoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n?pa.&knalfhtron,repoleved,??r&b.mon?e??s&edoc.owo,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.&cimonotpyrc,hvo.&gnitsoh,saapbew,???u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&e&gats&gts,lcl,?rahbew,?gts,lcl,yawetag,?z&c.murtnecatem.duolc,yx.tibelet,??");
+          "ac.vedwa,d&b?i.ym.ssr,uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.&ecapsrebu,yksurf,?noz.notirt,t&atse.etupmoc,is.&areduolc,hsmroftalp,tst,???g&oog.tnetnocresu,p??h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,lrihwyap,mme0,osseccandcved,s&ecapsnaecolatigid,t&cejbo&edonil,rtluv,?nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???n&c.moc.swanozama.&ble,etupmoc,?ur.edoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n?pa.&knalfhtron,repoleved,tegeb,??r&b.mon?e??s&edoc.owo,noitulos.rehid,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.&cimonotpyrc,hvo.&gnitsoh,saapbew,???u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&e&gats&gts,lcl,?rahbew,?gts,lcl,yawetag,?z&c.murtnecatem.duolc,yx.tibelet,??");
 
   /**
    * The elements in this map would pass the UNDER test, but are known not to be public suffixes and
diff --git a/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java b/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
index dd77780..89cdadd 100644
--- a/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
+++ b/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
@@ -36,7 +36,7 @@
     while (idx < encodedLen) {
       idx += doParseTrieToBuilder(Queues.<CharSequence>newArrayDeque(), encoded, idx, builder);
     }
-    return builder.build();
+    return builder.buildOrThrow();
   }
 
   /**
diff --git a/android/pom.xml b/android/pom.xml
index 3620bb3..3784c9f 100644
--- a/android/pom.xml
+++ b/android/pom.xml
@@ -6,7 +6,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-parent</artifactId>
-  <version>31.0.1-android</version>
+  <version>31.1-android</version>
   <packaging>pom</packaging>
   <name>Guava Maven Parent</name>
   <description>Parent for guava artifacts</description>
@@ -18,6 +18,8 @@
     <checker-framework.version>3.12.0</checker-framework.version>
     <animal.sniffer.version>1.20</animal.sniffer.version>
     <maven-javadoc-plugin.version>3.1.0</maven-javadoc-plugin.version>
+    <!-- Empty for all JDKs but 9-12 -->
+    <maven-javadoc-plugin.additionalJOptions></maven-javadoc-plugin.additionalJOptions>
     <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
@@ -158,6 +160,8 @@
               <version>1.10</version>
             </signature>
             <ignores>
+              <!-- Allow requireNonNull: Android desugaring rewrites it (so it's safe for us to use), and it's useful for null checks. Note that this line allows *all* methods from java.util.Objects. That's the best that we can do with the configuration options that Animal Sniffer offers. -->
+              <ignore>java.util.Objects</ignore>
               <!-- Unsafe isn't part of the documented Java 6 API, but it is available.
                    And in cases where it's not, we have fallbacks. -->
               <ignore>sun.misc.Unsafe</ignore>
@@ -188,6 +192,7 @@
             </additionalOptions>
             <linksource>true</linksource>
             <source>8</source>
+            <additionalJOption>${maven-javadoc-plugin.additionalJOptions}</additionalJOption>
           </configuration>
           <executions>
             <execution>
@@ -271,16 +276,10 @@
         <version>${checker-framework.version}</version>
         <classifier>sources</classifier>
       </dependency>
-      <!-- TODO(cpovirk): Remove checker-compat-qual after we finish migrating to type annotations. -->
-      <dependency>
-        <groupId>org.checkerframework</groupId>
-        <artifactId>checker-compat-qual</artifactId>
-        <version>2.5.5</version>
-      </dependency>
       <dependency>
         <groupId>com.google.errorprone</groupId>
         <artifactId>error_prone_annotations</artifactId>
-        <version>2.7.1</version>
+        <version>2.11.0</version>
       </dependency>
       <dependency>
         <groupId>com.google.j2objc</groupId>
@@ -387,5 +386,23 @@
           </plugins>
       </build>
     </profile>
+    <profile>
+      <!--
+          Passes JDK 9-12-specific `no-module-directories` flag to Javadoc tool,
+          which is required to make symbol search work correctly in the generated
+          pages.
+
+          This flag does not exist on 8 and 13+ (https://bugs.openjdk.java.net/browse/JDK-8215582).
+
+          Consider removing it once our release and test scripts are migrated to a recent JDK (17+).
+       -->
+      <id>javadocs-jdk9-12</id>
+      <activation>
+        <jdk>[9,13)</jdk>
+      </activation>
+      <properties>
+        <maven-javadoc-plugin.additionalJOptions>--no-module-directories</maven-javadoc-plugin.additionalJOptions>
+      </properties>
+    </profile>
   </profiles>
 </project>
diff --git a/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java b/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
index cf0199a..a8d9dd4 100644
--- a/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -116,15 +116,7 @@
  * put in a special hack for us: https://issuetracker.google.com/issues/131431257)
  */
 @DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
-/*
- * It would make sense to also annotate this class with @ElementTypesAreNonnullByDefault. However,
- * it makes no difference because this class is already covered by the package-level
- * @ParametersAreNonnullByDefault, and this class declares only parameters, not return types or
- * fields. (Not to mention that we'll be removing all @*AreNonnullByDefault annotations after tools
- * understand .) And it's fortunate that the annotation makes no difference, because
- * we're seeing a breakage internally when we add that annotation :)
- *
- */
+@ElementTypesAreNonnullByDefault
 public interface ListenableFuture<V extends @Nullable Object> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
diff --git a/guava-bom/pom.xml b/guava-bom/pom.xml
index 58c001e..1a3d98e 100644
--- a/guava-bom/pom.xml
+++ b/guava-bom/pom.xml
@@ -8,7 +8,7 @@
 
   <groupId>com.google.guava</groupId>
   <artifactId>guava-bom</artifactId>
-  <version>31.0.1-jre</version>
+  <version>31.1-jre</version>
   <packaging>pom</packaging>
   
   <parent>
diff --git a/guava-gwt/pom.xml b/guava-gwt/pom.xml
index 310cbdd..5c93f83 100644
--- a/guava-gwt/pom.xml
+++ b/guava-gwt/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>31.0.1-jre</version>
+    <version>31.1-jre</version>
   </parent>
   <artifactId>guava-gwt</artifactId>
   <name>Guava GWT compatible libs</name>
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ForwardingImmutableMap.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ForwardingImmutableMap.java
index 68cce93..e3dd703 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ForwardingImmutableMap.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ForwardingImmutableMap.java
@@ -37,12 +37,12 @@
   }
 
   @SuppressWarnings("unchecked")
-  ForwardingImmutableMap(Entry<? extends K, ? extends V>... entries) {
+  ForwardingImmutableMap(boolean throwIfDuplicateKeys, Entry<? extends K, ? extends V>... entries) {
     Map<K, V> delegate = Maps.newLinkedHashMap();
     for (Entry<? extends K, ? extends V> entry : entries) {
       K key = checkNotNull(entry.getKey());
       V previous = delegate.put(key, checkNotNull(entry.getValue()));
-      if (previous != null) {
+      if (throwIfDuplicateKeys && previous != null) {
         throw new IllegalArgumentException("duplicate key: " + key);
       }
     }
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java
index cef789a..f0b15f6 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java
@@ -310,12 +310,25 @@
       return buildOrThrow();
     }
 
-    public ImmutableMap<K, V> buildOrThrow() {
+    private ImmutableMap<K, V> build(boolean throwIfDuplicateKeys) {
       if (valueComparator != null) {
         Collections.sort(
             entries, Ordering.from(valueComparator).onResultOf(Maps.<V>valueFunction()));
       }
-      return fromEntryList(entries);
+      return fromEntryList(throwIfDuplicateKeys, entries);
+    }
+
+    public ImmutableMap<K, V> buildOrThrow() {
+      return build(/* throwIfDuplicateKeys= */ true);
+    }
+
+    public ImmutableMap<K, V> buildKeepingLast() {
+      if (valueComparator != null) {
+        // Probably not worth supporting this in GWT
+        throw new UnsupportedOperationException(
+            "orderEntriesByValue + buildKeepingLast not supported under GWT");
+      }
+      return build(/* throwIfDuplicateKeys= */ false);
     }
 
     ImmutableMap<K, V> buildJdkBacked() {
@@ -323,8 +336,13 @@
     }
   }
 
-  static <K, V> ImmutableMap<K, V> fromEntryList(
+  private static <K, V> ImmutableMap<K, V> fromEntryList(
       Collection<? extends Entry<? extends K, ? extends V>> entries) {
+    return fromEntryList(/* throwIfDuplicateKeys= */ true, entries);
+  }
+
+  private static <K, V> ImmutableMap<K, V> fromEntryList(
+      boolean throwIfDuplicateKeys, Collection<? extends Entry<? extends K, ? extends V>> entries) {
     int size = entries.size();
     switch (size) {
       case 0:
@@ -335,7 +353,7 @@
       default:
         @SuppressWarnings("unchecked")
         Entry<K, V>[] entryArray = entries.toArray(new Entry[entries.size()]);
-        return new RegularImmutableMap<K, V>(entryArray);
+        return new RegularImmutableMap<K, V>(throwIfDuplicateKeys, entryArray);
     }
   }
 
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/RegularImmutableMap.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/RegularImmutableMap.java
index b79ce80..9885371 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/RegularImmutableMap.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/RegularImmutableMap.java
@@ -30,6 +30,10 @@
   }
 
   RegularImmutableMap(Entry<? extends K, ? extends V>... entries) {
-    super(entries);
+    this(/* throwIfDuplicateKeys= */ true, entries);
+  }
+
+  RegularImmutableMap(boolean throwIfDuplicateKeys, Entry<? extends K, ? extends V>[] entries) {
+    super(throwIfDuplicateKeys, entries);
   }
 }
diff --git a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java
index 0f22cac..1ecce78 100644
--- a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java
+++ b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java
@@ -40,6 +40,8 @@
 public abstract class AbstractFuture<V> extends InternalFutureFailureAccess
     implements ListenableFuture<V> {
 
+  static final boolean GENERATE_CANCELLATION_CAUSES = false;
+
   /**
    * Tag interface marking trusted subclasses. This enables some optimizations. The implementation
    * of this interface must also be an AbstractFuture and must not override or expose for overriding
diff --git a/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml b/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
index a281a1f..529baf5 100644
--- a/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
+++ b/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/base/Base.gwt.xml b/guava-gwt/src/com/google/common/base/Base.gwt.xml
index b8c0447..22ca527 100644
--- a/guava-gwt/src/com/google/common/base/Base.gwt.xml
+++ b/guava-gwt/src/com/google/common/base/Base.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/cache/Cache.gwt.xml b/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
index fb58b997..0f46529 100644
--- a/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
+++ b/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/collect/Collect.gwt.xml b/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
index cb2b654..91756f9 100644
--- a/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
+++ b/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/escape/Escape.gwt.xml b/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
index 5733706..a3ddbba 100644
--- a/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
+++ b/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/html/Html.gwt.xml b/guava-gwt/src/com/google/common/html/Html.gwt.xml
index ca997f0..de5e7ad 100644
--- a/guava-gwt/src/com/google/common/html/Html.gwt.xml
+++ b/guava-gwt/src/com/google/common/html/Html.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/io/Io.gwt.xml b/guava-gwt/src/com/google/common/io/Io.gwt.xml
index cb2b654..91756f9 100644
--- a/guava-gwt/src/com/google/common/io/Io.gwt.xml
+++ b/guava-gwt/src/com/google/common/io/Io.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/math/Math.gwt.xml b/guava-gwt/src/com/google/common/math/Math.gwt.xml
index ff56f8e..6afbe44 100644
--- a/guava-gwt/src/com/google/common/math/Math.gwt.xml
+++ b/guava-gwt/src/com/google/common/math/Math.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/net/Net.gwt.xml b/guava-gwt/src/com/google/common/net/Net.gwt.xml
index 7024312..039f77c 100644
--- a/guava-gwt/src/com/google/common/net/Net.gwt.xml
+++ b/guava-gwt/src/com/google/common/net/Net.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml b/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
index 5733706..a3ddbba 100644
--- a/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
+++ b/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml b/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml
index 92daff3..2fdeb6b 100644
--- a/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml
+++ b/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/common/xml/Xml.gwt.xml b/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
index 8a9e3b8..eec7e7b 100644
--- a/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
+++ b/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
index be70a5c..f35ad8c 100644
--- a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
+++ b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
index b8c0447..22ca527 100644
--- a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
+++ b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml b/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml
index 6d1e97b..5d17a81 100644
--- a/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml
+++ b/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml b/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml
index 5e90c31..54f33bf 100644
--- a/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml
+++ b/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml b/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml
index c3a1bd4..0957af4 100644
--- a/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml
+++ b/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-gwt/test/com/google/common/testing/Testing.gwt.xml b/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
index 0c58567..72c486d 100644
--- a/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
+++ b/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
@@ -5,19 +5,26 @@
 </source>
 
 <!--
-     We used to set this only for packages that had manual supersource.
-     That worked everywhere that I know of except for one place:
-     when running the GWT util.concurrent tests under Guava.
-     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
-     https://goo.gl/pRV3Yn
-     The summary is that it ignores one file in favor of the other.
-     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
-     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
-     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
-     This causes it to fail to find AtomicLongMapTest.
-     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
-     GWT is happy to ignore us when we specify a nonexistent path.
-     (I hope that this workaround does not cause its own problems in the future.)
+    We used to set this only for packages that had manual supersource. That
+    worked everywhere that I know of except for one place: when running the GWT
+    util.concurrent tests under Guava.
+
+    The problem is that GWT responds poorly to two .gwt.xml files in the same
+    Java package; see https://goo.gl/pRV3Yn for details.
+
+    The summary is that it ignores one file in favor of the other.
+    util.concurrent, like nearly all our packages, has two .gwt.xml files: one
+    for prod and one for tests. However, unlike our other packages, as of this
+    writing it has test supersource but no prod supersource.
+
+    GWT happens to use the prod .gwt.xml, so it looks for no supersource for
+    tests, either. This causes it to fail to find AtomicLongMapTest.
+
+    Our workaround is to tell GWT that util.concurrent and all other packages
+    have prod supersource, even if they have none. GWT is happy to ignore us
+    when we specify a nonexistent path.
+
+    (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
 
diff --git a/guava-testlib/README.md b/guava-testlib/README.md
index 4368995..d4810e3 100644
--- a/guava-testlib/README.md
+++ b/guava-testlib/README.md
@@ -13,7 +13,7 @@
 <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-testlib</artifactId>
-  <version>31.0.1-jre</version>
+  <version>31.1-jre</version>
   <scope>test</scope>
 </dependency>
 ```
@@ -22,7 +22,7 @@
 
 ```gradle
 dependencies {
-  test 'com.google.guava:guava-testlib:31.0.1-jre'
+  test 'com.google.guava:guava-testlib:31.1-jre'
 }
 ```
 
diff --git a/guava-testlib/pom.xml b/guava-testlib/pom.xml
index aa812ae..19ce18a 100644
--- a/guava-testlib/pom.xml
+++ b/guava-testlib/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>31.0.1-jre</version>
+    <version>31.1-jre</version>
   </parent>
   <artifactId>guava-testlib</artifactId>
   <name>Guava Testing Library</name>
diff --git a/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java b/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java
index a5674d3..b86ef17 100644
--- a/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/AbstractContainerTester.java
@@ -188,7 +188,7 @@
     E[] elements = createSamplesArray();
     E duplicate = elements[(elements.length / 2) - 1];
     elements[(elements.length / 2) + 1] = duplicate;
-    return new ArrayWithDuplicate<E>(elements, duplicate);
+    return new ArrayWithDuplicate<>(elements, duplicate);
   }
 
   // Helper methods to improve readability of derived classes
@@ -211,7 +211,7 @@
    * requirement {@link com.google.common.collect.testing.features.CollectionFeature#KNOWN_ORDER}.
    */
   protected List<E> getOrderedElements() {
-    List<E> list = new ArrayList<E>();
+    List<E> list = new ArrayList<>();
     for (E e : getSubjectGenerator().order(new ArrayList<E>(getSampleElements()))) {
       list.add(e);
     }
diff --git a/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java b/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java
index 090442e..5e0de3c 100644
--- a/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/AbstractMapTester.java
@@ -72,8 +72,8 @@
   /** @return an array of the proper size with {@code null} as the key of the middle element. */
   protected Entry<K, V>[] createArrayWithNullKey() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullKeyLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullKeyLocation];
+    int nullKeyLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullKeyLocation];
     array[nullKeyLocation] = entry(null, oldEntry.getValue());
     return array;
   }
@@ -97,8 +97,8 @@
   /** @return an array of the proper size with {@code null} as the value of the middle element. */
   protected Entry<K, V>[] createArrayWithNullValue() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullValueLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullValueLocation];
+    int nullValueLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullValueLocation];
     array[nullValueLocation] = entry(oldEntry.getKey(), null);
     return array;
   }
diff --git a/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java b/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
index 3588e85..a04d3ff 100644
--- a/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
+++ b/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
@@ -96,9 +96,9 @@
 
     public MapKeySetGenerator(OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>> mapGenerator) {
       this.mapGenerator = mapGenerator;
-      final SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
+      SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
       this.samples =
-          new SampleElements<K>(
+          new SampleElements<>(
               mapSamples.e0().getKey(),
               mapSamples.e1().getKey(),
               mapSamples.e2().getKey(),
@@ -203,9 +203,9 @@
     public MapValueCollectionGenerator(
         OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>> mapGenerator) {
       this.mapGenerator = mapGenerator;
-      final SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
+      SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
       this.samples =
-          new SampleElements<V>(
+          new SampleElements<>(
               mapSamples.e0().getValue(),
               mapSamples.e1().getValue(),
               mapSamples.e2().getValue(),
@@ -239,14 +239,13 @@
     @Override
     public V[] createArray(int length) {
       // noinspection UnnecessaryLocalVariable
-      final V[] vs =
-          ((TestMapGenerator<K, V>) mapGenerator.getInnerGenerator()).createValueArray(length);
+      V[] vs = ((TestMapGenerator<K, V>) mapGenerator.getInnerGenerator()).createValueArray(length);
       return vs;
     }
 
     @Override
     public Iterable<V> order(List<V> insertionOrder) {
-      final List<Entry<K, V>> orderedEntries =
+      List<Entry<K, V>> orderedEntries =
           castOrCopyToList(mapGenerator.order(castOrCopyToList(mapGenerator.getSampleElements(5))));
       sort(
           insertionOrder,
diff --git a/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
index b629fa9..db086aa 100644
--- a/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
@@ -185,7 +185,7 @@
 
     TestSuite suite = new TestSuite(name);
     for (Class<? extends AbstractTester> testerClass : testers) {
-      final TestSuite testerSuite =
+      TestSuite testerSuite =
           makeSuiteForTesterClass((Class<? extends AbstractTester<?>>) testerClass);
       if (testerSuite.countTestCases() > 0) {
         suite.addTest(testerSuite);
@@ -211,7 +211,7 @@
   protected abstract List<Class<? extends AbstractTester>> getTesters();
 
   private boolean matches(Test test) {
-    final Method method;
+    Method method;
     try {
       method = extractMethod(test);
     } catch (IllegalArgumentException e) {
@@ -222,7 +222,7 @@
       logger.finer(Platform.format("%s: excluding because it was explicitly suppressed.", test));
       return false;
     }
-    final TesterRequirements requirements;
+    TesterRequirements requirements;
     try {
       requirements = FeatureUtil.getTesterRequirements(method);
     } catch (ConflictingRequirementsException e) {
@@ -268,8 +268,8 @@
   }
 
   protected TestSuite makeSuiteForTesterClass(Class<? extends AbstractTester<?>> testerClass) {
-    final TestSuite candidateTests = new TestSuite(testerClass);
-    final TestSuite suite = filterSuite(candidateTests);
+    TestSuite candidateTests = new TestSuite(testerClass);
+    TestSuite suite = filterSuite(candidateTests);
 
     Enumeration<?> allTests = suite.tests();
     while (allTests.hasMoreElements()) {
@@ -286,7 +286,7 @@
 
   private TestSuite filterSuite(TestSuite suite) {
     TestSuite filtered = new TestSuite(suite.getName());
-    final Enumeration<?> tests = suite.tests();
+    Enumeration<?> tests = suite.tests();
     while (tests.hasMoreElements()) {
       Test test = (Test) tests.nextElement();
       if (matches(test)) {
diff --git a/guava-testlib/src/com/google/common/collect/testing/Helpers.java b/guava-testlib/src/com/google/common/collect/testing/Helpers.java
index 8efafc3..aac71cc 100644
--- a/guava-testlib/src/com/google/common/collect/testing/Helpers.java
+++ b/guava-testlib/src/com/google/common/collect/testing/Helpers.java
@@ -49,7 +49,7 @@
 
   // Clone of Lists.newArrayList
   public static <E> List<E> copyToList(Iterable<? extends E> elements) {
-    List<E> list = new ArrayList<E>();
+    List<E> list = new ArrayList<>();
     addAll(list, elements);
     return list;
   }
@@ -60,7 +60,7 @@
 
   // Clone of Sets.newLinkedHashSet
   public static <E> Set<E> copyToSet(Iterable<? extends E> elements) {
-    Set<E> set = new LinkedHashSet<E>();
+    Set<E> set = new LinkedHashSet<>();
     addAll(set, elements);
     return set;
   }
@@ -188,11 +188,11 @@
     return modified;
   }
 
-  static <T> Iterable<T> reverse(final List<T> list) {
+  static <T> Iterable<T> reverse(List<T> list) {
     return new Iterable<T>() {
       @Override
       public Iterator<T> iterator() {
-        final ListIterator<T> listIter = list.listIterator(list.size());
+        ListIterator<T> listIter = list.listIterator(list.size());
         return new Iterator<T>() {
           @Override
           public boolean hasNext() {
@@ -213,7 +213,7 @@
     };
   }
 
-  static <T> Iterator<T> cycle(final Iterable<T> iterable) {
+  static <T> Iterator<T> cycle(Iterable<T> iterable) {
     return new Iterator<T>() {
       Iterator<T> iterator = Collections.<T>emptySet().iterator();
 
@@ -251,7 +251,7 @@
   }
 
   public static <K, V> Comparator<Entry<K, V>> entryComparator(
-      final Comparator<? super K> keyComparator) {
+      Comparator<? super K> keyComparator) {
     return new Comparator<Entry<K, V>>() {
       @Override
       @SuppressWarnings("unchecked") // no less safe than putting it in the map!
@@ -345,7 +345,7 @@
    * @param delta the difference between the true size of the collection and the values returned by
    *     the size method
    */
-  public static <T> Collection<T> misleadingSizeCollection(final int delta) {
+  public static <T> Collection<T> misleadingSizeCollection(int delta) {
     // It would be nice to be able to return a real concurrent
     // collection like ConcurrentLinkedQueue, so that e.g. concurrent
     // iteration would work, but that would not be GWT-compatible.
@@ -363,7 +363,7 @@
    * equals. This is used for testing unmodifiable collections of map entries; for example, it
    * should not be possible to access the raw (modifiable) map entry via a nefarious equals method.
    */
-  public static <K, V> Entry<K, V> nefariousMapEntry(final K key, final V value) {
+  public static <K, V> Entry<K, V> nefariousMapEntry(K key, V value) {
     return new Entry<K, V>() {
       @Override
       public K getKey() {
@@ -410,7 +410,7 @@
     if (iterable instanceof List) {
       return (List<E>) iterable;
     }
-    List<E> list = new ArrayList<E>();
+    List<E> list = new ArrayList<>();
     for (E e : iterable) {
       list.add(e);
     }
diff --git a/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java b/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
index b8b5c28..4849138 100644
--- a/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
+++ b/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
@@ -149,7 +149,7 @@
     for (V value : values) {
       if (value != null) {
         try {
-          value.hashCode();
+          int unused = value.hashCode();
         } catch (Exception e) {
           return false;
         }
@@ -265,7 +265,7 @@
   protected void assertMoreInvariants(Map<K, V> map) {}
 
   public void testClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -286,8 +286,8 @@
   }
 
   public void testContainsKey() {
-    final Map<K, V> map;
-    final K unmappedKey;
+    Map<K, V> map;
+    K unmappedKey;
     try {
       map = makePopulatedMap();
       unmappedKey = getKeyNotInPopulatedMap();
@@ -312,8 +312,8 @@
   }
 
   public void testContainsValue() {
-    final Map<K, V> map;
-    final V unmappedValue;
+    Map<K, V> map;
+    V unmappedValue;
     try {
       map = makePopulatedMap();
       unmappedValue = getValueNotInPopulatedMap();
@@ -334,8 +334,8 @@
   }
 
   public void testEntrySet() {
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -344,8 +344,8 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final K unmappedKey;
-    final V unmappedValue;
+    K unmappedKey;
+    V unmappedValue;
     try {
       unmappedKey = getKeyNotInPopulatedMap();
       unmappedValue = getValueNotInPopulatedMap();
@@ -359,7 +359,7 @@
   }
 
   public void testEntrySetForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -369,8 +369,8 @@
   }
 
   public void testEntrySetContainsEntryIncompatibleKey() {
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -379,7 +379,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -396,8 +396,8 @@
     if (!allowsNullKeys || !supportsPut) {
       return;
     }
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -406,7 +406,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -420,8 +420,8 @@
   }
 
   public void testEntrySetContainsEntryNullKeyMissing() {
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -430,7 +430,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -450,7 +450,7 @@
   }
 
   public void testEntrySetIteratorRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -488,7 +488,7 @@
   }
 
   public void testEntrySetRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -512,8 +512,8 @@
   }
 
   public void testEntrySetRemoveMissingKey() {
-    final Map<K, V> map;
-    final K key;
+    Map<K, V> map;
+    K key;
     try {
       map = makeEitherMap();
       key = getKeyNotInPopulatedMap();
@@ -540,7 +540,7 @@
   }
 
   public void testEntrySetRemoveDifferentValue() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -570,8 +570,8 @@
     if (!allowsNullKeys || !supportsPut || !supportsRemove) {
       return;
     }
-    final Map<K, V> map;
-    final Set<Entry<K, V>> entrySet;
+    Map<K, V> map;
+    Set<Entry<K, V>> entrySet;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -580,7 +580,7 @@
     assertInvariants(map);
 
     entrySet = map.entrySet();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -597,7 +597,7 @@
   }
 
   public void testEntrySetRemoveNullKeyMissing() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -626,7 +626,7 @@
   }
 
   public void testEntrySetRemoveAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -663,7 +663,7 @@
   }
 
   public void testEntrySetRemoveAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -689,7 +689,7 @@
   }
 
   public void testEntrySetRetainAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -717,7 +717,7 @@
   }
 
   public void testEntrySetRetainAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -743,7 +743,7 @@
   }
 
   public void testEntrySetClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -765,10 +765,10 @@
   }
 
   public void testEntrySetAddAndAddAll() {
-    final Map<K, V> map = makeEitherMap();
+    Map<K, V> map = makeEitherMap();
 
     Set<Entry<K, V>> entrySet = map.entrySet();
-    final Entry<K, V> entryToAdd = mapEntry(null, null);
+    Entry<K, V> entryToAdd = mapEntry(null, null);
     try {
       entrySet.add(entryToAdd);
       fail("Expected UnsupportedOperationException or NullPointerException.");
@@ -793,8 +793,8 @@
       return;
     }
 
-    final Map<K, V> map;
-    final V valueToSet;
+    Map<K, V> map;
+    V valueToSet;
     try {
       map = makePopulatedMap();
       valueToSet = getValueNotInPopulatedMap();
@@ -804,8 +804,8 @@
 
     Set<Entry<K, V>> entrySet = map.entrySet();
     Entry<K, V> entry = entrySet.iterator().next();
-    final V oldValue = entry.getValue();
-    final V returnedValue = entry.setValue(valueToSet);
+    V oldValue = entry.getValue();
+    V returnedValue = entry.setValue(valueToSet);
     assertEquals(oldValue, returnedValue);
     assertTrue(entrySet.contains(mapEntry(entry.getKey(), valueToSet)));
     assertEquals(valueToSet, map.get(entry.getKey()));
@@ -819,7 +819,7 @@
       return;
     }
 
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -828,8 +828,8 @@
 
     Set<Entry<K, V>> entrySet = map.entrySet();
     Entry<K, V> entry = entrySet.iterator().next();
-    final V oldValue = entry.getValue();
-    final V returnedValue = entry.setValue(oldValue);
+    V oldValue = entry.getValue();
+    V returnedValue = entry.setValue(oldValue);
     assertEquals(oldValue, returnedValue);
     assertTrue(entrySet.contains(mapEntry(entry.getKey(), oldValue)));
     assertEquals(oldValue, map.get(entry.getKey()));
@@ -837,15 +837,16 @@
   }
 
   public void testEqualsForEqualMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
 
-    assertEquals(map, map);
-    assertEquals(makePopulatedMap(), map);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(map.equals(map));
+    assertTrue(makePopulatedMap().equals(map));
     assertFalse(map.equals(Collections.emptyMap()));
     // no-inspection ObjectEqualsNull
     assertFalse(map.equals(null));
@@ -856,8 +857,8 @@
       return;
     }
 
-    final Map<K, V> map;
-    final Map<K, V> largerMap;
+    Map<K, V> map;
+    Map<K, V> largerMap;
     try {
       map = makePopulatedMap();
       largerMap = makePopulatedMap();
@@ -874,8 +875,8 @@
       return;
     }
 
-    final Map<K, V> map;
-    final Map<K, V> smallerMap;
+    Map<K, V> map;
+    Map<K, V> smallerMap;
     try {
       map = makePopulatedMap();
       smallerMap = makePopulatedMap();
@@ -888,15 +889,16 @@
   }
 
   public void testEqualsForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
 
-    assertEquals(map, map);
-    assertEquals(makeEmptyMap(), map);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(map.equals(map));
+    assertTrue(makeEmptyMap().equals(map));
     assertEquals(Collections.emptyMap(), map);
     assertFalse(map.equals(Collections.emptySet()));
     // noinspection ObjectEqualsNull
@@ -904,7 +906,7 @@
   }
 
   public void testGet() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -925,7 +927,7 @@
   }
 
   public void testGetForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     K unmappedKey = null;
     try {
       map = makeEmptyMap();
@@ -954,7 +956,7 @@
   }
 
   public void testHashCode() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -964,7 +966,7 @@
   }
 
   public void testHashCodeForEmptyMap() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -974,9 +976,9 @@
   }
 
   public void testPutNewKey() {
-    final Map<K, V> map = makeEitherMap();
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map = makeEitherMap();
+    K keyToPut;
+    V valueToPut;
     try {
       keyToPut = getKeyNotInPopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
@@ -1002,9 +1004,9 @@
   }
 
   public void testPutExistingKey() {
-    final Map<K, V> map;
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map;
+    K keyToPut;
+    V valueToPut;
     try {
       map = makePopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
@@ -1033,16 +1035,16 @@
     if (!supportsPut) {
       return;
     }
-    final Map<K, V> map = makeEitherMap();
-    final V valueToPut;
+    Map<K, V> map = makeEitherMap();
+    V valueToPut;
     try {
       valueToPut = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
     if (allowsNullKeys) {
-      final V oldValue = map.get(null);
-      final V returnedValue = map.put(null, valueToPut);
+      V oldValue = map.get(null);
+      V returnedValue = map.put(null, valueToPut);
       assertEquals(oldValue, returnedValue);
       assertEquals(valueToPut, map.get(null));
       assertTrue(map.containsKey(null));
@@ -1061,8 +1063,8 @@
     if (!supportsPut) {
       return;
     }
-    final Map<K, V> map = makeEitherMap();
-    final K keyToPut;
+    Map<K, V> map = makeEitherMap();
+    K keyToPut;
     try {
       keyToPut = getKeyNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1070,8 +1072,8 @@
     }
     if (allowsNullValues) {
       int initialSize = map.size();
-      final V oldValue = map.get(keyToPut);
-      final V returnedValue = map.put(keyToPut, null);
+      V oldValue = map.get(keyToPut);
+      V returnedValue = map.put(keyToPut, null);
       assertEquals(oldValue, returnedValue);
       assertNull(map.get(keyToPut));
       assertTrue(map.containsKey(keyToPut));
@@ -1091,8 +1093,8 @@
     if (!supportsPut) {
       return;
     }
-    final Map<K, V> map;
-    final K keyToPut;
+    Map<K, V> map;
+    K keyToPut;
     try {
       map = makePopulatedMap();
       keyToPut = map.keySet().iterator().next();
@@ -1101,8 +1103,8 @@
     }
     if (allowsNullValues) {
       int initialSize = map.size();
-      final V oldValue = map.get(keyToPut);
-      final V returnedValue = map.put(keyToPut, null);
+      V oldValue = map.get(keyToPut);
+      V returnedValue = map.put(keyToPut, null);
       assertEquals(oldValue, returnedValue);
       assertNull(map.get(keyToPut));
       assertTrue(map.containsKey(keyToPut));
@@ -1119,16 +1121,16 @@
   }
 
   public void testPutAllNewKey() {
-    final Map<K, V> map = makeEitherMap();
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map = makeEitherMap();
+    K keyToPut;
+    V valueToPut;
     try {
       keyToPut = getKeyNotInPopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
       return;
     }
-    final Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
+    Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
     if (supportsPut) {
       int initialSize = map.size();
       map.putAll(mapToPut);
@@ -1147,9 +1149,9 @@
   }
 
   public void testPutAllExistingKey() {
-    final Map<K, V> map;
-    final K keyToPut;
-    final V valueToPut;
+    Map<K, V> map;
+    K keyToPut;
+    V valueToPut;
     try {
       map = makePopulatedMap();
       valueToPut = getValueNotInPopulatedMap();
@@ -1157,7 +1159,7 @@
       return;
     }
     keyToPut = map.keySet().iterator().next();
-    final Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
+    Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut);
     int initialSize = map.size();
     if (supportsPut) {
       map.putAll(mapToPut);
@@ -1176,8 +1178,8 @@
   }
 
   public void testRemove() {
-    final Map<K, V> map;
-    final K keyToRemove;
+    Map<K, V> map;
+    K keyToRemove;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1202,8 +1204,8 @@
   }
 
   public void testRemoveMissingKey() {
-    final Map<K, V> map;
-    final K keyToRemove;
+    Map<K, V> map;
+    K keyToRemove;
     try {
       map = makePopulatedMap();
       keyToRemove = getKeyNotInPopulatedMap();
@@ -1229,7 +1231,7 @@
   }
 
   public void testKeySetRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1254,7 +1256,7 @@
   }
 
   public void testKeySetRemoveAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1279,7 +1281,7 @@
   }
 
   public void testKeySetRetainAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1303,7 +1305,7 @@
   }
 
   public void testKeySetClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEitherMap();
     } catch (UnsupportedOperationException e) {
@@ -1325,7 +1327,7 @@
   }
 
   public void testKeySetRemoveAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1351,7 +1353,7 @@
   }
 
   public void testKeySetRetainAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1377,8 +1379,8 @@
   }
 
   public void testValues() {
-    final Map<K, V> map;
-    final Collection<V> valueCollection;
+    Map<K, V> map;
+    Collection<V> valueCollection;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1387,7 +1389,7 @@
     assertInvariants(map);
 
     valueCollection = map.values();
-    final V unmappedValue;
+    V unmappedValue;
     try {
       unmappedValue = getValueNotInPopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1399,7 +1401,7 @@
   }
 
   public void testValuesIteratorRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1434,7 +1436,7 @@
   }
 
   public void testValuesRemove() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1460,8 +1462,8 @@
   }
 
   public void testValuesRemoveMissing() {
-    final Map<K, V> map;
-    final V valueToRemove;
+    Map<K, V> map;
+    V valueToRemove;
     try {
       map = makeEitherMap();
       valueToRemove = getValueNotInPopulatedMap();
@@ -1485,7 +1487,7 @@
   }
 
   public void testValuesRemoveAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1513,7 +1515,7 @@
   }
 
   public void testValuesRemoveAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1539,7 +1541,7 @@
   }
 
   public void testValuesRetainAll() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -1567,7 +1569,7 @@
   }
 
   public void testValuesRetainAllNullFromEmpty() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makeEmptyMap();
     } catch (UnsupportedOperationException e) {
@@ -1593,7 +1595,7 @@
   }
 
   public void testValuesClear() {
-    final Map<K, V> map;
+    Map<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
diff --git a/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java b/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java
index a6ec93d..2adf072 100644
--- a/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java
+++ b/guava-testlib/src/com/google/common/collect/testing/MinimalCollection.java
@@ -33,12 +33,12 @@
   // TODO: expose allow nulls parameter?
 
   public static <E> MinimalCollection<E> of(E... contents) {
-    return new MinimalCollection<E>(Object.class, true, contents);
+    return new MinimalCollection<>(Object.class, true, contents);
   }
 
   // TODO: use this
   public static <E> MinimalCollection<E> ofClassAndContents(Class<? super E> type, E... contents) {
-    return new MinimalCollection<E>(type, true, contents);
+    return new MinimalCollection<>(type, true, contents);
   }
 
   private final E[] contents;
diff --git a/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java b/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java
index c151c15..15d48db 100644
--- a/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java
+++ b/guava-testlib/src/com/google/common/collect/testing/MinimalIterable.java
@@ -51,7 +51,7 @@
   /** Returns an iterable whose iterator returns the given elements in order. */
   public static <E> MinimalIterable<E> of(E... elements) {
     // Make sure to get an unmodifiable iterator
-    return new MinimalIterable<E>(Arrays.asList(elements).iterator());
+    return new MinimalIterable<>(Arrays.asList(elements).iterator());
   }
 
   /**
@@ -59,7 +59,7 @@
    * out of the source collection at the time this method is called.
    */
   @SuppressWarnings("unchecked") // Es come in, Es go out
-  public static <E> MinimalIterable<E> from(final Collection<E> elements) {
+  public static <E> MinimalIterable<E> from(Collection<E> elements) {
     return (MinimalIterable) of(elements.toArray());
   }
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java b/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java
index 988dd3f..9a87d24 100644
--- a/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java
+++ b/guava-testlib/src/com/google/common/collect/testing/MinimalSet.java
@@ -45,13 +45,13 @@
 
   public static <E> MinimalSet<E> ofClassAndContents(
       Class<? super E> type, E[] emptyArrayForContents, Iterable<? extends E> contents) {
-    List<E> setContents = new ArrayList<E>();
+    List<E> setContents = new ArrayList<>();
     for (E e : contents) {
       if (!setContents.contains(e)) {
         setContents.add(e);
       }
     }
-    return new MinimalSet<E>(type, setContents.toArray(emptyArrayForContents));
+    return new MinimalSet<>(type, setContents.toArray(emptyArrayForContents));
   }
 
   private MinimalSet(Class<? super E> type, E... contents) {
diff --git a/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java
index 77a1984..0e1a229 100644
--- a/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/NavigableMapTestSuiteBuilder.java
@@ -116,10 +116,10 @@
 
   /** Create a suite whose maps are descending views of other maps. */
   private TestSuite createDescendingSuite(
-      final FeatureSpecificTestSuiteBuilder<
+      FeatureSpecificTestSuiteBuilder<
               ?, ? extends OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>>>
           parentBuilder) {
-    final TestSortedMapGenerator<K, V> delegate =
+    TestSortedMapGenerator<K, V> delegate =
         (TestSortedMapGenerator<K, V>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>();
diff --git a/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java
index 38eb56e..4c86ab4 100644
--- a/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/NavigableSetTestSuiteBuilder.java
@@ -40,7 +40,7 @@
 @GwtIncompatible
 public final class NavigableSetTestSuiteBuilder<E> extends SortedSetTestSuiteBuilder<E> {
   public static <E> NavigableSetTestSuiteBuilder<E> using(TestSortedSetGenerator<E> generator) {
-    NavigableSetTestSuiteBuilder<E> builder = new NavigableSetTestSuiteBuilder<E>();
+    NavigableSetTestSuiteBuilder<E> builder = new NavigableSetTestSuiteBuilder<>();
     builder.usingGenerator(generator);
     return builder;
   }
@@ -99,10 +99,9 @@
 
   /** Create a suite whose maps are descending views of other maps. */
   private TestSuite createDescendingSuite(
-      final FeatureSpecificTestSuiteBuilder<
-              ?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
+      FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
           parentBuilder) {
-    final TestSetGenerator<E> delegate =
+    TestSetGenerator<E> delegate =
         (TestSetGenerator<E>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>();
@@ -124,7 +123,7 @@
 
               @Override
               public Iterable<E> order(List<E> insertionOrder) {
-                List<E> list = new ArrayList<E>();
+                List<E> list = new ArrayList<>();
                 for (E e : delegate.order(insertionOrder)) {
                   list.add(e);
                 }
diff --git a/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java b/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java
index 1b8924c..1ff3fac 100644
--- a/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java
+++ b/guava-testlib/src/com/google/common/collect/testing/OneSizeGenerator.java
@@ -70,7 +70,7 @@
     @SuppressWarnings("unchecked")
     List<E> allSampleElements =
         Arrays.asList(samples.e0(), samples.e1(), samples.e2(), samples.e3(), samples.e4());
-    return new ArrayList<E>(allSampleElements.subList(0, howMany));
+    return new ArrayList<>(allSampleElements.subList(0, howMany));
   }
 
   @Override
diff --git a/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java b/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java
index 28d6f79..923f56f 100644
--- a/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java
+++ b/guava-testlib/src/com/google/common/collect/testing/ReserializingTestCollectionGenerator.java
@@ -42,7 +42,7 @@
 
   public static <E> ReserializingTestCollectionGenerator<E> newInstance(
       TestCollectionGenerator<E> delegate) {
-    return new ReserializingTestCollectionGenerator<E>(delegate);
+    return new ReserializingTestCollectionGenerator<>(delegate);
   }
 
   @Override
diff --git a/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java b/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java
index c92a3ff..555440a 100644
--- a/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java
+++ b/guava-testlib/src/com/google/common/collect/testing/ReserializingTestSetGenerator.java
@@ -35,7 +35,7 @@
   }
 
   public static <E> TestSetGenerator<E> newInstance(TestSetGenerator<E> delegate) {
-    return new ReserializingTestSetGenerator<E>(delegate);
+    return new ReserializingTestSetGenerator<>(delegate);
   }
 
   @Override
diff --git a/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java b/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java
index 8ed4810..91d9fd9 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SafeTreeSet.java
@@ -117,7 +117,7 @@
 
   @Override
   public NavigableSet<E> descendingSet() {
-    return new SafeTreeSet<E>(delegate.descendingSet());
+    return new SafeTreeSet<>(delegate.descendingSet());
   }
 
   @Override
@@ -137,7 +137,7 @@
 
   @Override
   public NavigableSet<E> headSet(E toElement, boolean inclusive) {
-    return new SafeTreeSet<E>(delegate.headSet(checkValid(toElement), inclusive));
+    return new SafeTreeSet<>(delegate.headSet(checkValid(toElement), inclusive));
   }
 
   @Override
@@ -198,7 +198,7 @@
   @Override
   public NavigableSet<E> subSet(
       E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
-    return new SafeTreeSet<E>(
+    return new SafeTreeSet<>(
         delegate.subSet(
             checkValid(fromElement), fromInclusive, checkValid(toElement), toInclusive));
   }
@@ -215,7 +215,7 @@
 
   @Override
   public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
-    return new SafeTreeSet<E>(delegate.tailSet(checkValid(fromElement), inclusive));
+    return new SafeTreeSet<>(delegate.tailSet(checkValid(fromElement), inclusive));
   }
 
   @Override
diff --git a/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java b/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java
index 829c4cc..03266ab 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SortedMapInterfaceTest.java
@@ -56,7 +56,7 @@
   }
 
   public void testTailMapWriteThrough() {
-    final SortedMap<K, V> map;
+    SortedMap<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -82,7 +82,7 @@
   }
 
   public void testTailMapRemoveThrough() {
-    final SortedMap<K, V> map;
+    SortedMap<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
@@ -105,7 +105,7 @@
   }
 
   public void testTailMapClearThrough() {
-    final SortedMap<K, V> map;
+    SortedMap<K, V> map;
     try {
       map = makePopulatedMap();
     } catch (UnsupportedOperationException e) {
diff --git a/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
index aa1d6d5..7944aaa 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
@@ -105,12 +105,12 @@
    * these extreme values rather than relying on their regular sort ordering.
    */
   final TestSuite createSubmapSuite(
-      final FeatureSpecificTestSuiteBuilder<
+      FeatureSpecificTestSuiteBuilder<
               ?, ? extends OneSizeTestContainerGenerator<Map<K, V>, Entry<K, V>>>
           parentBuilder,
-      final Bound from,
-      final Bound to) {
-    final TestSortedMapGenerator<K, V> delegate =
+      Bound from,
+      Bound to) {
+    TestSortedMapGenerator<K, V> delegate =
         (TestSortedMapGenerator<K, V>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>();
diff --git a/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
index 5092661..2835769 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
@@ -34,7 +34,7 @@
 @GwtIncompatible
 public class SortedSetTestSuiteBuilder<E> extends SetTestSuiteBuilder<E> {
   public static <E> SortedSetTestSuiteBuilder<E> using(TestSortedSetGenerator<E> generator) {
-    SortedSetTestSuiteBuilder<E> builder = new SortedSetTestSuiteBuilder<E>();
+    SortedSetTestSuiteBuilder<E> builder = new SortedSetTestSuiteBuilder<>();
     builder.usingGenerator(generator);
     return builder;
   }
@@ -78,12 +78,11 @@
    * these extreme values rather than relying on their regular sort ordering.
    */
   final TestSuite createSubsetSuite(
-      final FeatureSpecificTestSuiteBuilder<
-              ?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
+      FeatureSpecificTestSuiteBuilder<?, ? extends OneSizeTestContainerGenerator<Collection<E>, E>>
           parentBuilder,
-      final Bound from,
-      final Bound to) {
-    final TestSortedSetGenerator<E> delegate =
+      Bound from,
+      Bound to) {
+    TestSortedSetGenerator<E> delegate =
         (TestSortedSetGenerator<E>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
     List<Feature<?>> features = new ArrayList<>(parentBuilder.getFeatures());
diff --git a/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java b/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java
index 08c771e..9fad6e3 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java
@@ -20,6 +20,7 @@
 import static com.google.common.collect.testing.Helpers.assertEqualIgnoringOrder;
 import static com.google.common.collect.testing.Helpers.assertEqualInOrder;
 import static com.google.common.collect.testing.Platform.format;
+import static java.util.Comparator.naturalOrder;
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
@@ -296,7 +297,7 @@
         if ((characteristics & Spliterator.SORTED) != 0) {
           Comparator<? super E> comparator = spliterator.getComparator();
           if (comparator == null) {
-            comparator = (Comparator) Comparator.naturalOrder();
+            comparator = (Comparator) naturalOrder();
           }
           assertTrue(Ordering.from(comparator).isOrdered(resultsForStrategy));
         }
diff --git a/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java b/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java
index 95cbc0b..2d11a08 100644
--- a/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java
+++ b/guava-testlib/src/com/google/common/collect/testing/features/FeatureUtil.java
@@ -139,12 +139,12 @@
    */
   static TesterRequirements buildTesterRequirements(Class<?> testerClass)
       throws ConflictingRequirementsException {
-    final TesterRequirements declaredRequirements = buildDeclaredTesterRequirements(testerClass);
+    TesterRequirements declaredRequirements = buildDeclaredTesterRequirements(testerClass);
     Class<?> baseClass = testerClass.getSuperclass();
     if (baseClass == null) {
       return declaredRequirements;
     } else {
-      final TesterRequirements clonedBaseRequirements =
+      TesterRequirements clonedBaseRequirements =
           new TesterRequirements(getTesterRequirements(baseClass));
       return incorporateRequirements(clonedBaseRequirements, declaredRequirements, testerClass);
     }
@@ -176,8 +176,8 @@
   private static TesterRequirements buildTesterRequirements(Annotation testerAnnotation)
       throws ConflictingRequirementsException {
     Class<? extends Annotation> annotationClass = testerAnnotation.annotationType();
-    final Feature<?>[] presentFeatures;
-    final Feature<?>[] absentFeatures;
+    Feature<?>[] presentFeatures;
+    Feature<?>[] absentFeatures;
     try {
       presentFeatures = (Feature[]) annotationClass.getMethod("value").invoke(testerAnnotation);
       absentFeatures = (Feature[]) annotationClass.getMethod("absent").invoke(testerAnnotation);
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java b/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java
index 7b7801d..7f649e7 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/AbstractMultimapTester.java
@@ -48,8 +48,8 @@
   /** @return an array of the proper size with {@code null} as the key of the middle element. */
   protected Entry<K, V>[] createArrayWithNullKey() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullKeyLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullKeyLocation];
+    int nullKeyLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullKeyLocation];
     array[nullKeyLocation] = Helpers.mapEntry(null, oldEntry.getValue());
     return array;
   }
@@ -57,8 +57,8 @@
   /** @return an array of the proper size with {@code null} as the value of the middle element. */
   protected Entry<K, V>[] createArrayWithNullValue() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullValueLocation = getNullLocation();
-    final Entry<K, V> oldEntry = array[nullValueLocation];
+    int nullValueLocation = getNullLocation();
+    Entry<K, V> oldEntry = array[nullValueLocation];
     array[nullValueLocation] = Helpers.mapEntry(oldEntry.getKey(), null);
     return array;
   }
@@ -69,7 +69,7 @@
    */
   protected Entry<K, V>[] createArrayWithNullKeyAndValue() {
     Entry<K, V>[] array = createSamplesArray();
-    final int nullValueLocation = getNullLocation();
+    int nullValueLocation = getNullLocation();
     array[nullValueLocation] = Helpers.mapEntry(null, null);
     return array;
   }
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java b/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java
index bbeefd2..35579a0 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/DerivedGoogleCollectionGenerators.java
@@ -159,9 +159,9 @@
     public BiMapValueSetGenerator(
         OneSizeTestContainerGenerator<BiMap<K, V>, Entry<K, V>> mapGenerator) {
       this.mapGenerator = mapGenerator;
-      final SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
+      SampleElements<Entry<K, V>> mapSamples = this.mapGenerator.samples();
       this.samples =
-          new SampleElements<V>(
+          new SampleElements<>(
               mapSamples.e0().getValue(),
               mapSamples.e1().getValue(),
               mapSamples.e2().getValue(),
@@ -194,7 +194,7 @@
 
     @Override
     public V[] createArray(int length) {
-      final V[] vs =
+      V[] vs =
           ((TestBiMapGenerator<K, V>) mapGenerator.getInnerGenerator()).createValueArray(length);
       return vs;
     }
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java b/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
index bb84ea1..35063e8 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/MapGenerators.java
@@ -54,7 +54,7 @@
       for (Entry<String, String> entry : entries) {
         builder.put(entry.getKey(), entry.getValue());
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
   }
 
@@ -86,7 +86,7 @@
       for (UnhashableObject value : elements) {
         builder.put(key++, value);
       }
-      return builder.build().values();
+      return builder.buildOrThrow().values();
     }
   }
 
@@ -97,7 +97,7 @@
       for (int i = 0; i < elements.length; i++) {
         builder.put(elements[i], i);
       }
-      return builder.build().keySet().asList();
+      return builder.buildOrThrow().keySet().asList();
     }
   }
 
@@ -108,7 +108,7 @@
       for (int i = 0; i < elements.length; i++) {
         builder.put(i, elements[i]);
       }
-      return builder.build().values().asList();
+      return builder.buildOrThrow().values().asList();
     }
   }
 
@@ -144,7 +144,7 @@
         Entry<String, Integer> entry = (Entry<String, Integer>) o;
         builder.put(entry);
       }
-      return builder.build().entrySet().asList();
+      return builder.buildOrThrow().entrySet().asList();
     }
   }
 
@@ -210,7 +210,7 @@
         Integer value = Iterables.getOnlyElement(entry.getValue());
         builder.put(entry.getKey(), value);
       }
-      return builder.build().asMultimap().asMap();
+      return builder.buildOrThrow().asMultimap().asMap();
     }
 
     @Override
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java b/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java
index b65cd96..ce8e283 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/MultisetNavigationTester.java
@@ -82,7 +82,7 @@
   @SuppressWarnings("unchecked")
   // Needed to stop Eclipse whining
   private void resetWithHole() {
-    List<E> container = new ArrayList<E>();
+    List<E> container = new ArrayList<>();
     container.addAll(Collections.nCopies(a.getCount(), a.getElement()));
     container.addAll(Collections.nCopies(c.getCount(), c.getElement()));
     super.resetContainer(getSubjectGenerator().create(container.toArray()));
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java b/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java
index 49187dd..6e79957 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/SetMultimapAsMapTester.java
@@ -58,7 +58,7 @@
 
   @MapFeature.Require(SUPPORTS_REMOVE)
   public void testAsMapRemoveImplementsSet() {
-    List<K> keys = new ArrayList<K>(multimap().keySet());
+    List<K> keys = new ArrayList<>(multimap().keySet());
     for (K key : keys) {
       resetCollection();
       assertTrue(multimap().asMap().remove(key) instanceof Set);
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
index dafd521..b44494b 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
@@ -56,7 +56,7 @@
 @GwtIncompatible
 public class SortedMultisetTestSuiteBuilder<E> extends MultisetTestSuiteBuilder<E> {
   public static <E> SortedMultisetTestSuiteBuilder<E> using(TestMultisetGenerator<E> generator) {
-    SortedMultisetTestSuiteBuilder<E> result = new SortedMultisetTestSuiteBuilder<E>();
+    SortedMultisetTestSuiteBuilder<E> result = new SortedMultisetTestSuiteBuilder<>();
     result.usingGenerator(generator);
     return result;
   }
@@ -138,8 +138,8 @@
   }
 
   private TestSuite createSubMultisetSuite(
-      SortedMultisetTestSuiteBuilder<E> parentBuilder, final Bound from, final Bound to) {
-    final TestMultisetGenerator<E> delegate =
+      SortedMultisetTestSuiteBuilder<E> parentBuilder, Bound from, Bound to) {
+    TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
     Set<Feature<?>> features = new HashSet<>();
@@ -152,15 +152,15 @@
     }
 
     SortedMultiset<E> emptyMultiset = (SortedMultiset<E>) delegate.create();
-    final Comparator<? super E> comparator = emptyMultiset.comparator();
+    Comparator<? super E> comparator = emptyMultiset.comparator();
     SampleElements<E> samples = delegate.samples();
     @SuppressWarnings("unchecked")
     List<E> samplesList =
         Arrays.asList(samples.e0(), samples.e1(), samples.e2(), samples.e3(), samples.e4());
 
     Collections.sort(samplesList, comparator);
-    final E firstInclusive = samplesList.get(0);
-    final E lastInclusive = samplesList.get(samplesList.size() - 1);
+    E firstInclusive = samplesList.get(0);
+    E lastInclusive = samplesList.get(samplesList.size() - 1);
 
     return SortedMultisetTestSuiteBuilder.using(
             new ForwardingTestMultisetGenerator<E>(delegate) {
@@ -187,7 +187,7 @@
                 }
 
                 // the regular values should be visible after filtering
-                List<E> allEntries = new ArrayList<E>();
+                List<E> allEntries = new ArrayList<>();
                 allEntries.addAll(extremeValues);
                 allEntries.addAll(normalValues);
                 SortedMultiset<E> multiset =
@@ -234,7 +234,7 @@
   }
 
   private TestSuite createDescendingSuite(SortedMultisetTestSuiteBuilder<E> parentBuilder) {
-    final TestMultisetGenerator<E> delegate =
+    TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
     Set<Feature<?>> features = new HashSet<>();
@@ -263,7 +263,7 @@
   }
 
   private TestSuite createReserializedSuite(SortedMultisetTestSuiteBuilder<E> parentBuilder) {
-    final TestMultisetGenerator<E> delegate =
+    TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
     Set<Feature<?>> features = new HashSet<>(parentBuilder.getFeatures());
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java b/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java
index 1c00f09..e95b74f 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/SortedSetMultimapAsMapTester.java
@@ -52,7 +52,7 @@
 
   @MapFeature.Require(SUPPORTS_REMOVE)
   public void testAsMapRemoveImplementsSortedSet() {
-    List<K> keys = new ArrayList<K>(multimap().keySet());
+    List<K> keys = new ArrayList<>(multimap().keySet());
     for (K key : keys) {
       resetCollection();
       SortedSet<V> valueSet = (SortedSet<V>) multimap().asMap().remove(key);
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java b/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java
index 005746f..40b2c85 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/UnmodifiableCollectionTests.java
@@ -201,7 +201,7 @@
    * @param sampleElement an element of the same type as that contained by {@code multiset}. {@code
    *     multiset} may or may not have {@code sampleElement} as a member.
    */
-  public static <E> void assertMultisetIsUnmodifiable(Multiset<E> multiset, final E sampleElement) {
+  public static <E> void assertMultisetIsUnmodifiable(Multiset<E> multiset, E sampleElement) {
     Multiset<E> copy = LinkedHashMultiset.create(multiset);
     assertCollectionsAreEquivalent(multiset, copy);
 
@@ -264,7 +264,7 @@
    *     multimap} may or may not have {@code sampleValue} as a key.
    */
   public static <K, V> void assertMultimapIsUnmodifiable(
-      Multimap<K, V> multimap, final K sampleKey, final V sampleValue) {
+      Multimap<K, V> multimap, K sampleKey, V sampleValue) {
     List<Entry<K, V>> originalEntries =
         Collections.unmodifiableList(Lists.newArrayList(multimap.entries()));
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionForEachTester.java b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionForEachTester.java
index d1a36af..af8490d 100644
--- a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionForEachTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionForEachTester.java
@@ -38,14 +38,14 @@
 public class CollectionForEachTester<E> extends AbstractCollectionTester<E> {
   @CollectionFeature.Require(absent = KNOWN_ORDER)
   public void testForEachUnknownOrder() {
-    List<E> elements = new ArrayList<E>();
+    List<E> elements = new ArrayList<>();
     collection.forEach(elements::add);
     Helpers.assertEqualIgnoringOrder(Arrays.asList(createSamplesArray()), elements);
   }
 
   @CollectionFeature.Require(KNOWN_ORDER)
   public void testForEachKnownOrder() {
-    List<E> elements = new ArrayList<E>();
+    List<E> elements = new ArrayList<>();
     collection.forEach(elements::add);
     List<E> expected = Helpers.copyToList(getOrderedElements());
     assertEquals("Different ordered iteration", expected, elements);
diff --git a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
index b170497..1699fe1 100644
--- a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
@@ -51,7 +51,7 @@
 @Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
 public class CollectionIteratorTester<E> extends AbstractCollectionTester<E> {
   public void testIterator() {
-    List<E> iteratorElements = new ArrayList<E>();
+    List<E> iteratorElements = new ArrayList<>();
     for (E element : collection) { // uses iterator()
       iteratorElements.add(element);
     }
@@ -60,7 +60,7 @@
 
   @CollectionFeature.Require(KNOWN_ORDER)
   public void testIterationOrdering() {
-    List<E> iteratorElements = new ArrayList<E>();
+    List<E> iteratorElements = new ArrayList<>();
     for (E element : collection) { // uses iterator()
       iteratorElements.add(element);
     }
@@ -72,7 +72,7 @@
   @CollectionSize.Require(absent = ZERO)
   public void testIterator_nullElement() {
     initCollectionWithNullElement();
-    List<E> iteratorElements = new ArrayList<E>();
+    List<E> iteratorElements = new ArrayList<>();
     for (E element : collection) { // uses iterator()
       iteratorElements.add(element);
     }
diff --git a/guava-testlib/src/com/google/common/collect/testing/testers/MapReplaceAllTester.java b/guava-testlib/src/com/google/common/collect/testing/testers/MapReplaceAllTester.java
index 4808f54..eb37a60 100644
--- a/guava-testlib/src/com/google/common/collect/testing/testers/MapReplaceAllTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/testers/MapReplaceAllTester.java
@@ -42,11 +42,11 @@
 @Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
 public class MapReplaceAllTester<K, V> extends AbstractMapTester<K, V> {
   private SampleElements<K> keys() {
-    return new SampleElements<K>(k0(), k1(), k2(), k3(), k4());
+    return new SampleElements<>(k0(), k1(), k2(), k3(), k4());
   }
 
   private SampleElements<V> values() {
-    return new SampleElements<V>(v0(), v1(), v2(), v3(), v4());
+    return new SampleElements<>(v0(), v1(), v2(), v3(), v4());
   }
 
   @MapFeature.Require(SUPPORTS_PUT)
diff --git a/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java b/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java
index 3901616..8b056b4 100644
--- a/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/testers/NavigableSetNavigationTester.java
@@ -218,7 +218,7 @@
 
   @CollectionSize.Require(SEVERAL)
   public void testDescendingNavigation() {
-    List<E> descending = new ArrayList<E>();
+    List<E> descending = new ArrayList<>();
     for (Iterator<E> i = navigableSet.descendingIterator(); i.hasNext(); ) {
       descending.add(i.next());
     }
diff --git a/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java b/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java
index 3920afe..31ac201 100644
--- a/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java
+++ b/guava-testlib/src/com/google/common/escape/testing/EscaperAsserts.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.escape.Escapers.computeReplacement;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.CharEscaper;
 import com.google.common.escape.Escaper;
@@ -32,7 +31,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 public final class EscaperAsserts {
   private EscaperAsserts() {}
diff --git a/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java b/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java
index 962b15f..1e31bbf 100644
--- a/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java
+++ b/guava-testlib/src/com/google/common/testing/AbstractPackageSanityTests.java
@@ -116,12 +116,7 @@
    * @since 19.0
    */
   public static final Predicate<Class<?>> UNDERSCORE_IN_NAME =
-      new Predicate<Class<?>>() {
-        @Override
-        public boolean apply(Class<?> c) {
-          return c.getSimpleName().contains("_");
-        }
-      };
+      (Class<?> c) -> c.getSimpleName().contains("_");
 
   /* The names of the expected method that tests null checks. */
   private static final ImmutableList<String> NULL_TEST_METHOD_NAMES =
@@ -152,12 +147,7 @@
   private final ClassSanityTester tester = new ClassSanityTester();
   private Visibility visibility = Visibility.PACKAGE;
   private Predicate<Class<?>> classFilter =
-      new Predicate<Class<?>>() {
-        @Override
-        public boolean apply(Class<?> cls) {
-          return visibility.isVisible(cls.getModifiers());
-        }
-      };
+      (Class<?> cls) -> visibility.isVisible(cls.getModifiers());
 
   /**
    * Restricts the sanity tests for public API only. By default, package-private API are also
@@ -415,8 +405,8 @@
 
   abstract static class Chopper {
 
-    final Chopper or(final Chopper you) {
-      final Chopper i = this;
+    final Chopper or(Chopper you) {
+      Chopper i = this;
       return new Chopper() {
         @Override
         Optional<String> chop(String str) {
@@ -427,7 +417,7 @@
 
     abstract Optional<String> chop(String str);
 
-    static Chopper suffix(final String suffix) {
+    static Chopper suffix(String suffix) {
       return new Chopper() {
         @Override
         Optional<String> chop(String str) {
diff --git a/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java b/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
index f38c52e..1325d7f 100644
--- a/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
+++ b/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Charsets;
@@ -74,6 +73,7 @@
 import com.google.common.primitives.Primitives;
 import com.google.common.primitives.UnsignedInteger;
 import com.google.common.primitives.UnsignedLong;
+import com.google.errorprone.annotations.Keep;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -171,7 +171,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @GwtIncompatible
 public final class ArbitraryInstances {
 
@@ -439,6 +438,7 @@
     }
 
     public static final class DeterministicRandom extends Random {
+      @Keep
       public DeterministicRandom() {
         super(0);
       }
diff --git a/guava-testlib/src/com/google/common/testing/CollectorTester.java b/guava-testlib/src/com/google/common/testing/CollectorTester.java
index 9478a1f..ab6e544 100644
--- a/guava-testlib/src/com/google/common/testing/CollectorTester.java
+++ b/guava-testlib/src/com/google/common/testing/CollectorTester.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static junit.framework.Assert.assertTrue;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -46,7 +45,6 @@
  * @author Louis Wasserman
  * @since 21.0
  */
-@Beta
 @GwtCompatible
 public final class CollectorTester<T, A, R> {
   /**
diff --git a/guava-testlib/src/com/google/common/testing/EqualsTester.java b/guava-testlib/src/com/google/common/testing/EqualsTester.java
index 2c8e08b..9c93c9a 100644
--- a/guava-testlib/src/com/google/common/testing/EqualsTester.java
+++ b/guava-testlib/src/com/google/common/testing/EqualsTester.java
@@ -20,7 +20,6 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Equivalence;
 import com.google.common.collect.ImmutableList;
@@ -74,7 +73,6 @@
  * @author Jige Yu
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public final class EqualsTester {
   private static final int REPETITIONS = 3;
@@ -122,7 +120,7 @@
       assertTrue(
           item + " must not be Object#equals to an arbitrary object of another class",
           !item.equals(NotAnInstance.EQUAL_TO_NOTHING));
-      assertEquals(item + " must be Object#equals to itself", item, item);
+      assertTrue(item + " must be Object#equals to itself", item.equals(item));
       assertEquals(
           "the Object#hashCode of " + item + " must be consistent",
           item.hashCode(),
diff --git a/guava-testlib/src/com/google/common/testing/EquivalenceTester.java b/guava-testlib/src/com/google/common/testing/EquivalenceTester.java
index ce1dc98..8de2625 100644
--- a/guava-testlib/src/com/google/common/testing/EquivalenceTester.java
+++ b/guava-testlib/src/com/google/common/testing/EquivalenceTester.java
@@ -20,7 +20,6 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertTrue;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Equivalence;
 import com.google.common.collect.ImmutableList;
@@ -49,7 +48,6 @@
  * @author Gregory Kick
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public final class EquivalenceTester<T> {
   private static final int REPETITIONS = 3;
@@ -60,12 +58,11 @@
 
   private EquivalenceTester(Equivalence<? super T> equivalence) {
     this.equivalence = checkNotNull(equivalence);
-    this.delegate =
-        new RelationshipTester<T>(equivalence, "equivalent", "hash", new ItemReporter());
+    this.delegate = new RelationshipTester<>(equivalence, "equivalent", "hash", new ItemReporter());
   }
 
   public static <T> EquivalenceTester<T> of(Equivalence<? super T> equivalence) {
-    return new EquivalenceTester<T>(equivalence);
+    return new EquivalenceTester<>(equivalence);
   }
 
   /**
diff --git a/guava-testlib/src/com/google/common/testing/FakeTicker.java b/guava-testlib/src/com/google/common/testing/FakeTicker.java
index cc18e65..d18e6bc 100644
--- a/guava-testlib/src/com/google/common/testing/FakeTicker.java
+++ b/guava-testlib/src/com/google/common/testing/FakeTicker.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Ticker;
@@ -36,7 +35,6 @@
  * @author Jige Yu
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public class FakeTicker extends Ticker {
 
diff --git a/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java b/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java
index 4ee461e..605d3a0 100644
--- a/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java
+++ b/guava-testlib/src/com/google/common/testing/ForwardingWrapperTester.java
@@ -22,7 +22,6 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.fail;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Function;
 import com.google.common.base.Throwables;
@@ -53,7 +52,6 @@
  * @author Ben Yu
  * @since 14.0
  */
-@Beta
 @GwtIncompatible
 public final class ForwardingWrapperTester {
 
@@ -129,7 +127,7 @@
 
   private static <T> void testExceptionPropagation(
       Class<T> interfaceType, Method method, Function<? super T, ? extends T> wrapperFunction) {
-    final RuntimeException exception = new RuntimeException();
+    RuntimeException exception = new RuntimeException();
     T proxy =
         Reflection.newProxy(
             interfaceType,
@@ -175,7 +173,7 @@
 
   private static Object[] getParameterValues(Method method) {
     FreshValueGenerator paramValues = new FreshValueGenerator();
-    final List<Object> passedArgs = Lists.newArrayList();
+    List<Object> passedArgs = Lists.newArrayList();
     for (Class<?> paramType : method.getParameterTypes()) {
       passedArgs.add(paramValues.generateFresh(paramType));
     }
diff --git a/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java b/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
index e34b399..bb51e40 100644
--- a/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
+++ b/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
@@ -141,7 +141,7 @@
         builder.put(method.getReturnType(), method);
       }
     }
-    GENERATORS = builder.build();
+    GENERATORS = builder.buildOrThrow();
   }
 
   private static final ImmutableMap<Class<?>, Method> EMPTY_GENERATORS;
@@ -153,7 +153,7 @@
         builder.put(method.getReturnType(), method);
       }
     }
-    EMPTY_GENERATORS = builder.build();
+    EMPTY_GENERATORS = builder.buildOrThrow();
   }
 
   private final AtomicInteger freshness = new AtomicInteger(1);
diff --git a/guava-testlib/src/com/google/common/testing/GcFinalization.java b/guava-testlib/src/com/google/common/testing/GcFinalization.java
index 015afea..da6aa22 100644
--- a/guava-testlib/src/com/google/common/testing/GcFinalization.java
+++ b/guava-testlib/src/com/google/common/testing/GcFinalization.java
@@ -18,7 +18,6 @@
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.DoNotMock;
 import com.google.j2objc.annotations.J2ObjCIncompatible;
@@ -103,7 +102,6 @@
  * @author Martin Buchholz
  * @since 11.0
  */
-@Beta
 @GwtIncompatible
 @J2ObjCIncompatible // gc
 public final class GcFinalization {
@@ -138,8 +136,8 @@
     if (future.isDone()) {
       return;
     }
-    final long timeoutSeconds = timeoutSeconds();
-    final long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
+    long timeoutSeconds = timeoutSeconds();
+    long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
     do {
       System.runFinalization();
       if (future.isDone()) {
@@ -170,8 +168,8 @@
     if (predicate.isDone()) {
       return;
     }
-    final long timeoutSeconds = timeoutSeconds();
-    final long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
+    long timeoutSeconds = timeoutSeconds();
+    long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
     do {
       System.runFinalization();
       if (predicate.isDone()) {
@@ -198,8 +196,8 @@
     if (latch.getCount() == 0) {
       return;
     }
-    final long timeoutSeconds = timeoutSeconds();
-    final long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
+    long timeoutSeconds = timeoutSeconds();
+    long deadline = System.nanoTime() + SECONDS.toNanos(timeoutSeconds);
     do {
       System.runFinalization();
       if (latch.getCount() == 0) {
@@ -222,13 +220,14 @@
    * Creates a garbage object that counts down the latch in its finalizer. Sequestered into a
    * separate method to make it somewhat more likely to be unreachable.
    */
-  private static void createUnreachableLatchFinalizer(final CountDownLatch latch) {
-    new Object() {
-      @Override
-      protected void finalize() {
-        latch.countDown();
-      }
-    };
+  private static void createUnreachableLatchFinalizer(CountDownLatch latch) {
+    Object unused =
+        new Object() {
+          @Override
+          protected void finalize() {
+            latch.countDown();
+          }
+        };
   }
 
   /**
@@ -263,7 +262,7 @@
    *
    * @throws RuntimeException if timed out or interrupted while waiting
    */
-  public static void awaitClear(final WeakReference<?> ref) {
+  public static void awaitClear(WeakReference<?> ref) {
     awaitDone(
         new FinalizationPredicate() {
           @Override
@@ -296,9 +295,9 @@
    * @since 12.0
    */
   public static void awaitFullGc() {
-    final CountDownLatch finalizerRan = new CountDownLatch(1);
+    CountDownLatch finalizerRan = new CountDownLatch(1);
     WeakReference<Object> ref =
-        new WeakReference<Object>(
+        new WeakReference<>(
             new Object() {
               @Override
               protected void finalize() {
diff --git a/guava-testlib/src/com/google/common/testing/NullPointerTester.java b/guava-testlib/src/com/google/common/testing/NullPointerTester.java
index 8986d15..3eb3176 100644
--- a/guava-testlib/src/com/google/common/testing/NullPointerTester.java
+++ b/guava-testlib/src/com/google/common/testing/NullPointerTester.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Converter;
 import com.google.common.base.Objects;
@@ -68,7 +67,6 @@
  * @author Kevin Bourrillion
  * @since 10.0
  */
-@Beta
 @GwtIncompatible
 public final class NullPointerTester {
 
diff --git a/guava-testlib/src/com/google/common/testing/RelationshipTester.java b/guava-testlib/src/com/google/common/testing/RelationshipTester.java
index 5adf010..d5b9b6a 100644
--- a/guava-testlib/src/com/google/common/testing/RelationshipTester.java
+++ b/guava-testlib/src/com/google/common/testing/RelationshipTester.java
@@ -147,7 +147,7 @@
   }
 
   private Item<T> getItem(int groupNumber, int itemNumber) {
-    return new Item<T>(groups.get(groupNumber).get(itemNumber), groupNumber, itemNumber);
+    return new Item<>(groups.get(groupNumber).get(itemNumber), groupNumber, itemNumber);
   }
 
   static final class Item<T> {
diff --git a/guava-testlib/src/com/google/common/testing/SerializableTester.java b/guava-testlib/src/com/google/common/testing/SerializableTester.java
index 6298076..c4e6d23 100644
--- a/guava-testlib/src/com/google/common/testing/SerializableTester.java
+++ b/guava-testlib/src/com/google/common/testing/SerializableTester.java
@@ -16,7 +16,6 @@
 
 package com.google.common.testing;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
@@ -32,7 +31,6 @@
  * @author Mike Bostock
  * @since 10.0
  */
-@Beta
 @GwtCompatible // but no-op!
 public final class SerializableTester {
   private SerializableTester() {}
@@ -52,7 +50,6 @@
    * @throws RuntimeException if the specified object was not successfully serialized or
    *     deserialized
    */
-  @SuppressWarnings("unchecked")
   public static <T> T reserialize(T object) {
     return Platform.reserialize(object);
   }
diff --git a/guava-testlib/src/com/google/common/testing/TestLogHandler.java b/guava-testlib/src/com/google/common/testing/TestLogHandler.java
index e63d11f..41dca2e 100644
--- a/guava-testlib/src/com/google/common/testing/TestLogHandler.java
+++ b/guava-testlib/src/com/google/common/testing/TestLogHandler.java
@@ -16,7 +16,6 @@
 
 package com.google.common.testing;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -52,7 +51,6 @@
  * @author Kevin Bourrillion
  * @since 10.0
  */
-@Beta
 @GwtCompatible
 public class TestLogHandler extends Handler {
   /** We will keep a private list of all logged records */
diff --git a/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java b/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java
index 2ba7515..b5bec2c 100644
--- a/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java
+++ b/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java
@@ -16,6 +16,9 @@
 
 package com.google.common.util.concurrent.testing;
 
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -68,21 +71,18 @@
     assertFalse(future.isDone());
     assertFalse(future.isCancelled());
 
-    final CountDownLatch successLatch = new CountDownLatch(1);
-    final Throwable[] badness = new Throwable[1];
+    CountDownLatch successLatch = new CountDownLatch(1);
+    Throwable[] badness = new Throwable[1];
 
     // Wait on the future in a separate thread.
     new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  assertSame(Boolean.TRUE, future.get());
-                  successLatch.countDown();
-                } catch (Throwable t) {
-                  t.printStackTrace();
-                  badness[0] = t;
-                }
+            () -> {
+              try {
+                assertSame(Boolean.TRUE, future.get());
+                successLatch.countDown();
+              } catch (Throwable t) {
+                t.printStackTrace();
+                badness[0] = t;
               }
             })
         .start();
@@ -90,7 +90,7 @@
     // Release the future value.
     latch.countDown();
 
-    assertTrue(successLatch.await(10, TimeUnit.SECONDS));
+    assertTrue(successLatch.await(10, SECONDS));
 
     if (badness[0] != null) {
       throw badness[0];
@@ -105,7 +105,7 @@
 
     // The task thread waits for the latch, so we expect a timeout here.
     try {
-      future.get(20, TimeUnit.MILLISECONDS);
+      future.get(20, MILLISECONDS);
       fail("Should have timed out trying to get the value.");
     } catch (TimeoutException expected) {
     } finally {
@@ -123,20 +123,17 @@
     assertFalse(future.isDone());
     assertFalse(future.isCancelled());
 
-    final CountDownLatch successLatch = new CountDownLatch(1);
+    CountDownLatch successLatch = new CountDownLatch(1);
 
     // Run cancellation in a separate thread as an extra thread-safety test.
     new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  future.get();
-                } catch (CancellationException expected) {
-                  successLatch.countDown();
-                } catch (Exception ignored) {
-                  // All other errors are ignored, we expect a cancellation.
-                }
+            () -> {
+              try {
+                future.get();
+              } catch (CancellationException expected) {
+                successLatch.countDown();
+              } catch (Exception ignored) {
+                // All other errors are ignored, we expect a cancellation.
               }
             })
         .start();
@@ -149,37 +146,27 @@
     assertTrue(future.isDone());
     assertTrue(future.isCancelled());
 
-    assertTrue(successLatch.await(200, TimeUnit.MILLISECONDS));
+    assertTrue(successLatch.await(200, MILLISECONDS));
 
     latch.countDown();
   }
 
   public void testListenersNotifiedOnError() throws Exception {
-    final CountDownLatch successLatch = new CountDownLatch(1);
-    final CountDownLatch listenerLatch = new CountDownLatch(1);
+    CountDownLatch successLatch = new CountDownLatch(1);
+    CountDownLatch listenerLatch = new CountDownLatch(1);
 
     ExecutorService exec = Executors.newCachedThreadPool();
 
-    future.addListener(
-        new Runnable() {
-          @Override
-          public void run() {
-            listenerLatch.countDown();
-          }
-        },
-        exec);
+    future.addListener(listenerLatch::countDown, exec);
 
     new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  future.get();
-                } catch (CancellationException expected) {
-                  successLatch.countDown();
-                } catch (Exception ignored) {
-                  // No success latch count down.
-                }
+            () -> {
+              try {
+                future.get();
+              } catch (CancellationException expected) {
+                successLatch.countDown();
+              } catch (Exception ignored) {
+                // No success latch count down.
               }
             })
         .start();
@@ -189,13 +176,13 @@
     assertTrue(future.isCancelled());
     assertTrue(future.isDone());
 
-    assertTrue(successLatch.await(200, TimeUnit.MILLISECONDS));
-    assertTrue(listenerLatch.await(200, TimeUnit.MILLISECONDS));
+    assertTrue(successLatch.await(200, MILLISECONDS));
+    assertTrue(listenerLatch.await(200, MILLISECONDS));
 
     latch.countDown();
 
     exec.shutdown();
-    exec.awaitTermination(100, TimeUnit.MILLISECONDS);
+    exec.awaitTermination(100, MILLISECONDS);
   }
 
   /**
@@ -209,7 +196,7 @@
     ExecutorService exec = Executors.newCachedThreadPool();
 
     int listenerCount = 20;
-    final CountDownLatch listenerLatch = new CountDownLatch(listenerCount);
+    CountDownLatch listenerLatch = new CountDownLatch(listenerCount);
 
     // Test that listeners added both before and after the value is available
     // get called correctly.
@@ -217,31 +204,17 @@
 
       // Right in the middle start up a thread to close the latch.
       if (i == 10) {
-        new Thread(
-                new Runnable() {
-                  @Override
-                  public void run() {
-                    latch.countDown();
-                  }
-                })
-            .start();
+        new Thread(() -> latch.countDown()).start();
       }
 
-      future.addListener(
-          new Runnable() {
-            @Override
-            public void run() {
-              listenerLatch.countDown();
-            }
-          },
-          exec);
+      future.addListener(listenerLatch::countDown, exec);
     }
 
     assertSame(Boolean.TRUE, future.get());
     // Wait for the listener latch to complete.
-    listenerLatch.await(500, TimeUnit.MILLISECONDS);
+    listenerLatch.await(500, MILLISECONDS);
 
     exec.shutdown();
-    exec.awaitTermination(500, TimeUnit.MILLISECONDS);
+    exec.awaitTermination(500, MILLISECONDS);
   }
 }
diff --git a/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java b/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java
index fc3ed21..a2fe4f4 100644
--- a/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java
+++ b/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java
@@ -17,13 +17,13 @@
 package com.google.common.util.concurrent.testing;
 
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
 import junit.framework.Assert;
 
 /**
@@ -59,7 +59,7 @@
    */
   public void assertSuccess(Object expectedData) throws Throwable {
     // Verify that the listener executed in a reasonable amount of time.
-    Assert.assertTrue(countDownLatch.await(1L, TimeUnit.SECONDS));
+    Assert.assertTrue(countDownLatch.await(1L, SECONDS));
 
     try {
       Assert.assertEquals(expectedData, future.get());
@@ -75,7 +75,7 @@
    */
   public void assertException(Throwable expectedCause) throws Exception {
     // Verify that the listener executed in a reasonable amount of time.
-    Assert.assertTrue(countDownLatch.await(1L, TimeUnit.SECONDS));
+    Assert.assertTrue(countDownLatch.await(1L, SECONDS));
 
     try {
       future.get();
@@ -88,6 +88,6 @@
   public void assertTimeout() throws Exception {
     // Verify that the listener does not get called in a reasonable amount of
     // time.
-    Assert.assertFalse(countDownLatch.await(1L, TimeUnit.SECONDS));
+    Assert.assertFalse(countDownLatch.await(1L, SECONDS));
   }
 }
diff --git a/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java b/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java
index c232218..25b7ef7 100644
--- a/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java
+++ b/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java
@@ -140,11 +140,11 @@
 
   @Override
   public <V> ListenableScheduledFuture<V> schedule(
-      final Callable<V> callable, long delay, TimeUnit unit) {
+      Callable<V> callable, long delay, TimeUnit unit) {
     Preconditions.checkNotNull(callable, "callable must not be null!");
     Preconditions.checkNotNull(unit, "unit must not be null!");
     ListenableFuture<V> delegateFuture = submit(callable);
-    return new ImmediateScheduledFuture<V>(delegateFuture);
+    return new ImmediateScheduledFuture<>(delegateFuture);
   }
 
   private static class ImmediateScheduledFuture<V> extends SimpleForwardingListenableFuture<V>
diff --git a/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java b/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java
index 4212430..dc2c40d 100644
--- a/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java
+++ b/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java
@@ -16,6 +16,8 @@
 
 package com.google.common.util.concurrent.testing;
 
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.ImmutableList;
@@ -153,7 +155,7 @@
         implements ListenableScheduledFuture<V> {
 
       static <V> NeverScheduledFuture<V> create() {
-        return new NeverScheduledFuture<V>();
+        return new NeverScheduledFuture<>();
       }
 
       @Override
@@ -163,7 +165,7 @@
 
       @Override
       public int compareTo(Delayed other) {
-        return Longs.compare(getDelay(TimeUnit.NANOSECONDS), other.getDelay(TimeUnit.NANOSECONDS));
+        return Longs.compare(getDelay(NANOSECONDS), other.getDelay(NANOSECONDS));
       }
     }
   }
diff --git a/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java b/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java
index dc0fe37..4d617d6 100644
--- a/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java
+++ b/guava-testlib/test/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilderTest.java
@@ -27,7 +27,7 @@
 /** @author Max Ross */
 public class FeatureSpecificTestSuiteBuilderTest extends TestCase {
 
-  static boolean testWasRun;
+  private static boolean testWasRun;
 
   @Override
   protected void setUp() throws Exception {
@@ -52,7 +52,7 @@
   }
 
   public void testLifecycle() {
-    final boolean setUp[] = {false};
+    boolean[] setUp = {false};
     Runnable setUpRunnable =
         new Runnable() {
           @Override
@@ -61,7 +61,7 @@
           }
         };
 
-    final boolean tearDown[] = {false};
+    boolean[] tearDown = {false};
     Runnable tearDownRunnable =
         new Runnable() {
           @Override
diff --git a/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java b/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java
index d612b2c..865c198 100644
--- a/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java
+++ b/guava-testlib/test/com/google/common/testing/EquivalenceTesterTest.java
@@ -237,7 +237,7 @@
     void replay() {
       checkRecording();
       equivalentExpectations = equivalentExpectationsBuilder.build();
-      hashExpectations = hashExpectationsBuilder.build();
+      hashExpectations = hashExpectationsBuilder.buildOrThrow();
     }
 
     @Override
diff --git a/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java b/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
index f10b94e..cd8e24b 100644
--- a/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
@@ -139,7 +139,7 @@
         for (Element element : keys) {
           builder.put(element, element);
         }
-        return builder.build();
+        return builder.buildOrThrow();
       }
     },
     ImmutableSorted {
diff --git a/guava-tests/pom.xml b/guava-tests/pom.xml
index a40b092..b7728d8 100644
--- a/guava-tests/pom.xml
+++ b/guava-tests/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>31.0.1-jre</version>
+    <version>31.1-jre</version>
   </parent>
   <artifactId>guava-tests</artifactId>
   <name>Guava Unit Tests</name>
diff --git a/guava-tests/test/com/google/common/base/AbstractIteratorTest.java b/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
index da732bf..ddb7d70 100644
--- a/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
+++ b/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
@@ -205,7 +205,7 @@
   // hasNext/next), but we'll cop out for now, knowing that
   // next() both start by invoking hasNext() anyway.
 
-  /** Throws a undeclared checked exception. */
+  /** Throws an undeclared checked exception. */
   private static void sneakyThrow(Throwable t) {
     class SneakyThrower<T extends Throwable> {
       @SuppressWarnings("unchecked") // intentionally unsafe for test
diff --git a/guava-tests/test/com/google/common/base/AsciiTest.java b/guava-tests/test/com/google/common/base/AsciiTest.java
index d3a1f8f..9e6b0e4 100644
--- a/guava-tests/test/com/google/common/base/AsciiTest.java
+++ b/guava-tests/test/com/google/common/base/AsciiTest.java
@@ -54,8 +54,8 @@
   public void testCharsIgnored() {
     for (char c : IGNORED.toCharArray()) {
       String str = String.valueOf(c);
-      assertTrue(str, c == Ascii.toLowerCase(c));
-      assertTrue(str, c == Ascii.toUpperCase(c));
+      assertEquals(str, c, Ascii.toLowerCase(c));
+      assertEquals(str, c, Ascii.toUpperCase(c));
       assertFalse(str, Ascii.isLowerCase(c));
       assertFalse(str, Ascii.isUpperCase(c));
     }
@@ -98,27 +98,26 @@
   }
 
   public void testTruncateIllegalArguments() {
-    String truncated = null;
     try {
-      truncated = Ascii.truncate("foobar", 2, "...");
+      Ascii.truncate("foobar", 2, "...");
       fail();
     } catch (IllegalArgumentException expected) {
     }
 
     try {
-      truncated = Ascii.truncate("foobar", 8, "1234567890");
+      Ascii.truncate("foobar", 8, "1234567890");
       fail();
     } catch (IllegalArgumentException expected) {
     }
 
     try {
-      truncated = Ascii.truncate("foobar", -1, "...");
+      Ascii.truncate("foobar", -1, "...");
       fail();
     } catch (IllegalArgumentException expected) {
     }
 
     try {
-      truncated = Ascii.truncate("foobar", -1, "");
+      Ascii.truncate("foobar", -1, "");
       fail();
     } catch (IllegalArgumentException expected) {
     }
diff --git a/guava-tests/test/com/google/common/base/CharMatcherTest.java b/guava-tests/test/com/google/common/base/CharMatcherTest.java
index 5412882..49bdbba 100644
--- a/guava-tests/test/com/google/common/base/CharMatcherTest.java
+++ b/guava-tests/test/com/google/common/base/CharMatcherTest.java
@@ -386,7 +386,7 @@
     assertSame(s, matcher.replaceFrom(s, 'z'));
     assertSame(s, matcher.replaceFrom(s, "ZZ"));
     assertSame(s, matcher.trimFrom(s));
-    assertSame(0, matcher.countIn(s));
+    assertEquals(0, matcher.countIn(s));
   }
 
   private void reallyTestMatchThenNoMatch(CharMatcher matcher, String s) {
diff --git a/guava-tests/test/com/google/common/cache/LocalCacheTest.java b/guava-tests/test/com/google/common/cache/LocalCacheTest.java
index ceecb5d..db3b800 100644
--- a/guava-tests/test/com/google/common/cache/LocalCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/LocalCacheTest.java
@@ -229,7 +229,7 @@
 
   private Throwable popLoggedThrowable() {
     List<LogRecord> logRecords = logHandler.getStoredLogRecords();
-    assertSame(1, logRecords.size());
+    assertEquals(1, logRecords.size());
     LogRecord logRecord = logRecords.get(0);
     logHandler.clear();
     return logRecord.getThrown();
diff --git a/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java b/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
index 3592210..a76907c 100644
--- a/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
+++ b/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
@@ -250,6 +250,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testCantRemove() {
     Iterator<Integer> iter =
         new AbstractIterator<Integer>() {
diff --git a/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java b/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java
index 11c66a7..63c17de 100644
--- a/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java
+++ b/guava-tests/test/com/google/common/collect/AbstractMapEntryTest.java
@@ -61,7 +61,8 @@
 
   public void testEquals() {
     Entry<String, Integer> foo1 = entry("foo", 1);
-    assertEquals(foo1, foo1);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(foo1.equals(foo1));
     assertEquals(control("foo", 1), foo1);
     assertEquals(control("bar", 2), entry("bar", 2));
     assertFalse(control("foo", 1).equals(entry("foo", 2)));
diff --git a/guava-tests/test/com/google/common/collect/CompactHashMapFloodingTest.java b/guava-tests/test/com/google/common/collect/CompactHashMapFloodingTest.java
new file mode 100644
index 0000000..1a03163
--- /dev/null
+++ b/guava-tests/test/com/google/common/collect/CompactHashMapFloodingTest.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.collect;
+
+import java.util.Map;
+
+public class CompactHashMapFloodingTest extends AbstractHashFloodingTest<Map<Object, Object>> {
+  public CompactHashMapFloodingTest() {
+    super(
+        ImmutableList.of(Construction.mapFromKeys(CompactHashMap::create)),
+        n -> n * Math.log(n),
+        ImmutableList.of(QueryOp.MAP_GET));
+  }
+}
diff --git a/guava-tests/test/com/google/common/collect/CompactHashMapTest.java b/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
index 095b1c9..8e175b4 100644
--- a/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
@@ -82,7 +82,6 @@
                 CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
             .createTestSuite());
     suite.addTestSuite(CompactHashMapTest.class);
-    suite.addTestSuite(FloodingTest.class);
     return suite;
   }
 
@@ -141,12 +140,4 @@
     }
   }
 
-  public static class FloodingTest extends AbstractHashFloodingTest<Map<Object, Object>> {
-    public FloodingTest() {
-      super(
-          ImmutableList.of(Construction.mapFromKeys(CompactHashMap::create)),
-          n -> n * Math.log(n),
-          ImmutableList.of(QueryOp.MAP_GET));
-    }
-  }
 }
diff --git a/guava-tests/test/com/google/common/collect/CompactHashSetFloodingTest.java b/guava-tests/test/com/google/common/collect/CompactHashSetFloodingTest.java
new file mode 100644
index 0000000..53e9a61
--- /dev/null
+++ b/guava-tests/test/com/google/common/collect/CompactHashSetFloodingTest.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.collect;
+
+import java.util.Set;
+
+public class CompactHashSetFloodingTest extends AbstractHashFloodingTest<Set<Object>> {
+  public CompactHashSetFloodingTest() {
+    super(
+        ImmutableList.of(Construction.setFromElements(CompactHashSet::create)),
+        n -> n * Math.log(n),
+        ImmutableList.of(QueryOp.SET_CONTAINS));
+  }
+}
diff --git a/guava-tests/test/com/google/common/collect/CompactHashSetTest.java b/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
index 6e2817b..f55f8d6 100644
--- a/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
@@ -53,7 +53,6 @@
 
     TestSuite suite = new TestSuite();
     suite.addTestSuite(CompactHashSetTest.class);
-    suite.addTestSuite(FloodingTest.class);
     suite.addTest(
         SetTestSuiteBuilder.using(
                 new TestStringSetGenerator() {
@@ -124,12 +123,4 @@
     }
   }
 
-  public static class FloodingTest extends AbstractHashFloodingTest<Set<Object>> {
-    public FloodingTest() {
-      super(
-          ImmutableList.of(Construction.setFromElements(CompactHashSet::create)),
-          n -> n * Math.log(n),
-          ImmutableList.of(QueryOp.SET_CONTAINS));
-    }
-  }
 }
diff --git a/guava-tests/test/com/google/common/collect/CompactLinkedHashMapFloodingTest.java b/guava-tests/test/com/google/common/collect/CompactLinkedHashMapFloodingTest.java
new file mode 100644
index 0000000..826fc82
--- /dev/null
+++ b/guava-tests/test/com/google/common/collect/CompactLinkedHashMapFloodingTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.common.collect;
+
+import java.util.Map;
+
+public class CompactLinkedHashMapFloodingTest
+    extends AbstractHashFloodingTest<Map<Object, Object>> {
+  public CompactLinkedHashMapFloodingTest() {
+    super(
+        ImmutableList.of(Construction.mapFromKeys(CompactLinkedHashMap::create)),
+        n -> n * Math.log(n),
+        ImmutableList.of(QueryOp.MAP_GET));
+  }
+}
diff --git a/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java b/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
index e8ba94c..e2f8611 100644
--- a/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
@@ -82,7 +82,6 @@
                 CollectionFeature.KNOWN_ORDER)
             .createTestSuite());
     suite.addTestSuite(CompactLinkedHashMapTest.class);
-    suite.addTestSuite(FloodingTest.class);
     return suite;
   }
 
@@ -202,12 +201,4 @@
     }
   }
 
-  public static class FloodingTest extends AbstractHashFloodingTest<Map<Object, Object>> {
-    public FloodingTest() {
-      super(
-          ImmutableList.of(Construction.mapFromKeys(CompactLinkedHashMap::create)),
-          n -> n * Math.log(n),
-          ImmutableList.of(QueryOp.MAP_GET));
-    }
-  }
 }
diff --git a/guava-tests/test/com/google/common/collect/CompactLinkedHashSetFloodingTest.java b/guava-tests/test/com/google/common/collect/CompactLinkedHashSetFloodingTest.java
new file mode 100644
index 0000000..b8a5d97
--- /dev/null
+++ b/guava-tests/test/com/google/common/collect/CompactLinkedHashSetFloodingTest.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.collect;
+
+import java.util.Set;
+
+public class CompactLinkedHashSetFloodingTest extends AbstractHashFloodingTest<Set<Object>> {
+  public CompactLinkedHashSetFloodingTest() {
+    super(
+        ImmutableList.of(Construction.setFromElements(CompactLinkedHashSet::create)),
+        n -> n * Math.log(n),
+        ImmutableList.of(QueryOp.SET_CONTAINS));
+  }
+}
diff --git a/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java b/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
index dba9a73..ee8f408 100644
--- a/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
@@ -54,7 +54,6 @@
 
     TestSuite suite = new TestSuite();
     suite.addTestSuite(CompactLinkedHashSetTest.class);
-    suite.addTestSuite(FloodingTest.class);
     suite.addTest(
         SetTestSuiteBuilder.using(
                 new TestStringSetGenerator() {
@@ -106,12 +105,4 @@
     }
   }
 
-  public static class FloodingTest extends AbstractHashFloodingTest<Set<Object>> {
-    public FloodingTest() {
-      super(
-          ImmutableList.of(Construction.setFromElements(CompactLinkedHashSet::create)),
-          n -> n * Math.log(n),
-          ImmutableList.of(QueryOp.SET_CONTAINS));
-    }
-  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ForwardingMapTest.java b/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
index cc5d739..cf2ed0d 100644
--- a/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
@@ -170,7 +170,7 @@
                     for (Entry<String, String> entry : entries) {
                       builder.put(entry.getKey(), entry.getValue());
                     }
-                    return new StandardImplForwardingMap<>(builder.build());
+                    return new StandardImplForwardingMap<>(builder.buildOrThrow());
                   }
                 })
             .named("ForwardingMap[ImmutableMap] with standard implementations")
diff --git a/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
index fa0a7c1..780dc37 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
@@ -354,6 +354,7 @@
       }
     }
 
+    @SuppressWarnings("AlwaysThrows")
     public void testPuttingTheSameKeyTwiceThrowsOnBuild() {
       Builder<String, Integer> builder =
           new Builder<String, Integer>()
@@ -587,6 +588,7 @@
       }
     }
 
+    @SuppressWarnings("AlwaysThrows")
     public void testOfWithDuplicateKey() {
       try {
         ImmutableBiMap.of("one", 1, "one", 1);
@@ -671,7 +673,7 @@
                   .put("three", 3)
                   .put("four", 4)
                   .put("five", 5)
-                  .build());
+                  .buildOrThrow());
       assertMapEquals(bimap, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
       assertMapEquals(bimap.inverse(), 1, "one", 2, "two", 3, "three", 4, "four", 5, "five");
     }
@@ -683,13 +685,14 @@
               .put("two", 2)
               .put("uno", 1)
               .put("dos", 2)
-              .build();
+              .buildOrThrow();
 
       try {
         ImmutableBiMap.copyOf(map);
         fail();
       } catch (IllegalArgumentException expected) {
-        assertThat(expected.getMessage()).contains("1");
+        assertThat(expected.getMessage()).containsMatch("1|2");
+        // We don't specify which of the two dups should be reported.
       }
     }
 
@@ -721,6 +724,7 @@
 
   public static class BiMapSpecificTests extends TestCase {
 
+    @SuppressWarnings("DoNotCall")
     public void testForcePut() {
       BiMap<String, Integer> bimap = ImmutableBiMap.copyOf(ImmutableMap.of("one", 1, "two", 2));
       try {
@@ -780,11 +784,11 @@
   }
 
   private static <K, V> void assertMapEquals(Map<K, V> map, Object... alternatingKeysAndValues) {
-    int i = 0;
-    for (Entry<K, V> entry : map.entrySet()) {
-      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
-      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+    Map<Object, Object> expected = new LinkedHashMap<>();
+    for (int i = 0; i < alternatingKeysAndValues.length; i += 2) {
+      expected.put(alternatingKeysAndValues[i], alternatingKeysAndValues[i + 1]);
     }
+    assertThat(map).containsExactlyEntriesIn(expected).inOrder();
   }
 
   public static class FloodingTest extends AbstractHashFloodingTest<BiMap<Object, Object>> {
diff --git a/guava-tests/test/com/google/common/collect/ImmutableMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
index 18a17a0..63ce08a 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
@@ -65,6 +65,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collector;
 import java.util.stream.Stream;
 import junit.framework.Test;
@@ -78,6 +80,7 @@
  * @author Jesse Wilson
  */
 @GwtCompatible(emulated = true)
+@SuppressWarnings("AlwaysThrows")
 public class ImmutableMapTest extends TestCase {
 
   @GwtIncompatible // suite
@@ -208,7 +211,7 @@
       throw new UnsupportedOperationException();
     }
 
-    private static final Joiner joiner = Joiner.on(", ");
+    private static final Joiner JOINER = Joiner.on(", ");
 
     @Override
     protected void assertMoreInvariants(Map<K, V> map) {
@@ -217,10 +220,10 @@
         assertEquals(entry.getKey() + "=" + entry.getValue(), entry.toString());
       }
 
-      assertEquals("{" + joiner.join(map.entrySet()) + "}", map.toString());
-      assertEquals("[" + joiner.join(map.entrySet()) + "]", map.entrySet().toString());
-      assertEquals("[" + joiner.join(map.keySet()) + "]", map.keySet().toString());
-      assertEquals("[" + joiner.join(map.values()) + "]", map.values().toString());
+      assertEquals("{" + JOINER.join(map.entrySet()) + "}", map.toString());
+      assertEquals("[" + JOINER.join(map.entrySet()) + "]", map.entrySet().toString());
+      assertEquals("[" + JOINER.join(map.keySet()) + "]", map.keySet().toString());
+      assertEquals("[" + JOINER.join(map.values()) + "]", map.values().toString());
 
       assertEquals(MinimalSet.from(map.entrySet()), map.entrySet());
       assertEquals(Sets.newHashSet(map.keySet()), map.keySet());
@@ -348,12 +351,13 @@
 
   public static class CreationTests extends TestCase {
     public void testEmptyBuilder() {
-      ImmutableMap<String, Integer> map = new Builder<String, Integer>().build();
+      ImmutableMap<String, Integer> map = new Builder<String, Integer>().buildOrThrow();
       assertEquals(Collections.<String, Integer>emptyMap(), map);
     }
 
     public void testSingletonBuilder() {
-      ImmutableMap<String, Integer> map = new Builder<String, Integer>().put("one", 1).build();
+      ImmutableMap<String, Integer> map =
+          new Builder<String, Integer>().put("one", 1).buildOrThrow();
       assertMapEquals(map, "one", 1);
     }
 
@@ -365,7 +369,7 @@
               .put("three", 3)
               .put("four", 4)
               .put("five", 5)
-              .build();
+              .buildOrThrow();
       assertMapEquals(map, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
     }
 
@@ -378,7 +382,7 @@
       }
       Entry<Integer, Integer>[] builderArrayAfterPuts = builder.entries;
       RegularImmutableMap<Integer, Integer> map =
-          (RegularImmutableMap<Integer, Integer>) builder.build();
+          (RegularImmutableMap<Integer, Integer>) builder.buildOrThrow();
       Entry<Integer, Integer>[] mapInternalArray = map.entries;
       assertSame(builderArray, builderArrayAfterPuts);
       assertSame(builderArray, mapInternalArray);
@@ -393,16 +397,16 @@
               .put("five", 5)
               .put("four", 4)
               .put("two", 2)
-              .build();
+              .buildOrThrow();
       assertMapEquals(map, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
     }
 
     public void testBuilder_orderEntriesByValueAfterExactSizeBuild() {
       Builder<String, Integer> builder =
           new Builder<String, Integer>(2).put("four", 4).put("one", 1);
-      ImmutableMap<String, Integer> keyOrdered = builder.build();
+      ImmutableMap<String, Integer> keyOrdered = builder.buildOrThrow();
       ImmutableMap<String, Integer> valueOrdered =
-          builder.orderEntriesByValue(Ordering.natural()).build();
+          builder.orderEntriesByValue(Ordering.natural()).buildOrThrow();
       assertMapEquals(keyOrdered, "four", 4, "one", 1);
       assertMapEquals(valueOrdered, "one", 1, "four", 4);
     }
@@ -417,9 +421,45 @@
       }
     }
 
+    @GwtIncompatible // we haven't implemented this
+    public void testBuilder_orderEntriesByValue_keepingLast() {
+      ImmutableMap.Builder<String, Integer> builder =
+          new Builder<String, Integer>()
+              .orderEntriesByValue(Ordering.natural())
+              .put("three", 3)
+              .put("one", 1)
+              .put("five", 5)
+              .put("four", 3)
+              .put("four", 5)
+              .put("four", 4) // this should win because it's last
+              .put("two", 2);
+      assertMapEquals(
+          builder.buildKeepingLast(), "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
+      try {
+        builder.buildOrThrow();
+        fail("Expected exception from duplicate keys");
+      } catch (IllegalArgumentException expected) {
+      }
+    }
+
+    @GwtIncompatible // we haven't implemented this
+    public void testBuilder_orderEntriesByValue_keepingLast_builderSizeFieldPreserved() {
+      ImmutableMap.Builder<String, Integer> builder =
+          new Builder<String, Integer>()
+              .orderEntriesByValue(Ordering.natural())
+              .put("one", 1)
+              .put("one", 1);
+      assertMapEquals(builder.buildKeepingLast(), "one", 1);
+      try {
+        builder.buildOrThrow();
+        fail("Expected exception from duplicate keys");
+      } catch (IllegalArgumentException expected) {
+      }
+    }
+
     public void testBuilder_withImmutableEntry() {
       ImmutableMap<String, Integer> map =
-          new Builder<String, Integer>().put(Maps.immutableEntry("one", 1)).build();
+          new Builder<String, Integer>().put(Maps.immutableEntry("one", 1)).buildOrThrow();
       assertMapEquals(map, "one", 1);
     }
 
@@ -460,12 +500,14 @@
 
       builder.put(entry);
       holder.string = "two";
-      assertMapEquals(builder.build(), "one", 1);
+      assertMapEquals(builder.buildOrThrow(), "one", 1);
     }
 
     public void testBuilderPutAllWithEmptyMap() {
       ImmutableMap<String, Integer> map =
-          new Builder<String, Integer>().putAll(Collections.<String, Integer>emptyMap()).build();
+          new Builder<String, Integer>()
+              .putAll(Collections.<String, Integer>emptyMap())
+              .buildOrThrow();
       assertEquals(Collections.<String, Integer>emptyMap(), map);
     }
 
@@ -479,14 +521,14 @@
       moreToPut.put("five", 5);
 
       ImmutableMap<String, Integer> map =
-          new Builder<String, Integer>().putAll(toPut).putAll(moreToPut).build();
+          new Builder<String, Integer>().putAll(toPut).putAll(moreToPut).buildOrThrow();
       assertMapEquals(map, "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
     }
 
     public void testBuilderReuse() {
       Builder<String, Integer> builder = new Builder<>();
-      ImmutableMap<String, Integer> mapOne = builder.put("one", 1).put("two", 2).build();
-      ImmutableMap<String, Integer> mapTwo = builder.put("three", 3).put("four", 4).build();
+      ImmutableMap<String, Integer> mapOne = builder.put("one", 1).put("two", 2).buildOrThrow();
+      ImmutableMap<String, Integer> mapTwo = builder.put("three", 3).put("four", 4).buildOrThrow();
 
       assertMapEquals(mapOne, "one", 1, "two", 2);
       assertMapEquals(mapTwo, "one", 1, "two", 2, "three", 3, "four", 4);
@@ -500,7 +542,7 @@
       } catch (NullPointerException expected) {
       }
       builder.put("foo", 2);
-      assertMapEquals(builder.build(), "foo", 2);
+      assertMapEquals(builder.buildOrThrow(), "foo", 2);
     }
 
     public void testBuilderPutImmutableEntryWithNullKeyFailsAtomically() {
@@ -511,7 +553,7 @@
       } catch (NullPointerException expected) {
       }
       builder.put("foo", 2);
-      assertMapEquals(builder.build(), "foo", 2);
+      assertMapEquals(builder.buildOrThrow(), "foo", 2);
     }
 
     // for GWT compatibility
@@ -543,7 +585,7 @@
       } catch (NullPointerException expected) {
       }
       builder.put("foo", 2);
-      assertMapEquals(builder.build(), "foo", 2);
+      assertMapEquals(builder.buildOrThrow(), "foo", 2);
     }
 
     public void testBuilderPutNullKey() {
@@ -586,15 +628,154 @@
       Builder<String, Integer> builder =
           new Builder<String, Integer>()
               .put("one", 1)
-              .put("one", 1); // throwing on this line would be even better
+              .put("one", 1); // throwing on this line might be better but it's too late to change
 
       try {
-        builder.build();
+        builder.buildOrThrow();
         fail();
       } catch (IllegalArgumentException expected) {
       }
     }
 
+    public void testBuildKeepingLast_allowsOverwrite() {
+      Builder<Integer, String> builder =
+          new Builder<Integer, String>()
+              .put(1, "un")
+              .put(2, "deux")
+              .put(70, "soixante-dix")
+              .put(70, "septante")
+              .put(70, "seventy")
+              .put(1, "one")
+              .put(2, "two");
+      ImmutableMap<Integer, String> map = builder.buildKeepingLast();
+      assertMapEquals(map, 1, "one", 2, "two", 70, "seventy");
+    }
+
+    public void testBuildKeepingLast_smallTableSameHash() {
+      String key1 = "QED";
+      String key2 = "R&D";
+      assertThat(key1.hashCode()).isEqualTo(key2.hashCode());
+      ImmutableMap<String, Integer> map =
+          ImmutableMap.<String, Integer>builder()
+              .put(key1, 1)
+              .put(key2, 2)
+              .put(key1, 3)
+              .put(key2, 4)
+              .buildKeepingLast();
+      assertMapEquals(map, key1, 3, key2, 4);
+    }
+
+    // The java7 branch has different code depending on whether the entry indexes fit in a byte,
+    // short, or int. The small table in testBuildKeepingLast_allowsOverwrite will test the byte
+    // case. This method tests the short case.
+    public void testBuildKeepingLast_shortTable() {
+      Builder<Integer, String> builder = ImmutableMap.builder();
+      Map<Integer, String> expected = new LinkedHashMap<>();
+      for (int i = 0; i < 1000; i++) {
+        // Truncate to even key, so we have put(0, "0") then put(0, "1"). Half the entries are
+        // duplicates.
+        Integer key = i & ~1;
+        String value = String.valueOf(i);
+        builder.put(key, value);
+        expected.put(key, value);
+      }
+      ImmutableMap<Integer, String> map = builder.buildKeepingLast();
+      assertThat(map).hasSize(500);
+      assertThat(map).containsExactlyEntriesIn(expected).inOrder();
+    }
+
+    // This method tests the int case.
+    public void testBuildKeepingLast_bigTable() {
+      Builder<Integer, String> builder = ImmutableMap.builder();
+      Map<Integer, String> expected = new LinkedHashMap<>();
+      for (int i = 0; i < 200_000; i++) {
+        // Truncate to even key, so we have put(0, "0") then put(0, "1"). Half the entries are
+        // duplicates.
+        Integer key = i & ~1;
+        String value = String.valueOf(i);
+        builder.put(key, value);
+        expected.put(key, value);
+      }
+      ImmutableMap<Integer, String> map = builder.buildKeepingLast();
+      assertThat(map).hasSize(100_000);
+      assertThat(map).containsExactlyEntriesIn(expected).inOrder();
+    }
+
+    private static class ClassWithTerribleHashCode
+        implements Comparable<ClassWithTerribleHashCode> {
+      private final int value;
+
+      ClassWithTerribleHashCode(int value) {
+        this.value = value;
+      }
+
+      @Override
+      public int compareTo(ClassWithTerribleHashCode that) {
+        return Integer.compare(this.value, that.value);
+      }
+
+      @Override
+      public boolean equals(Object x) {
+        return x instanceof ClassWithTerribleHashCode
+            && ((ClassWithTerribleHashCode) x).value == value;
+      }
+
+      @Override
+      public int hashCode() {
+        return 23;
+      }
+
+      @Override
+      public String toString() {
+        return "ClassWithTerribleHashCode(" + value + ")";
+      }
+    }
+
+    @GwtIncompatible
+    public void testBuildKeepingLast_collisions() {
+      Map<ClassWithTerribleHashCode, Integer> expected = new LinkedHashMap<>();
+      Builder<ClassWithTerribleHashCode, Integer> builder = new Builder<>();
+      int size = RegularImmutableMap.MAX_HASH_BUCKET_LENGTH + 10;
+      for (int i = 0; i < size; i++) {
+        ClassWithTerribleHashCode key = new ClassWithTerribleHashCode(i);
+        builder.put(key, i);
+        builder.put(key, -i);
+        expected.put(key, -i);
+      }
+      ImmutableMap<ClassWithTerribleHashCode, Integer> map = builder.buildKeepingLast();
+      assertThat(map).containsExactlyEntriesIn(expected).inOrder();
+      assertThat(map).isInstanceOf(JdkBackedImmutableMap.class);
+    }
+
+    @GwtIncompatible // Pattern, Matcher
+    public void testBuilder_keepingLast_thenOrThrow() {
+      ImmutableMap.Builder<String, Integer> builder =
+          new Builder<String, Integer>()
+              .put("three", 3)
+              .put("one", 1)
+              .put("five", 5)
+              .put("four", 3)
+              .put("four", 5)
+              .put("four", 4) // this should win because it's last
+              .put("two", 2);
+      assertMapEquals(
+          builder.buildKeepingLast(), "three", 3, "one", 1, "five", 5, "four", 4, "two", 2);
+      try {
+        builder.buildOrThrow();
+        fail("Expected exception from duplicate keys");
+      } catch (IllegalArgumentException expected) {
+        // We don't really care which values the exception message contains, but they should be
+        // different from each other. If buildKeepingLast() collapsed duplicates, that might end up
+        // not being true.
+        Pattern pattern =
+            Pattern.compile("Multiple entries with same key: four=(.*) and four=(.*)");
+        assertThat(expected).hasMessageThat().matches(pattern);
+        Matcher matcher = pattern.matcher(expected.getMessage());
+        assertThat(matcher.matches()).isTrue();
+        assertThat(matcher.group(1)).isNotEqualTo(matcher.group(2));
+      }
+    }
+
     public void testOf() {
       assertMapEquals(ImmutableMap.of("one", 1), "one", 1);
       assertMapEquals(ImmutableMap.of("one", 1, "two", 2), "one", 1, "two", 2);
@@ -894,12 +1075,11 @@
   }
 
   private static <K, V> void assertMapEquals(Map<K, V> map, Object... alternatingKeysAndValues) {
-    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
-    int i = 0;
-    for (Entry<K, V> entry : map.entrySet()) {
-      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
-      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+    Map<Object, Object> expected = new LinkedHashMap<>();
+    for (int i = 0; i < alternatingKeysAndValues.length; i += 2) {
+      expected.put(alternatingKeysAndValues[i], alternatingKeysAndValues[i + 1]);
     }
+    assertThat(map).containsExactlyEntriesIn(expected).inOrder();
   }
 
   private static class IntHolder implements Serializable {
@@ -969,7 +1149,8 @@
     Entry<String, NonSerializableClass>[] entries =
         arrayOf(ImmutableMap.entryOf("one", new NonSerializableClass()));
 
-    Map<String, NonSerializableClass> map = JdkBackedImmutableMap.create(1, entries);
+    ImmutableMap<String, NonSerializableClass> map =
+        JdkBackedImmutableMap.create(1, entries, /* throwIfDuplicateKeys= */ true);
     Set<String> set = map.keySet();
 
     LenientSerializableTester.reserializeAndAssertLenient(set);
@@ -993,7 +1174,8 @@
     Entry<NonSerializableClass, String>[] entries =
         arrayOf(ImmutableMap.entryOf(new NonSerializableClass(), "value"));
 
-    Map<NonSerializableClass, String> map = JdkBackedImmutableMap.create(1, entries);
+    ImmutableMap<NonSerializableClass, String> map =
+        JdkBackedImmutableMap.create(1, entries, /* throwIfDuplicateKeys= */ true);
     Collection<String> collection = map.values();
 
     LenientSerializableTester.reserializeAndAssertElementsEqual(collection);
@@ -1041,7 +1223,8 @@
       entries[i] = ImmutableMap.entryOf(i, i);
     }
 
-    ImmutableMap<Integer, Integer> map = JdkBackedImmutableMap.create(entries.length, entries);
+    ImmutableMap<Integer, Integer> map =
+        JdkBackedImmutableMap.create(entries.length, entries, /* throwIfDuplicateKeys= */ true);
     Set<Integer> keySet = map.keySet();
     Collection<Integer> values = map.values();
 
@@ -1074,57 +1257,60 @@
             .put(4, 4)
             .put(5, 5)
             .put(6, 6)
-            .build();
+            .buildOrThrow();
     assertNotNull(map.keySet().spliterator().trySplit());
   }
 
   public void testEquals() {
     new EqualsTester()
         .addEqualityGroup(
-            ImmutableMap.of(), ImmutableMap.builder().build(), ImmutableMap.ofEntries(), map())
+            ImmutableMap.of(),
+            ImmutableMap.builder().buildOrThrow(),
+            ImmutableMap.ofEntries(),
+            map())
         .addEqualityGroup(
             ImmutableMap.of(1, 1),
-            ImmutableMap.builder().put(1, 1).build(),
+            ImmutableMap.builder().put(1, 1).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1)),
             map(1, 1))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2),
-            ImmutableMap.builder().put(1, 1).put(2, 2).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2)),
             map(1, 1, 2, 2))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 3),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3)),
             map(1, 1, 2, 2, 3, 3))
         .addEqualityGroup(
             ImmutableMap.of(1, 4, 2, 2, 3, 3),
-            ImmutableMap.builder().put(1, 4).put(2, 2).put(3, 3).build(),
+            ImmutableMap.builder().put(1, 4).put(2, 2).put(3, 3).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 4), entry(2, 2), entry(3, 3)),
             map(1, 4, 2, 2, 3, 3))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 4, 3, 3),
-            ImmutableMap.builder().put(1, 1).put(2, 4).put(3, 3).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 4).put(3, 3).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 4), entry(3, 3)),
             map(1, 1, 2, 4, 3, 3))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 4),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 4).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 4).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 4)),
             map(1, 1, 2, 2, 3, 4))
         .addEqualityGroup(
             ImmutableMap.of(1, 2, 2, 3, 3, 1),
-            ImmutableMap.builder().put(1, 2).put(2, 3).put(3, 1).build(),
+            ImmutableMap.builder().put(1, 2).put(2, 3).put(3, 1).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 2), entry(2, 3), entry(3, 1)),
             map(1, 2, 2, 3, 3, 1))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4)),
             map(1, 1, 2, 2, 3, 3, 4, 4))
         .addEqualityGroup(
             ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5),
-            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).put(5, 5).build(),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).put(5, 5).buildOrThrow(),
             ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4), entry(5, 5)),
             map(1, 1, 2, 2, 3, 3, 4, 4, 5, 5))
         .testEquals();
@@ -1176,7 +1362,7 @@
         Arrays.asList(
             new AbstractMap.SimpleEntry<>("a", "1"), new AbstractMap.SimpleEntry<>("b", "2"));
     ImmutableMap<String, String> map =
-        ImmutableMap.<String, String>builder().putAll(entryList).build();
+        ImmutableMap.<String, String>builder().putAll(entryList).buildOrThrow();
     assertThat(map).containsExactly("a", "1", "b", "2").inOrder();
     entryList.get(0).setValue("3");
     assertThat(map).containsExactly("a", "1", "b", "2").inOrder();
@@ -1229,7 +1415,7 @@
           for (Object k : keys) {
             builder.put(k, "dummy value");
           }
-          return builder.build();
+          return builder.buildOrThrow();
         }
       },
       BUILDER_PUT_ENTRIES_ONE_BY_ONE {
@@ -1239,7 +1425,7 @@
           for (Object k : keys) {
             builder.put(Maps.immutableEntry(k, "dummy value"));
           }
-          return builder.build();
+          return builder.buildOrThrow();
         }
       },
       BUILDER_PUT_ALL_MAP {
@@ -1251,7 +1437,7 @@
               throw new UnsupportedOperationException("duplicate key");
             }
           }
-          return ImmutableMap.builder().putAll(sourceMap).build();
+          return ImmutableMap.builder().putAll(sourceMap).buildOrThrow();
         }
       },
       BUILDER_PUT_ALL_ENTRIES {
@@ -1259,7 +1445,7 @@
         public Map<Object, Object> create(List<?> keys) {
           return ImmutableMap.builder()
               .putAll(Lists.transform(keys, k -> Maps.immutableEntry(k, "dummy value")))
-              .build();
+              .buildOrThrow();
         }
       },
       FORCE_JDK {
diff --git a/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java b/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
index 1e365e2..1fe56c7 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
@@ -313,6 +313,7 @@
     assertEquals(expectedComplement, rangeSet.complement());
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testAddUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
@@ -328,6 +329,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testAddAllUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
@@ -343,6 +345,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testRemoveUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
@@ -358,6 +361,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testRemoveAllUnsupported() {
     RangeSet<Integer> rangeSet =
         ImmutableRangeSet.<Integer>builder()
diff --git a/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
index 2136f2a..1de9e69 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
@@ -62,6 +62,7 @@
  * @author Jared Levy
  */
 @GwtCompatible(emulated = true)
+@SuppressWarnings("AlwaysThrows")
 public class ImmutableSortedMapTest extends TestCase {
   // TODO: Avoid duplicating code in ImmutableMapTest
 
@@ -904,12 +905,11 @@
   }
 
   private static <K, V> void assertMapEquals(Map<K, V> map, Object... alternatingKeysAndValues) {
-    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
-    int i = 0;
-    for (Entry<K, V> entry : map.entrySet()) {
-      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
-      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+    Map<Object, Object> expected = new LinkedHashMap<>();
+    for (int i = 0; i < alternatingKeysAndValues.length; i += 2) {
+      expected.put(alternatingKeysAndValues[i], alternatingKeysAndValues[i + 1]);
     }
+    assertThat(map).containsExactlyEntriesIn(expected).inOrder();
   }
 
   private static class IntHolder implements Serializable {
diff --git a/guava-tests/test/com/google/common/collect/IteratorsTest.java b/guava-tests/test/com/google/common/collect/IteratorsTest.java
index 15f7ccc..e71c8bd 100644
--- a/guava-tests/test/com/google/common/collect/IteratorsTest.java
+++ b/guava-tests/test/com/google/common/collect/IteratorsTest.java
@@ -74,6 +74,7 @@
     return suite;
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testEmptyIterator() {
     Iterator<String> iterator = Iterators.emptyIterator();
     assertFalse(iterator.hasNext());
@@ -89,6 +90,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testEmptyListIterator() {
     ListIterator<String> iterator = Iterators.emptyListIterator();
     assertFalse(iterator.hasNext());
@@ -1119,6 +1121,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testForArrayTypical() {
     String[] array = {"foo", "bar"};
     Iterator<String> iterator = Iterators.forArray(array);
@@ -1205,6 +1208,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testForEnumerationSingleton() {
     Enumeration<Integer> enumer = enumerate(1);
     Iterator<Integer> iter = Iterators.forEnumeration(enumer);
diff --git a/guava-tests/test/com/google/common/collect/ListsTest.java b/guava-tests/test/com/google/common/collect/ListsTest.java
index ef90e54..33736d6 100644
--- a/guava-tests/test/com/google/common/collect/ListsTest.java
+++ b/guava-tests/test/com/google/common/collect/ListsTest.java
@@ -619,14 +619,14 @@
 
   public void testCartesianProduct_indexOf() {
     List<List<Integer>> actual = Lists.cartesianProduct(list(1, 2), list(3, 4));
-    assertEquals(actual.indexOf(list(1, 3)), 0);
-    assertEquals(actual.indexOf(list(1, 4)), 1);
-    assertEquals(actual.indexOf(list(2, 3)), 2);
-    assertEquals(actual.indexOf(list(2, 4)), 3);
-    assertEquals(actual.indexOf(list(3, 1)), -1);
+    assertEquals(0, actual.indexOf(list(1, 3)));
+    assertEquals(1, actual.indexOf(list(1, 4)));
+    assertEquals(2, actual.indexOf(list(2, 3)));
+    assertEquals(3, actual.indexOf(list(2, 4)));
+    assertEquals(-1, actual.indexOf(list(3, 1)));
 
-    assertEquals(actual.indexOf(list(1)), -1);
-    assertEquals(actual.indexOf(list(1, 1, 1)), -1);
+    assertEquals(-1, actual.indexOf(list(1)));
+    assertEquals(-1, actual.indexOf(list(1, 1, 1)));
   }
 
   public void testCartesianProduct_lastIndexOf() {
diff --git a/guava-tests/test/com/google/common/collect/MapMakerTest.java b/guava-tests/test/com/google/common/collect/MapMakerTest.java
index 4b54f0d..9669ded 100644
--- a/guava-tests/test/com/google/common/collect/MapMakerTest.java
+++ b/guava-tests/test/com/google/common/collect/MapMakerTest.java
@@ -57,31 +57,28 @@
    * anywhere else
    */
 
-  /** Tests for the builder. */
-  public static class MakerTest extends TestCase {
-    public void testInitialCapacity_negative() {
-      MapMaker maker = new MapMaker();
-      try {
-        maker.initialCapacity(-1);
-        fail();
-      } catch (IllegalArgumentException expected) {
-      }
+  public void testInitialCapacity_negative() {
+    MapMaker maker = new MapMaker();
+    try {
+      maker.initialCapacity(-1);
+      fail();
+    } catch (IllegalArgumentException expected) {
     }
+  }
 
-    // TODO(cpovirk): enable when ready
-    public void xtestInitialCapacity_setTwice() {
-      MapMaker maker = new MapMaker().initialCapacity(16);
-      try {
-        // even to the same value is not allowed
-        maker.initialCapacity(16);
-        fail();
-      } catch (IllegalArgumentException expected) {
-      }
+  // TODO(cpovirk): enable when ready (apparently after a change to our GWT emulation)
+  public void xtestInitialCapacity_setTwice() {
+    MapMaker maker = new MapMaker().initialCapacity(16);
+    try {
+      // even to the same value is not allowed
+      maker.initialCapacity(16);
+      fail();
+    } catch (IllegalStateException expected) {
     }
+  }
 
-    public void testReturnsPlainConcurrentHashMapWhenPossible() {
-      Map<?, ?> map = new MapMaker().initialCapacity(5).makeMap();
-      assertTrue(map instanceof ConcurrentHashMap);
-    }
+  public void testReturnsPlainConcurrentHashMapWhenPossible() {
+    Map<?, ?> map = new MapMaker().initialCapacity(5).makeMap();
+    assertTrue(map instanceof ConcurrentHashMap);
   }
 }
diff --git a/guava-tests/test/com/google/common/collect/MapsTest.java b/guava-tests/test/com/google/common/collect/MapsTest.java
index 76394c8..50df8cc 100644
--- a/guava-tests/test/com/google/common/collect/MapsTest.java
+++ b/guava-tests/test/com/google/common/collect/MapsTest.java
@@ -1153,8 +1153,8 @@
     biMap.put("two", 2);
     Converter<String, Integer> converter = Maps.asConverter(biMap);
 
-    assertSame(1, converter.convert("one"));
-    assertSame(2, converter.convert("two"));
+    assertEquals((Integer) 1, converter.convert("one"));
+    assertEquals((Integer) 2, converter.convert("two"));
     try {
       converter.convert("three");
       fail();
@@ -1163,9 +1163,9 @@
 
     biMap.put("three", 3);
 
-    assertSame(1, converter.convert("one"));
-    assertSame(2, converter.convert("two"));
-    assertSame(3, converter.convert("three"));
+    assertEquals((Integer) 1, converter.convert("one"));
+    assertEquals((Integer) 2, converter.convert("two"));
+    assertEquals((Integer) 3, converter.convert("three"));
   }
 
   public void testAsConverter_withNullMapping() throws Exception {
@@ -1231,6 +1231,51 @@
       fail("UnsupportedOperationException expected");
     } catch (UnsupportedOperationException expected) {
     }
+    try {
+      unmod.replaceAll((k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.putIfAbsent(3, "three");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.replace(3, "three", "four");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.replace(3, "four");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.computeIfAbsent(3, (k) -> k + "three");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.computeIfPresent(4, (k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.compute(4, (k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.merge(4, "four", (k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.clear();
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
 
     /* UnsupportedOperationException on indirect modifications. */
     BiMap<String, Number> inverse = unmod.inverse();
@@ -1857,6 +1902,51 @@
       fail("UnsupportedOperationException expected");
     } catch (UnsupportedOperationException expected) {
     }
+    try {
+      unmod.replaceAll((k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.putIfAbsent(3, "three");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.replace(3, "three", "four");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.replace(3, "four");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.computeIfAbsent(3, (k) -> k + "three");
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.computeIfPresent(4, (k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.compute(4, (k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.merge(4, "four", (k, v) -> v);
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
+    try {
+      unmod.clear();
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException expected) {
+    }
   }
 
   @GwtIncompatible // NavigableMap
diff --git a/guava-tests/test/com/google/common/collect/MultimapsTest.java b/guava-tests/test/com/google/common/collect/MultimapsTest.java
index 6fa9c3c..738ba10 100644
--- a/guava-tests/test/com/google/common/collect/MultimapsTest.java
+++ b/guava-tests/test/com/google/common/collect/MultimapsTest.java
@@ -667,7 +667,8 @@
     assertEquals("[3, 1, 4]", ummodifiable.get(Color.BLUE).toString());
 
     Collection<Integer> collection = multimap.get(Color.BLUE);
-    assertEquals(collection, collection);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(collection.equals(collection));
 
     assertFalse(multimap.keySet() instanceof SortedSet);
     assertFalse(multimap.asMap() instanceof SortedMap);
diff --git a/guava-tests/test/com/google/common/collect/RangeTest.java b/guava-tests/test/com/google/common/collect/RangeTest.java
index 9a2cd74..e8578bf 100644
--- a/guava-tests/test/com/google/common/collect/RangeTest.java
+++ b/guava-tests/test/com/google/common/collect/RangeTest.java
@@ -20,6 +20,7 @@
 import static com.google.common.collect.BoundType.OPEN;
 import static com.google.common.collect.DiscreteDomain.integers;
 import static com.google.common.testing.SerializableTester.reserializeAndAssert;
+import static com.google.common.truth.Truth.assertThat;
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
@@ -349,11 +350,14 @@
       range.intersection(Range.open(3, 5));
       fail();
     } catch (IllegalArgumentException expected) {
+      // TODO(kevinb): convert the rest of this file to Truth someday
+      assertThat(expected).hasMessageThat().contains("connected");
     }
     try {
       range.intersection(Range.closed(0, 2));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
   }
 
@@ -368,11 +372,13 @@
       range.intersection(Range.lessThan(3));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
     try {
       range.intersection(Range.greaterThan(4));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
 
     range = Range.closed(3, 4);
@@ -395,11 +401,13 @@
       range.intersection(Range.atLeast(4));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
     try {
       range.intersection(Range.atMost(2));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
   }
 
@@ -411,6 +419,7 @@
       range.intersection(Range.closed(0, 2));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
 
     // adjacent below
@@ -451,6 +460,7 @@
       range.intersection(Range.closed(10, 12));
       fail();
     } catch (IllegalArgumentException expected) {
+      assertThat(expected).hasMessageThat().contains("connected");
     }
   }
 
diff --git a/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java b/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java
index b6c2358..b0f9e16 100644
--- a/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java
+++ b/guava-tests/test/com/google/common/collect/RegularImmutableAsListTest.java
@@ -30,7 +30,8 @@
    */
   public void testDoesntCheckForNull() {
     ImmutableSet<Integer> set = ImmutableSet.of(1, 2, 3);
-    new RegularImmutableAsList<Integer>(set, new Object[] {null, null, null});
+    ImmutableList<Integer> unused =
+        new RegularImmutableAsList<Integer>(set, new Object[] {null, null, null});
     // shouldn't throw!
   }
 }
diff --git a/guava-tests/test/com/google/common/collect/SetOperationsTest.java b/guava-tests/test/com/google/common/collect/SetOperationsTest.java
index 7a1ec3a..9a26f29 100644
--- a/guava-tests/test/com/google/common/collect/SetOperationsTest.java
+++ b/guava-tests/test/com/google/common/collect/SetOperationsTest.java
@@ -291,92 +291,90 @@
             .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES)
             .createTestSuite());
 
-    suite.addTestSuite(MoreTests.class);
+    suite.addTestSuite(SetOperationsTest.class);
     return suite;
   }
 
-  public static class MoreTests extends TestCase {
-    Set<String> friends;
-    Set<String> enemies;
+  Set<String> friends;
+  Set<String> enemies;
 
-    @Override
-    public void setUp() {
-      friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      enemies = Sets.newHashSet("Dick", "Harry", "Tom");
-    }
+  @Override
+  public void setUp() {
+    friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  }
 
-    public void testUnion() {
-      Set<String> all = Sets.union(friends, enemies);
-      assertEquals(5, all.size());
+  public void testUnion() {
+    Set<String> all = Sets.union(friends, enemies);
+    assertEquals(5, all.size());
 
-      ImmutableSet<String> immut = Sets.union(friends, enemies).immutableCopy();
-      HashSet<String> mut = Sets.union(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.union(friends, enemies).immutableCopy();
+    HashSet<String> mut = Sets.union(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Buck");
-      assertEquals(6, all.size());
-      assertEquals(5, immut.size());
-      assertEquals(5, mut.size());
-    }
+    enemies.add("Buck");
+    assertEquals(6, all.size());
+    assertEquals(5, immut.size());
+    assertEquals(5, mut.size());
+  }
 
-    public void testIntersection() {
-      Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  public void testIntersection() {
+    Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
 
-      Set<String> frenemies = Sets.intersection(friends, enemies);
-      assertEquals(1, frenemies.size());
+    Set<String> frenemies = Sets.intersection(friends, enemies);
+    assertEquals(1, frenemies.size());
 
-      ImmutableSet<String> immut = Sets.intersection(friends, enemies).immutableCopy();
-      HashSet<String> mut = Sets.intersection(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.intersection(friends, enemies).immutableCopy();
+    HashSet<String> mut = Sets.intersection(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Joe");
-      assertEquals(2, frenemies.size());
-      assertEquals(1, immut.size());
-      assertEquals(1, mut.size());
-    }
+    enemies.add("Joe");
+    assertEquals(2, frenemies.size());
+    assertEquals(1, immut.size());
+    assertEquals(1, mut.size());
+  }
 
-    public void testDifference() {
-      Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  public void testDifference() {
+    Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
 
-      Set<String> goodFriends = Sets.difference(friends, enemies);
-      assertEquals(2, goodFriends.size());
+    Set<String> goodFriends = Sets.difference(friends, enemies);
+    assertEquals(2, goodFriends.size());
 
-      ImmutableSet<String> immut = Sets.difference(friends, enemies).immutableCopy();
-      HashSet<String> mut = Sets.difference(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.difference(friends, enemies).immutableCopy();
+    HashSet<String> mut = Sets.difference(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Dave");
-      assertEquals(1, goodFriends.size());
-      assertEquals(2, immut.size());
-      assertEquals(2, mut.size());
-    }
+    enemies.add("Dave");
+    assertEquals(1, goodFriends.size());
+    assertEquals(2, immut.size());
+    assertEquals(2, mut.size());
+  }
 
-    public void testSymmetricDifference() {
-      Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
-      Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
+  public void testSymmetricDifference() {
+    Set<String> friends = Sets.newHashSet("Tom", "Joe", "Dave");
+    Set<String> enemies = Sets.newHashSet("Dick", "Harry", "Tom");
 
-      Set<String> symmetricDifferenceFriendsFirst = Sets.symmetricDifference(friends, enemies);
-      assertEquals(4, symmetricDifferenceFriendsFirst.size());
+    Set<String> symmetricDifferenceFriendsFirst = Sets.symmetricDifference(friends, enemies);
+    assertEquals(4, symmetricDifferenceFriendsFirst.size());
 
-      Set<String> symmetricDifferenceEnemiesFirst = Sets.symmetricDifference(enemies, friends);
-      assertEquals(4, symmetricDifferenceEnemiesFirst.size());
+    Set<String> symmetricDifferenceEnemiesFirst = Sets.symmetricDifference(enemies, friends);
+    assertEquals(4, symmetricDifferenceEnemiesFirst.size());
 
-      assertEquals(symmetricDifferenceFriendsFirst, symmetricDifferenceEnemiesFirst);
+    assertEquals(symmetricDifferenceFriendsFirst, symmetricDifferenceEnemiesFirst);
 
-      ImmutableSet<String> immut = Sets.symmetricDifference(friends, enemies).immutableCopy();
-      HashSet<String> mut =
-          Sets.symmetricDifference(friends, enemies).copyInto(new HashSet<String>());
+    ImmutableSet<String> immut = Sets.symmetricDifference(friends, enemies).immutableCopy();
+    HashSet<String> mut =
+        Sets.symmetricDifference(friends, enemies).copyInto(new HashSet<String>());
 
-      enemies.add("Dave");
-      assertEquals(3, symmetricDifferenceFriendsFirst.size());
-      assertEquals(4, immut.size());
-      assertEquals(4, mut.size());
+    enemies.add("Dave");
+    assertEquals(3, symmetricDifferenceFriendsFirst.size());
+    assertEquals(4, immut.size());
+    assertEquals(4, mut.size());
 
-      immut = Sets.symmetricDifference(enemies, friends).immutableCopy();
-      mut = Sets.symmetricDifference(enemies, friends).copyInto(new HashSet<String>());
-      friends.add("Harry");
-      assertEquals(2, symmetricDifferenceEnemiesFirst.size());
-      assertEquals(3, immut.size());
-      assertEquals(3, mut.size());
-    }
+    immut = Sets.symmetricDifference(enemies, friends).immutableCopy();
+    mut = Sets.symmetricDifference(enemies, friends).copyInto(new HashSet<String>());
+    friends.add("Harry");
+    assertEquals(2, symmetricDifferenceEnemiesFirst.size());
+    assertEquals(3, immut.size());
+    assertEquals(3, mut.size());
   }
 }
diff --git a/guava-tests/test/com/google/common/collect/SetsTest.java b/guava-tests/test/com/google/common/collect/SetsTest.java
index 86cb6c8..72131bf 100644
--- a/guava-tests/test/com/google/common/collect/SetsTest.java
+++ b/guava-tests/test/com/google/common/collect/SetsTest.java
@@ -326,6 +326,7 @@
     D
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testImmutableEnumSet() {
     Set<SomeEnum> units = Sets.immutableEnumSet(SomeEnum.D, SomeEnum.B);
 
diff --git a/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java b/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
index b07802a..2e15eda 100644
--- a/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
+++ b/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
@@ -216,15 +216,15 @@
   }
 
   public void testEquals() {
-    create().equals(new HashMap<String, Integer>());
+    boolean unused = create().equals(new HashMap<String, Integer>());
   }
 
   public void testHashCode() {
-    create().hashCode();
+    int unused = create().hashCode();
   }
 
   public void testToString() {
-    create().toString();
+    String unused = create().toString();
   }
 
   public void testSerialization() {
diff --git a/guava-tests/test/com/google/common/collect/TableCollectorsTest.java b/guava-tests/test/com/google/common/collect/TableCollectorsTest.java
index 98b7074..9a1fe5b 100644
--- a/guava-tests/test/com/google/common/collect/TableCollectorsTest.java
+++ b/guava-tests/test/com/google/common/collect/TableCollectorsTest.java
@@ -31,252 +31,231 @@
 
 /** Unit tests for {@link TableCollectors}. */
 @GwtCompatible(emulated = true)
-public class TableCollectorsTest {
+public class TableCollectorsTest extends TestCase {
+  public void testToImmutableTable() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
+    BiPredicate<ImmutableTable<String, String, Integer>, ImmutableTable<String, String, Integer>>
+        equivalence = pairwiseOnResultOf(ImmutableTable::cellSet);
+    CollectorTester.of(collector, equivalence)
+        .expectCollects(
+            new ImmutableTable.Builder<String, String, Integer>()
+                .put("one", "uno", 1)
+                .put("two", "dos", 2)
+                .put("three", "tres", 3)
+                .build(),
+            immutableCell("one", "uno", 1),
+            immutableCell("two", "dos", 2),
+            immutableCell("three", "tres", 3));
+  }
 
-  public static final class ToImmutableTableTest extends TestCase {
-    public void testToImmutableTable() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
-      BiPredicate<ImmutableTable<String, String, Integer>, ImmutableTable<String, String, Integer>>
-          equivalence = pairwiseOnResultOf(ImmutableTable::cellSet);
-      CollectorTester.of(collector, equivalence)
-          .expectCollects(
-              new ImmutableTable.Builder<String, String, Integer>()
-                  .put("one", "uno", 1)
-                  .put("two", "dos", 2)
-                  .put("three", "tres", 3)
-                  .build(),
-              immutableCell("one", "uno", 1),
-              immutableCell("two", "dos", 2),
-              immutableCell("three", "tres", 3));
-    }
-
-    public void testToImmutableTableConflict() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
-      try {
-        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2))
-            .collect(collector);
-        fail("Expected IllegalArgumentException");
-      } catch (IllegalArgumentException expected) {
-      }
-    }
-
-    public void testToImmutableTableNullRowKey() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(t -> null, Cell::getColumnKey, Cell::getValue);
-      try {
-        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-    }
-
-    public void testToImmutableTableNullColumnKey() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector = TableCollectors.toImmutableTable(Cell::getRowKey, t -> null, Cell::getValue);
-      try {
-        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-    }
-
-    public void testToImmutableTableNullValue() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, t -> null);
-      try {
-        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-      collector =
-          TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
-      try {
-        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", (Integer) null))
-            .collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-    }
-
-    public void testToImmutableTableMerging() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(
-                  Cell::getRowKey, Cell::getColumnKey, Cell::getValue, Integer::sum);
-      BiPredicate<ImmutableTable<String, String, Integer>, ImmutableTable<String, String, Integer>>
-          equivalence = pairwiseOnResultOf(ImmutableTable::cellSet);
-      CollectorTester.of(collector, equivalence)
-          .expectCollects(
-              new ImmutableTable.Builder<String, String, Integer>()
-                  .put("one", "uno", 1)
-                  .put("two", "dos", 6)
-                  .put("three", "tres", 3)
-                  .build(),
-              immutableCell("one", "uno", 1),
-              immutableCell("two", "dos", 2),
-              immutableCell("three", "tres", 3),
-              immutableCell("two", "dos", 4));
-    }
-
-    public void testToImmutableTableMergingNullRowKey() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(
-                  t -> null, Cell::getColumnKey, Cell::getValue, Integer::sum);
-      try {
-        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-    }
-
-    public void testToImmutableTableMergingNullColumnKey() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(
-                  Cell::getRowKey, t -> null, Cell::getValue, Integer::sum);
-      try {
-        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-    }
-
-    public void testToImmutableTableMergingNullValue() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(
-                  Cell::getRowKey, Cell::getColumnKey, t -> null, Integer::sum);
-      try {
-        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-      collector =
-          TableCollectors.toImmutableTable(
-              Cell::getRowKey,
-              Cell::getColumnKey,
-              Cell::getValue,
-              (i, j) -> MoreObjects.firstNonNull(i, 0) + MoreObjects.firstNonNull(j, 0));
-      try {
-        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", (Integer) null))
-            .collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
-    }
-
-    public void testToImmutableTableMergingNullMerge() {
-      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
-          collector =
-              TableCollectors.toImmutableTable(
-                  Cell::getRowKey, Cell::getColumnKey, Cell::getValue, (v1, v2) -> null);
-      try {
-        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2))
-            .collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
+  public void testToImmutableTableConflict() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
+    try {
+      Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2)).collect(collector);
+      fail("Expected IllegalArgumentException");
+    } catch (IllegalArgumentException expected) {
     }
   }
 
-  public static final class ToTableTest extends TestCase {
-
-    public void testToTable() {
-      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-          TableCollectors.toTable(
-              Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
-      BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
-          pairwiseOnResultOf(Table::cellSet);
-      CollectorTester.of(collector, equivalence)
-          .expectCollects(
-              new ImmutableTable.Builder<String, String, Integer>()
-                  .put("one", "uno", 1)
-                  .put("two", "dos", 2)
-                  .put("three", "tres", 3)
-                  .build(),
-              immutableCell("one", "uno", 1),
-              immutableCell("two", "dos", 2),
-              immutableCell("three", "tres", 3));
+  public void testToImmutableTableNullRowKey() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(t -> null, Cell::getColumnKey, Cell::getValue);
+    try {
+      Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
     }
+  }
 
-    public void testToTableNullMerge() {
-      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-          TableCollectors.toTable(
-              Cell::getRowKey,
-              Cell::getColumnKey,
-              Cell::getValue,
-              (Integer v1, Integer v2) -> null,
-              HashBasedTable::create);
-      BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
-          pairwiseOnResultOf(Table::cellSet);
-      CollectorTester.of(collector, equivalence)
-          .expectCollects(
-              ImmutableTable.of(), immutableCell("one", "uno", 1), immutableCell("one", "uno", 2));
+  public void testToImmutableTableNullColumnKey() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(Cell::getRowKey, t -> null, Cell::getValue);
+    try {
+      Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
     }
+  }
 
-    public void testToTableNullValues() {
-      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-          TableCollectors.toTable(
-              Cell::getRowKey,
-              Cell::getColumnKey,
-              Cell::getValue,
-              () -> ArrayTable.create(ImmutableList.of("one"), ImmutableList.of("uno")));
-      try {
-        Stream.of(immutableCell("one", "uno", (Integer) null)).collect(collector);
-        fail("Expected NullPointerException");
-      } catch (NullPointerException expected) {
-      }
+  public void testToImmutableTableNullValue() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, t -> null);
+    try {
+      Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
     }
+    collector =
+        TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
+    try {
+      Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", (Integer) null))
+          .collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
+    }
+  }
 
-    public void testToTableConflict() {
-      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-          TableCollectors.toTable(
-              Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
-      try {
-        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2))
-            .collect(collector);
-        fail("Expected IllegalStateException");
-      } catch (IllegalStateException expected) {
-      }
-    }
+  public void testToImmutableTableMerging() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(
+            Cell::getRowKey, Cell::getColumnKey, Cell::getValue, Integer::sum);
+    BiPredicate<ImmutableTable<String, String, Integer>, ImmutableTable<String, String, Integer>>
+        equivalence = pairwiseOnResultOf(ImmutableTable::cellSet);
+    CollectorTester.of(collector, equivalence)
+        .expectCollects(
+            new ImmutableTable.Builder<String, String, Integer>()
+                .put("one", "uno", 1)
+                .put("two", "dos", 6)
+                .put("three", "tres", 3)
+                .build(),
+            immutableCell("one", "uno", 1),
+            immutableCell("two", "dos", 2),
+            immutableCell("three", "tres", 3),
+            immutableCell("two", "dos", 4));
+  }
 
-    public void testToTableMerging() {
-      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-          TableCollectors.toTable(
-              Cell::getRowKey,
-              Cell::getColumnKey,
-              Cell::getValue,
-              Integer::sum,
-              HashBasedTable::create);
-      BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
-          pairwiseOnResultOf(Table::cellSet);
-      CollectorTester.of(collector, equivalence)
-          .expectCollects(
-              new ImmutableTable.Builder<String, String, Integer>()
-                  .put("one", "uno", 1)
-                  .put("two", "dos", 6)
-                  .put("three", "tres", 3)
-                  .build(),
-              immutableCell("one", "uno", 1),
-              immutableCell("two", "dos", 2),
-              immutableCell("three", "tres", 3),
-              immutableCell("two", "dos", 4));
+  public void testToImmutableTableMergingNullRowKey() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(
+            t -> null, Cell::getColumnKey, Cell::getValue, Integer::sum);
+    try {
+      Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
     }
   }
 
+  public void testToImmutableTableMergingNullColumnKey() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(Cell::getRowKey, t -> null, Cell::getValue, Integer::sum);
+    try {
+      Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
+    }
+  }
+
+  public void testToImmutableTableMergingNullValue() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(
+            Cell::getRowKey, Cell::getColumnKey, t -> null, Integer::sum);
+    try {
+      Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
+    }
+    collector =
+        TableCollectors.toImmutableTable(
+            Cell::getRowKey,
+            Cell::getColumnKey,
+            Cell::getValue,
+            (i, j) -> MoreObjects.firstNonNull(i, 0) + MoreObjects.firstNonNull(j, 0));
+    try {
+      Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", (Integer) null))
+          .collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
+    }
+  }
+
+  public void testToImmutableTableMergingNullMerge() {
+    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
+        TableCollectors.toImmutableTable(
+            Cell::getRowKey, Cell::getColumnKey, Cell::getValue, (v1, v2) -> null);
+    try {
+      Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
+    }
+  }
+
+  public void testToTable() {
+    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+        TableCollectors.toTable(
+            Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
+    BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
+        pairwiseOnResultOf(Table::cellSet);
+    CollectorTester.of(collector, equivalence)
+        .expectCollects(
+            new ImmutableTable.Builder<String, String, Integer>()
+                .put("one", "uno", 1)
+                .put("two", "dos", 2)
+                .put("three", "tres", 3)
+                .build(),
+            immutableCell("one", "uno", 1),
+            immutableCell("two", "dos", 2),
+            immutableCell("three", "tres", 3));
+  }
+
+  public void testToTableNullMerge() {
+    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+        TableCollectors.toTable(
+            Cell::getRowKey,
+            Cell::getColumnKey,
+            Cell::getValue,
+            (Integer v1, Integer v2) -> null,
+            HashBasedTable::create);
+    BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
+        pairwiseOnResultOf(Table::cellSet);
+    CollectorTester.of(collector, equivalence)
+        .expectCollects(
+            ImmutableTable.of(), immutableCell("one", "uno", 1), immutableCell("one", "uno", 2));
+  }
+
+  public void testToTableNullValues() {
+    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+        TableCollectors.toTable(
+            Cell::getRowKey,
+            Cell::getColumnKey,
+            Cell::getValue,
+            () -> ArrayTable.create(ImmutableList.of("one"), ImmutableList.of("uno")));
+    try {
+      Stream.of(immutableCell("one", "uno", (Integer) null)).collect(collector);
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
+    }
+  }
+
+  public void testToTableConflict() {
+    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+        TableCollectors.toTable(
+            Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
+    try {
+      Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2)).collect(collector);
+      fail("Expected IllegalStateException");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testToTableMerging() {
+    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+        TableCollectors.toTable(
+            Cell::getRowKey,
+            Cell::getColumnKey,
+            Cell::getValue,
+            Integer::sum,
+            HashBasedTable::create);
+    BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
+        pairwiseOnResultOf(Table::cellSet);
+    CollectorTester.of(collector, equivalence)
+        .expectCollects(
+            new ImmutableTable.Builder<String, String, Integer>()
+                .put("one", "uno", 1)
+                .put("two", "dos", 6)
+                .put("three", "tres", 3)
+                .build(),
+            immutableCell("one", "uno", 1),
+            immutableCell("two", "dos", 2),
+            immutableCell("three", "tres", 3),
+            immutableCell("two", "dos", 4));
+  }
+
   // This function specifically returns a BiPredicate, because Guava7’s Equivalence class does not
   // actually implement BiPredicate, and CollectorTests expects a BiPredicate.
   static <C, E, R extends Iterable<E>> BiPredicate<C, C> pairwiseOnResultOf(Function<C, R> arg) {
     Equivalence<C> equivalence = Equivalence.equals().<E>pairwise().onResultOf(arg);
     return equivalence::equivalent;
   }
-
-  private TableCollectorsTest() {}
 }
diff --git a/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java b/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java
index 77ecbf7..5e474aa 100644
--- a/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java
+++ b/guava-tests/test/com/google/common/collect/UnmodifiableIteratorTest.java
@@ -29,6 +29,7 @@
 @GwtCompatible
 public class UnmodifiableIteratorTest extends TestCase {
 
+  @SuppressWarnings("DoNotCall")
   public void testRemove() {
     final String[] array = {"a", "b", "c"};
 
diff --git a/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java b/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java
index c9d3068..36a017d 100644
--- a/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java
+++ b/guava-tests/test/com/google/common/collect/UnmodifiableListIteratorTest.java
@@ -29,6 +29,7 @@
  */
 @GwtCompatible
 public class UnmodifiableListIteratorTest extends TestCase {
+  @SuppressWarnings("DoNotCall")
   public void testRemove() {
     Iterator<String> iterator = create();
 
@@ -41,6 +42,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testAdd() {
     ListIterator<String> iterator = create();
 
@@ -55,6 +57,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testSet() {
     ListIterator<String> iterator = create();
 
diff --git a/guava-tests/test/com/google/common/escape/EscapersTest.java b/guava-tests/test/com/google/common/escape/EscapersTest.java
index 245560a..4422320 100644
--- a/guava-tests/test/com/google/common/escape/EscapersTest.java
+++ b/guava-tests/test/com/google/common/escape/EscapersTest.java
@@ -85,7 +85,7 @@
                 .put('x', "<hello>".toCharArray())
                 .put('\uD800', "<hi>".toCharArray())
                 .put('\uDC00', "<lo>".toCharArray())
-                .build());
+                .buildOrThrow());
     UnicodeEscaper unicodeEscaper = Escapers.asUnicodeEscaper(charEscaper);
     EscaperAsserts.assertBasic(unicodeEscaper);
     assertEquals("<hello><hi><lo>", charEscaper.escape("x\uD800\uDC00"));
diff --git a/guava-tests/test/com/google/common/eventbus/outside/AbstractEventBusTest.java b/guava-tests/test/com/google/common/eventbus/outside/AbstractEventBusTest.java
new file mode 100644
index 0000000..f4af7a7
--- /dev/null
+++ b/guava-tests/test/com/google/common/eventbus/outside/AbstractEventBusTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import com.google.common.eventbus.EventBus;
+import junit.framework.TestCase;
+
+/**
+ * Abstract base class for tests that EventBus finds the correct subscribers.
+ *
+ * <p>The actual tests are distributed among the other classes in this package based on whether they
+ * are annotated or abstract in the superclass.
+ *
+ * <p>This test must be outside the c.g.c.eventbus package to test correctly.
+ *
+ * @author Louis Wasserman
+ */
+abstract class AbstractEventBusTest<H> extends TestCase {
+  static final Object EVENT = new Object();
+
+  abstract H createSubscriber();
+
+  private H subscriber;
+
+  H getSubscriber() {
+    return subscriber;
+  }
+
+  @Override
+  protected void setUp() throws Exception {
+    subscriber = createSubscriber();
+    EventBus bus = new EventBus();
+    bus.register(subscriber);
+    bus.post(EVENT);
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    subscriber = null;
+  }
+}
diff --git a/guava-tests/test/com/google/common/eventbus/outside/AbstractNotAnnotatedInSuperclassTest.java b/guava-tests/test/com/google/common/eventbus/outside/AbstractNotAnnotatedInSuperclassTest.java
new file mode 100644
index 0000000..a391fcb
--- /dev/null
+++ b/guava-tests/test/com/google/common/eventbus/outside/AbstractNotAnnotatedInSuperclassTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.AbstractNotAnnotatedInSuperclassTest.SubClass;
+import java.util.List;
+
+public class AbstractNotAnnotatedInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  abstract static class SuperClass {
+    public abstract void overriddenInSubclassNowhereAnnotated(Object o);
+
+    public abstract void overriddenAndAnnotatedInSubclass(Object o);
+  }
+
+  static class SubClass extends SuperClass {
+    final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+
+    @Override
+    public void overriddenInSubclassNowhereAnnotated(Object o) {
+      overriddenInSubclassNowhereAnnotatedEvents.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testOverriddenInSubclassNowhereAnnotated() {
+    assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/guava-tests/test/com/google/common/eventbus/outside/AnnotatedAndAbstractInSuperclassTest.java b/guava-tests/test/com/google/common/eventbus/outside/AnnotatedAndAbstractInSuperclassTest.java
new file mode 100644
index 0000000..aea17c3
--- /dev/null
+++ b/guava-tests/test/com/google/common/eventbus/outside/AnnotatedAndAbstractInSuperclassTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.AnnotatedAndAbstractInSuperclassTest.SubClass;
+import java.util.List;
+
+public class AnnotatedAndAbstractInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  abstract static class SuperClass {
+    @Subscribe
+    public abstract void overriddenAndAnnotatedInSubclass(Object o);
+
+    @Subscribe
+    public abstract void overriddenInSubclass(Object o);
+  }
+
+  static class SubClass extends SuperClass {
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+    final List<Object> overriddenInSubclassEvents = Lists.newArrayList();
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+
+    @Override
+    public void overriddenInSubclass(Object o) {
+      overriddenInSubclassEvents.add(o);
+    }
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testOverriddenNotAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenInSubclassEvents).contains(EVENT);
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/guava-tests/test/com/google/common/eventbus/outside/AnnotatedNotAbstractInSuperclassTest.java b/guava-tests/test/com/google/common/eventbus/outside/AnnotatedNotAbstractInSuperclassTest.java
new file mode 100644
index 0000000..3ec8ea4
--- /dev/null
+++ b/guava-tests/test/com/google/common/eventbus/outside/AnnotatedNotAbstractInSuperclassTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.AnnotatedNotAbstractInSuperclassTest.SubClass;
+import java.util.List;
+
+public class AnnotatedNotAbstractInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  static class SuperClass {
+    final List<Object> notOverriddenInSubclassEvents = Lists.newArrayList();
+    final List<Object> overriddenNotAnnotatedInSubclassEvents = Lists.newArrayList();
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+    final List<Object> differentlyOverriddenNotAnnotatedInSubclassBadEvents = Lists.newArrayList();
+    final List<Object> differentlyOverriddenAnnotatedInSubclassBadEvents = Lists.newArrayList();
+
+    @Subscribe
+    public void notOverriddenInSubclass(Object o) {
+      notOverriddenInSubclassEvents.add(o);
+    }
+
+    @Subscribe
+    public void overriddenNotAnnotatedInSubclass(Object o) {
+      overriddenNotAnnotatedInSubclassEvents.add(o);
+    }
+
+    @Subscribe
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+
+    @Subscribe
+    public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
+      // the subclass overrides this and does *not* call super.dONAIS(o)
+      differentlyOverriddenNotAnnotatedInSubclassBadEvents.add(o);
+    }
+
+    @Subscribe
+    public void differentlyOverriddenAnnotatedInSubclass(Object o) {
+      // the subclass overrides this and does *not* call super.dOAIS(o)
+      differentlyOverriddenAnnotatedInSubclassBadEvents.add(o);
+    }
+  }
+
+  static class SubClass extends SuperClass {
+    final List<Object> differentlyOverriddenNotAnnotatedInSubclassGoodEvents = Lists.newArrayList();
+    final List<Object> differentlyOverriddenAnnotatedInSubclassGoodEvents = Lists.newArrayList();
+
+    @Override
+    public void overriddenNotAnnotatedInSubclass(Object o) {
+      super.overriddenNotAnnotatedInSubclass(o);
+    }
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      super.overriddenAndAnnotatedInSubclass(o);
+    }
+
+    @Override
+    public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
+      differentlyOverriddenNotAnnotatedInSubclassGoodEvents.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void differentlyOverriddenAnnotatedInSubclass(Object o) {
+      differentlyOverriddenAnnotatedInSubclassGoodEvents.add(o);
+    }
+  }
+
+  public void testNotOverriddenInSubclass() {
+    assertThat(getSubscriber().notOverriddenInSubclassEvents).contains(EVENT);
+  }
+
+  public void testOverriddenNotAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenNotAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testDifferentlyOverriddenNotAnnotatedInSubclass() {
+    assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassGoodEvents)
+        .contains(EVENT);
+    assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassBadEvents).isEmpty();
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  public void testDifferentlyOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassGoodEvents).contains(EVENT);
+    assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassBadEvents).isEmpty();
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/guava-tests/test/com/google/common/eventbus/outside/AnnotatedSubscriberFinderTests.java b/guava-tests/test/com/google/common/eventbus/outside/AnnotatedSubscriberFinderTests.java
deleted file mode 100644
index a1cbb59..0000000
--- a/guava-tests/test/com/google/common/eventbus/outside/AnnotatedSubscriberFinderTests.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Copyright (C) 2012 The Guava Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.common.eventbus.outside;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Lists;
-import com.google.common.eventbus.EventBus;
-import com.google.common.eventbus.Subscribe;
-import java.util.List;
-import junit.framework.TestCase;
-
-/**
- * Test that EventBus finds the correct subscribers.
- *
- * <p>This test must be outside the c.g.c.eventbus package to test correctly.
- *
- * @author Louis Wasserman
- */
-public class AnnotatedSubscriberFinderTests {
-
-  private static final Object EVENT = new Object();
-
-  abstract static class AbstractEventBusTest<H> extends TestCase {
-    abstract H createSubscriber();
-
-    private H subscriber;
-
-    H getSubscriber() {
-      return subscriber;
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-      subscriber = createSubscriber();
-      EventBus bus = new EventBus();
-      bus.register(subscriber);
-      bus.post(EVENT);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-      subscriber = null;
-    }
-  }
-
-  /*
-   * We break the tests up based on whether they are annotated or abstract in the superclass.
-   */
-  public static class BaseSubscriberFinderTest
-      extends AbstractEventBusTest<BaseSubscriberFinderTest.Subscriber> {
-    static class Subscriber {
-      final List<Object> nonSubscriberEvents = Lists.newArrayList();
-      final List<Object> subscriberEvents = Lists.newArrayList();
-
-      public void notASubscriber(Object o) {
-        nonSubscriberEvents.add(o);
-      }
-
-      @Subscribe
-      public void subscriber(Object o) {
-        subscriberEvents.add(o);
-      }
-    }
-
-    public void testNonSubscriber() {
-      assertThat(getSubscriber().nonSubscriberEvents).isEmpty();
-    }
-
-    public void testSubscriber() {
-      assertThat(getSubscriber().subscriberEvents).contains(EVENT);
-    }
-
-    @Override
-    Subscriber createSubscriber() {
-      return new Subscriber();
-    }
-  }
-
-  public static class AnnotatedAndAbstractInSuperclassTest
-      extends AbstractEventBusTest<AnnotatedAndAbstractInSuperclassTest.SubClass> {
-    abstract static class SuperClass {
-      @Subscribe
-      public abstract void overriddenAndAnnotatedInSubclass(Object o);
-
-      @Subscribe
-      public abstract void overriddenInSubclass(Object o);
-    }
-
-    static class SubClass extends SuperClass {
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-      final List<Object> overriddenInSubclassEvents = Lists.newArrayList();
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-
-      @Override
-      public void overriddenInSubclass(Object o) {
-        overriddenInSubclassEvents.add(o);
-      }
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testOverriddenNotAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenInSubclassEvents).contains(EVENT);
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class AnnotatedNotAbstractInSuperclassTest
-      extends AbstractEventBusTest<AnnotatedNotAbstractInSuperclassTest.SubClass> {
-    static class SuperClass {
-      final List<Object> notOverriddenInSubclassEvents = Lists.newArrayList();
-      final List<Object> overriddenNotAnnotatedInSubclassEvents = Lists.newArrayList();
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-      final List<Object> differentlyOverriddenNotAnnotatedInSubclassBadEvents =
-          Lists.newArrayList();
-      final List<Object> differentlyOverriddenAnnotatedInSubclassBadEvents = Lists.newArrayList();
-
-      @Subscribe
-      public void notOverriddenInSubclass(Object o) {
-        notOverriddenInSubclassEvents.add(o);
-      }
-
-      @Subscribe
-      public void overriddenNotAnnotatedInSubclass(Object o) {
-        overriddenNotAnnotatedInSubclassEvents.add(o);
-      }
-
-      @Subscribe
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-
-      @Subscribe
-      public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
-        // the subclass overrides this and does *not* call super.dONAIS(o)
-        differentlyOverriddenNotAnnotatedInSubclassBadEvents.add(o);
-      }
-
-      @Subscribe
-      public void differentlyOverriddenAnnotatedInSubclass(Object o) {
-        // the subclass overrides this and does *not* call super.dOAIS(o)
-        differentlyOverriddenAnnotatedInSubclassBadEvents.add(o);
-      }
-    }
-
-    static class SubClass extends SuperClass {
-      final List<Object> differentlyOverriddenNotAnnotatedInSubclassGoodEvents =
-          Lists.newArrayList();
-      final List<Object> differentlyOverriddenAnnotatedInSubclassGoodEvents = Lists.newArrayList();
-
-      @Override
-      public void overriddenNotAnnotatedInSubclass(Object o) {
-        super.overriddenNotAnnotatedInSubclass(o);
-      }
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        super.overriddenAndAnnotatedInSubclass(o);
-      }
-
-      @Override
-      public void differentlyOverriddenNotAnnotatedInSubclass(Object o) {
-        differentlyOverriddenNotAnnotatedInSubclassGoodEvents.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void differentlyOverriddenAnnotatedInSubclass(Object o) {
-        differentlyOverriddenAnnotatedInSubclassGoodEvents.add(o);
-      }
-    }
-
-    public void testNotOverriddenInSubclass() {
-      assertThat(getSubscriber().notOverriddenInSubclassEvents).contains(EVENT);
-    }
-
-    public void testOverriddenNotAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenNotAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testDifferentlyOverriddenNotAnnotatedInSubclass() {
-      assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassGoodEvents)
-          .contains(EVENT);
-      assertThat(getSubscriber().differentlyOverriddenNotAnnotatedInSubclassBadEvents).isEmpty();
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testDifferentlyOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassGoodEvents)
-          .contains(EVENT);
-      assertThat(getSubscriber().differentlyOverriddenAnnotatedInSubclassBadEvents).isEmpty();
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class AbstractNotAnnotatedInSuperclassTest
-      extends AbstractEventBusTest<AbstractNotAnnotatedInSuperclassTest.SubClass> {
-    abstract static class SuperClass {
-      public abstract void overriddenInSubclassNowhereAnnotated(Object o);
-
-      public abstract void overriddenAndAnnotatedInSubclass(Object o);
-    }
-
-    static class SubClass extends SuperClass {
-      final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-
-      @Override
-      public void overriddenInSubclassNowhereAnnotated(Object o) {
-        overriddenInSubclassNowhereAnnotatedEvents.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    public void testOverriddenInSubclassNowhereAnnotated() {
-      assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class NeitherAbstractNorAnnotatedInSuperclassTest
-      extends AbstractEventBusTest<NeitherAbstractNorAnnotatedInSuperclassTest.SubClass> {
-    static class SuperClass {
-      final List<Object> neitherOverriddenNorAnnotatedEvents = Lists.newArrayList();
-      final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
-      final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
-
-      public void neitherOverriddenNorAnnotated(Object o) {
-        neitherOverriddenNorAnnotatedEvents.add(o);
-      }
-
-      public void overriddenInSubclassNowhereAnnotated(Object o) {
-        overriddenInSubclassNowhereAnnotatedEvents.add(o);
-      }
-
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        overriddenAndAnnotatedInSubclassEvents.add(o);
-      }
-    }
-
-    static class SubClass extends SuperClass {
-      @Override
-      public void overriddenInSubclassNowhereAnnotated(Object o) {
-        super.overriddenInSubclassNowhereAnnotated(o);
-      }
-
-      @Subscribe
-      @Override
-      public void overriddenAndAnnotatedInSubclass(Object o) {
-        super.overriddenAndAnnotatedInSubclass(o);
-      }
-    }
-
-    public void testNeitherOverriddenNorAnnotated() {
-      assertThat(getSubscriber().neitherOverriddenNorAnnotatedEvents).isEmpty();
-    }
-
-    public void testOverriddenInSubclassNowhereAnnotated() {
-      assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
-    }
-
-    public void testOverriddenAndAnnotatedInSubclass() {
-      assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
-    }
-
-    @Override
-    SubClass createSubscriber() {
-      return new SubClass();
-    }
-  }
-
-  public static class DeepInterfaceTest
-      extends AbstractEventBusTest<DeepInterfaceTest.SubscriberClass> {
-    interface Interface1 {
-      @Subscribe
-      void annotatedIn1(Object o);
-
-      @Subscribe
-      void annotatedIn1And2(Object o);
-
-      @Subscribe
-      void annotatedIn1And2AndClass(Object o);
-
-      void declaredIn1AnnotatedIn2(Object o);
-
-      void declaredIn1AnnotatedInClass(Object o);
-
-      void nowhereAnnotated(Object o);
-    }
-
-    interface Interface2 extends Interface1 {
-      @Override
-      @Subscribe
-      void declaredIn1AnnotatedIn2(Object o);
-
-      @Override
-      @Subscribe
-      void annotatedIn1And2(Object o);
-
-      @Override
-      @Subscribe
-      void annotatedIn1And2AndClass(Object o);
-
-      void declaredIn2AnnotatedInClass(Object o);
-
-      @Subscribe
-      void annotatedIn2(Object o);
-    }
-
-    static class SubscriberClass implements Interface2 {
-      final List<Object> annotatedIn1Events = Lists.newArrayList();
-      final List<Object> annotatedIn1And2Events = Lists.newArrayList();
-      final List<Object> annotatedIn1And2AndClassEvents = Lists.newArrayList();
-      final List<Object> declaredIn1AnnotatedIn2Events = Lists.newArrayList();
-      final List<Object> declaredIn1AnnotatedInClassEvents = Lists.newArrayList();
-      final List<Object> declaredIn2AnnotatedInClassEvents = Lists.newArrayList();
-      final List<Object> annotatedIn2Events = Lists.newArrayList();
-      final List<Object> nowhereAnnotatedEvents = Lists.newArrayList();
-
-      @Override
-      public void annotatedIn1(Object o) {
-        annotatedIn1Events.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void declaredIn1AnnotatedInClass(Object o) {
-        declaredIn1AnnotatedInClassEvents.add(o);
-      }
-
-      @Override
-      public void declaredIn1AnnotatedIn2(Object o) {
-        declaredIn1AnnotatedIn2Events.add(o);
-      }
-
-      @Override
-      public void annotatedIn1And2(Object o) {
-        annotatedIn1And2Events.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void annotatedIn1And2AndClass(Object o) {
-        annotatedIn1And2AndClassEvents.add(o);
-      }
-
-      @Subscribe
-      @Override
-      public void declaredIn2AnnotatedInClass(Object o) {
-        declaredIn2AnnotatedInClassEvents.add(o);
-      }
-
-      @Override
-      public void annotatedIn2(Object o) {
-        annotatedIn2Events.add(o);
-      }
-
-      @Override
-      public void nowhereAnnotated(Object o) {
-        nowhereAnnotatedEvents.add(o);
-      }
-    }
-
-    public void testAnnotatedIn1() {
-      assertThat(getSubscriber().annotatedIn1Events).contains(EVENT);
-    }
-
-    public void testAnnotatedIn2() {
-      assertThat(getSubscriber().annotatedIn2Events).contains(EVENT);
-    }
-
-    public void testAnnotatedIn1And2() {
-      assertThat(getSubscriber().annotatedIn1And2Events).contains(EVENT);
-    }
-
-    public void testAnnotatedIn1And2AndClass() {
-      assertThat(getSubscriber().annotatedIn1And2AndClassEvents).contains(EVENT);
-    }
-
-    public void testDeclaredIn1AnnotatedIn2() {
-      assertThat(getSubscriber().declaredIn1AnnotatedIn2Events).contains(EVENT);
-    }
-
-    public void testDeclaredIn1AnnotatedInClass() {
-      assertThat(getSubscriber().declaredIn1AnnotatedInClassEvents).contains(EVENT);
-    }
-
-    public void testDeclaredIn2AnnotatedInClass() {
-      assertThat(getSubscriber().declaredIn2AnnotatedInClassEvents).contains(EVENT);
-    }
-
-    public void testNowhereAnnotated() {
-      assertThat(getSubscriber().nowhereAnnotatedEvents).isEmpty();
-    }
-
-    @Override
-    SubscriberClass createSubscriber() {
-      return new SubscriberClass();
-    }
-  }
-}
diff --git a/guava-tests/test/com/google/common/eventbus/outside/BaseSubscriberFinderTest.java b/guava-tests/test/com/google/common/eventbus/outside/BaseSubscriberFinderTest.java
new file mode 100644
index 0000000..461fb79
--- /dev/null
+++ b/guava-tests/test/com/google/common/eventbus/outside/BaseSubscriberFinderTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.BaseSubscriberFinderTest.Subscriber;
+import java.util.List;
+
+public class BaseSubscriberFinderTest extends AbstractEventBusTest<Subscriber> {
+  static class Subscriber {
+    final List<Object> nonSubscriberEvents = Lists.newArrayList();
+    final List<Object> subscriberEvents = Lists.newArrayList();
+
+    public void notASubscriber(Object o) {
+      nonSubscriberEvents.add(o);
+    }
+
+    @Subscribe
+    public void subscriber(Object o) {
+      subscriberEvents.add(o);
+    }
+  }
+
+  public void testNonSubscriber() {
+    assertThat(getSubscriber().nonSubscriberEvents).isEmpty();
+  }
+
+  public void testSubscriber() {
+    assertThat(getSubscriber().subscriberEvents).contains(EVENT);
+  }
+
+  @Override
+  Subscriber createSubscriber() {
+    return new Subscriber();
+  }
+}
diff --git a/guava-tests/test/com/google/common/eventbus/outside/DeepInterfaceTest.java b/guava-tests/test/com/google/common/eventbus/outside/DeepInterfaceTest.java
new file mode 100644
index 0000000..4fefbc1
--- /dev/null
+++ b/guava-tests/test/com/google/common/eventbus/outside/DeepInterfaceTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.DeepInterfaceTest.SubscriberClass;
+import java.util.List;
+
+public class DeepInterfaceTest extends AbstractEventBusTest<SubscriberClass> {
+  interface Interface1 {
+    @Subscribe
+    void annotatedIn1(Object o);
+
+    @Subscribe
+    void annotatedIn1And2(Object o);
+
+    @Subscribe
+    void annotatedIn1And2AndClass(Object o);
+
+    void declaredIn1AnnotatedIn2(Object o);
+
+    void declaredIn1AnnotatedInClass(Object o);
+
+    void nowhereAnnotated(Object o);
+  }
+
+  interface Interface2 extends Interface1 {
+    @Override
+    @Subscribe
+    void declaredIn1AnnotatedIn2(Object o);
+
+    @Override
+    @Subscribe
+    void annotatedIn1And2(Object o);
+
+    @Override
+    @Subscribe
+    void annotatedIn1And2AndClass(Object o);
+
+    void declaredIn2AnnotatedInClass(Object o);
+
+    @Subscribe
+    void annotatedIn2(Object o);
+  }
+
+  static class SubscriberClass implements Interface2 {
+    final List<Object> annotatedIn1Events = Lists.newArrayList();
+    final List<Object> annotatedIn1And2Events = Lists.newArrayList();
+    final List<Object> annotatedIn1And2AndClassEvents = Lists.newArrayList();
+    final List<Object> declaredIn1AnnotatedIn2Events = Lists.newArrayList();
+    final List<Object> declaredIn1AnnotatedInClassEvents = Lists.newArrayList();
+    final List<Object> declaredIn2AnnotatedInClassEvents = Lists.newArrayList();
+    final List<Object> annotatedIn2Events = Lists.newArrayList();
+    final List<Object> nowhereAnnotatedEvents = Lists.newArrayList();
+
+    @Override
+    public void annotatedIn1(Object o) {
+      annotatedIn1Events.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void declaredIn1AnnotatedInClass(Object o) {
+      declaredIn1AnnotatedInClassEvents.add(o);
+    }
+
+    @Override
+    public void declaredIn1AnnotatedIn2(Object o) {
+      declaredIn1AnnotatedIn2Events.add(o);
+    }
+
+    @Override
+    public void annotatedIn1And2(Object o) {
+      annotatedIn1And2Events.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void annotatedIn1And2AndClass(Object o) {
+      annotatedIn1And2AndClassEvents.add(o);
+    }
+
+    @Subscribe
+    @Override
+    public void declaredIn2AnnotatedInClass(Object o) {
+      declaredIn2AnnotatedInClassEvents.add(o);
+    }
+
+    @Override
+    public void annotatedIn2(Object o) {
+      annotatedIn2Events.add(o);
+    }
+
+    @Override
+    public void nowhereAnnotated(Object o) {
+      nowhereAnnotatedEvents.add(o);
+    }
+  }
+
+  public void testAnnotatedIn1() {
+    assertThat(getSubscriber().annotatedIn1Events).contains(EVENT);
+  }
+
+  public void testAnnotatedIn2() {
+    assertThat(getSubscriber().annotatedIn2Events).contains(EVENT);
+  }
+
+  public void testAnnotatedIn1And2() {
+    assertThat(getSubscriber().annotatedIn1And2Events).contains(EVENT);
+  }
+
+  public void testAnnotatedIn1And2AndClass() {
+    assertThat(getSubscriber().annotatedIn1And2AndClassEvents).contains(EVENT);
+  }
+
+  public void testDeclaredIn1AnnotatedIn2() {
+    assertThat(getSubscriber().declaredIn1AnnotatedIn2Events).contains(EVENT);
+  }
+
+  public void testDeclaredIn1AnnotatedInClass() {
+    assertThat(getSubscriber().declaredIn1AnnotatedInClassEvents).contains(EVENT);
+  }
+
+  public void testDeclaredIn2AnnotatedInClass() {
+    assertThat(getSubscriber().declaredIn2AnnotatedInClassEvents).contains(EVENT);
+  }
+
+  public void testNowhereAnnotated() {
+    assertThat(getSubscriber().nowhereAnnotatedEvents).isEmpty();
+  }
+
+  @Override
+  SubscriberClass createSubscriber() {
+    return new SubscriberClass();
+  }
+}
diff --git a/guava-tests/test/com/google/common/eventbus/outside/NeitherAbstractNorAnnotatedInSuperclassTest.java b/guava-tests/test/com/google/common/eventbus/outside/NeitherAbstractNorAnnotatedInSuperclassTest.java
new file mode 100644
index 0000000..a2aca55
--- /dev/null
+++ b/guava-tests/test/com/google/common/eventbus/outside/NeitherAbstractNorAnnotatedInSuperclassTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2012 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.eventbus.outside;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.eventbus.outside.NeitherAbstractNorAnnotatedInSuperclassTest.SubClass;
+import java.util.List;
+
+public class NeitherAbstractNorAnnotatedInSuperclassTest extends AbstractEventBusTest<SubClass> {
+  static class SuperClass {
+    final List<Object> neitherOverriddenNorAnnotatedEvents = Lists.newArrayList();
+    final List<Object> overriddenInSubclassNowhereAnnotatedEvents = Lists.newArrayList();
+    final List<Object> overriddenAndAnnotatedInSubclassEvents = Lists.newArrayList();
+
+    public void neitherOverriddenNorAnnotated(Object o) {
+      neitherOverriddenNorAnnotatedEvents.add(o);
+    }
+
+    public void overriddenInSubclassNowhereAnnotated(Object o) {
+      overriddenInSubclassNowhereAnnotatedEvents.add(o);
+    }
+
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      overriddenAndAnnotatedInSubclassEvents.add(o);
+    }
+  }
+
+  static class SubClass extends SuperClass {
+    @Override
+    public void overriddenInSubclassNowhereAnnotated(Object o) {
+      super.overriddenInSubclassNowhereAnnotated(o);
+    }
+
+    @Subscribe
+    @Override
+    public void overriddenAndAnnotatedInSubclass(Object o) {
+      super.overriddenAndAnnotatedInSubclass(o);
+    }
+  }
+
+  public void testNeitherOverriddenNorAnnotated() {
+    assertThat(getSubscriber().neitherOverriddenNorAnnotatedEvents).isEmpty();
+  }
+
+  public void testOverriddenInSubclassNowhereAnnotated() {
+    assertThat(getSubscriber().overriddenInSubclassNowhereAnnotatedEvents).isEmpty();
+  }
+
+  public void testOverriddenAndAnnotatedInSubclass() {
+    assertThat(getSubscriber().overriddenAndAnnotatedInSubclassEvents).contains(EVENT);
+  }
+
+  @Override
+  SubClass createSubscriber() {
+    return new SubClass();
+  }
+}
diff --git a/guava-tests/test/com/google/common/hash/BloomFilterTest.java b/guava-tests/test/com/google/common/hash/BloomFilterTest.java
index 411e097..9530666 100644
--- a/guava-tests/test/com/google/common/hash/BloomFilterTest.java
+++ b/guava-tests/test/com/google/common/hash/BloomFilterTest.java
@@ -522,7 +522,10 @@
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     bf.writeTo(out);
 
-    assertEquals(bf, BloomFilter.readFrom(new ByteArrayInputStream(out.toByteArray()), funnel));
+    BloomFilter<byte[]> read =
+        BloomFilter.readFrom(new ByteArrayInputStream(out.toByteArray()), funnel);
+    assertThat(read).isEqualTo(bf);
+    assertThat(read.expectedFpp()).isGreaterThan(0);
   }
 
   /**
diff --git a/guava-tests/test/com/google/common/hash/Fingerprint2011Test.java b/guava-tests/test/com/google/common/hash/Fingerprint2011Test.java
new file mode 100644
index 0000000..effa632
--- /dev/null
+++ b/guava-tests/test/com/google/common/hash/Fingerprint2011Test.java
@@ -0,0 +1,233 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package com.google.common.hash;
+
+import static com.google.common.base.Charsets.ISO_8859_1;
+import static com.google.common.base.Charsets.UTF_8;
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.UnsignedLong;
+import java.util.Arrays;
+import junit.framework.TestCase;
+
+/**
+ * Unit test for Fingerprint2011.
+ *
+ * @author kylemaddison@google.com (Kyle Maddison)
+ */
+public class Fingerprint2011Test extends TestCase {
+
+  // Length of the sample string to produce
+  private static final int MAX_BYTES = 1000;
+
+  // Map from sample string lengths to the fingerprint
+  private static final ImmutableSortedMap<Integer, Long> LENGTH_FINGERPRINTS =
+      new ImmutableSortedMap.Builder<Integer, Long>(Ordering.natural())
+          .put(1000, 0x433109b33e13e6edL)
+          .put(800, 0x5f2f123bfc815f81L)
+          .put(640, 0x6396fc6a67293cf4L)
+          .put(512, 0x45c01b4934ddbbbeL)
+          .put(409, 0xfcd19b617551db45L)
+          .put(327, 0x4eee69e12854871eL)
+          .put(261, 0xab753446a3bbd532L)
+          .put(208, 0x54242fe06a291c3fL)
+          .put(166, 0x4f7acff7703a635bL)
+          .put(132, 0xa784bd0a1f22cc7fL)
+          .put(105, 0xf19118e187456638L)
+          .put(84, 0x3e2e58f9196abfe5L)
+          .put(67, 0xd38ae3dec0107aeaL)
+          .put(53, 0xea3033885868e10eL)
+          .put(42, 0x1394a146d0d7e04bL)
+          .put(33, 0x9962499315d2e8daL)
+          .put(26, 0x0849f5cfa85489b5L)
+          .put(20, 0x83b395ff19bf2171L)
+          .put(16, 0x9d33dd141bd55d9aL)
+          .put(12, 0x196248eb0b02466aL)
+          .put(9, 0x1cf73a50ff120336L)
+          .put(7, 0xb451c339457dbf51L)
+          .put(5, 0x681982c5e7b74064L)
+          .put(4, 0xc5ce47450ca6c021L)
+          .put(3, 0x9fcc3c3fde4d5ff7L)
+          .put(2, 0x090966a836e5fa4bL)
+          .put(1, 0x8199675ecaa6fe64L)
+          .put(0, 0x23ad7c904aa665e3L)
+          .build();
+  private static final HashFunction HASH_FN = Hashing.fingerprint2011();
+
+  // If this test fails, all bets are off
+  public void testReallySimpleFingerprints() {
+    assertEquals(8473225671271759044L, fingerprint("test".getBytes(UTF_8)));
+    // 32 characters long
+    assertEquals(7345148637025587076L, fingerprint(Strings.repeat("test", 8).getBytes(UTF_8)));
+    // 256 characters long
+    assertEquals(4904844928629814570L, fingerprint(Strings.repeat("test", 64).getBytes(UTF_8)));
+  }
+
+  public void testStringsConsistency() {
+    for (String s : Arrays.asList("", "some", "test", "strings", "to", "try")) {
+      assertEquals(HASH_FN.newHasher().putUnencodedChars(s).hash(), HASH_FN.hashUnencodedChars(s));
+    }
+  }
+
+  public void testUtf8() {
+    char[] charsA = new char[128];
+    char[] charsB = new char[128];
+
+    for (int i = 0; i < charsA.length; i++) {
+      if (i < 100) {
+        charsA[i] = 'a';
+        charsB[i] = 'a';
+      } else {
+        // Both two-byte characters, but must be different
+        charsA[i] = (char) (0x0180 + i);
+        charsB[i] = (char) (0x0280 + i);
+      }
+    }
+
+    String stringA = new String(charsA);
+    String stringB = new String(charsB);
+    assertThat(stringA).isNotEqualTo(stringB);
+    assertThat(HASH_FN.hashUnencodedChars(stringA))
+        .isNotEqualTo(HASH_FN.hashUnencodedChars(stringB));
+    assertThat(fingerprint(stringA.getBytes(UTF_8)))
+        .isNotEqualTo(fingerprint(stringB.getBytes(UTF_8)));
+
+    // ISO 8859-1 only has 0-255 (ubyte) representation so throws away UTF-8 characters
+    // greater than 127 (ie with their top bit set).
+    // Don't attempt to do this in real code.
+    assertEquals(
+        fingerprint(stringA.getBytes(ISO_8859_1)), fingerprint(stringB.getBytes(ISO_8859_1)));
+  }
+
+  public void testMumurHash64() {
+    byte[] bytes = "test".getBytes(UTF_8);
+    assertEquals(
+        1618900948208871284L, Fingerprint2011.murmurHash64WithSeed(bytes, 0, bytes.length, 1));
+
+    bytes = "test test test".getBytes(UTF_8);
+    assertEquals(
+        UnsignedLong.valueOf("12313169684067793560").longValue(),
+        Fingerprint2011.murmurHash64WithSeed(bytes, 0, bytes.length, 1));
+  }
+
+  public void testPutNonChars() {
+    Hasher hasher = HASH_FN.newHasher();
+    // Expected data is 0x0100010100000000
+    hasher
+        .putBoolean(true)
+        .putBoolean(true)
+        .putBoolean(false)
+        .putBoolean(true)
+        .putBoolean(false)
+        .putBoolean(false)
+        .putBoolean(false)
+        .putBoolean(false);
+    final long hashCode = hasher.hash().asLong();
+
+    hasher = HASH_FN.newHasher();
+    hasher
+        .putByte((byte) 0x01)
+        .putByte((byte) 0x01)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x01)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x00)
+        .putByte((byte) 0x00);
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher
+        .putChar((char) 0x0101)
+        .putChar((char) 0x0100)
+        .putChar((char) 0x0000)
+        .putChar((char) 0x0000);
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher.putBytes(new byte[] {0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00});
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher.putLong(0x0000000001000101L);
+    assertEquals(hashCode, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher
+        .putShort((short) 0x0101)
+        .putShort((short) 0x0100)
+        .putShort((short) 0x0000)
+        .putShort((short) 0x0000);
+    assertEquals(hashCode, hasher.hash().asLong());
+  }
+
+  public void testHashFloatIsStable() {
+    // This is about the best we can do for floating-point
+    Hasher hasher = HASH_FN.newHasher();
+    hasher.putFloat(0x01000101f).putFloat(0f);
+    assertEquals(0x96a4f8cc6ecbf16L, hasher.hash().asLong());
+
+    hasher = HASH_FN.newHasher();
+    hasher.putDouble(0x0000000001000101d);
+    assertEquals(0xcf54171253fdc198L, hasher.hash().asLong());
+  }
+
+  /** Convenience method to compute a fingerprint on a full bytes array. */
+  private static long fingerprint(byte[] bytes) {
+    return fingerprint(bytes, bytes.length);
+  }
+
+  /** Convenience method to compute a fingerprint on a subset of a byte array. */
+  private static long fingerprint(byte[] bytes, int length) {
+    return HASH_FN.hashBytes(bytes, 0, length).asLong();
+  }
+
+  /**
+   * Tests that the Java port of Fingerprint2011 provides the same results on buffers up to 800
+   * bytes long as the original implementation in C++. See http://cl/106539598
+   */
+  public void testMultipleLengths() {
+    int iterations = 800;
+    byte[] buf = new byte[iterations * 4];
+    int bufLen = 0;
+    long h = 0;
+    for (int i = 0; i < iterations; ++i) {
+      h ^= fingerprint(buf, i);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      h ^= fingerprint(buf, i * i % bufLen);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      h ^= fingerprint(buf, i * i * i % bufLen);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      h ^= fingerprint(buf, bufLen);
+      h = remix(h);
+      buf[bufLen++] = getChar(h);
+
+      int x0 = buf[bufLen - 1] & 0xff;
+      int x1 = buf[bufLen - 2] & 0xff;
+      int x2 = buf[bufLen - 3] & 0xff;
+      int x3 = buf[bufLen / 2] & 0xff;
+      buf[((x0 << 16) + (x1 << 8) + x2) % bufLen] ^= x3;
+      buf[((x1 << 16) + (x2 << 8) + x3) % bufLen] ^= i % 256;
+    }
+    assertEquals(0xeaa3b1c985261632L, h);
+  }
+
+  private static long remix(long h) {
+    h ^= h >>> 41;
+    h *= 949921979;
+    return h;
+  }
+
+  private static byte getChar(long h) {
+    return (byte) ('a' + ((h & 0xfffff) % 26));
+  }
+}
diff --git a/guava-tests/test/com/google/common/hash/HashingTest.java b/guava-tests/test/com/google/common/hash/HashingTest.java
index bc3db34..aff5c25 100644
--- a/guava-tests/test/com/google/common/hash/HashingTest.java
+++ b/guava-tests/test/com/google/common/hash/HashingTest.java
@@ -125,6 +125,15 @@
         Hashing.sipHash24().toString());
   }
 
+  public void testFingerprint2011() {
+    HashTestUtils.check2BitAvalanche(Hashing.fingerprint2011(), 100, 0.4);
+    HashTestUtils.checkAvalanche(Hashing.fingerprint2011(), 100, 0.4);
+    HashTestUtils.checkNo2BitCharacteristics(Hashing.fingerprint2011());
+    HashTestUtils.checkNoFunnels(Hashing.fingerprint2011());
+    HashTestUtils.assertInvariants(Hashing.fingerprint2011());
+    assertEquals("Hashing.fingerprint2011()", Hashing.fingerprint2011().toString());
+  }
+
   @AndroidIncompatible // slow TODO(cpovirk): Maybe just reduce iterations under Android.
   public void testGoodFastHash() {
     for (int i = 1; i < 200; i += 17) {
@@ -492,6 +501,9 @@
           .put(Hashing.farmHashFingerprint64(), EMPTY_STRING, "4f40902f3b6ae19a")
           .put(Hashing.farmHashFingerprint64(), TQBFJOTLD, "34511b3bf383beab")
           .put(Hashing.farmHashFingerprint64(), TQBFJOTLDP, "737d7e5f8660653e")
+          .put(Hashing.fingerprint2011(), EMPTY_STRING, "e365a64a907cad23")
+          .put(Hashing.fingerprint2011(), TQBFJOTLD, "c9688c84e813b089")
+          .put(Hashing.fingerprint2011(), TQBFJOTLDP, "a714d70f1d569cd0")
           .build();
 
   public void testAllHashFunctionsHaveKnownHashes() throws Exception {
diff --git a/guava-tests/test/com/google/common/io/ByteStreamsTest.java b/guava-tests/test/com/google/common/io/ByteStreamsTest.java
index 3ae2c25..dddae1f 100644
--- a/guava-tests/test/com/google/common/io/ByteStreamsTest.java
+++ b/guava-tests/test/com/google/common/io/ByteStreamsTest.java
@@ -562,12 +562,49 @@
     // write to the output stream
     nos.write('n');
     String test = "Test string for NullOutputStream";
-    nos.write(test.getBytes());
-    nos.write(test.getBytes(), 2, 10);
+    byte[] bytes = test.getBytes(Charsets.US_ASCII);
+    nos.write(bytes);
+    nos.write(bytes, 2, 10);
+    nos.write(bytes, bytes.length - 5, 5);
     // nothing really to assert?
     assertSame(ByteStreams.nullOutputStream(), ByteStreams.nullOutputStream());
   }
 
+  public void testNullOutputStream_exceptions() throws Exception {
+    OutputStream nos = ByteStreams.nullOutputStream();
+    try {
+      nos.write(null);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+    try {
+      nos.write(null, 0, 1);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+    byte[] tenBytes = new byte[10];
+    try {
+      nos.write(tenBytes, -1, 1);
+      fail("Expected exception from negative offset");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+    try {
+      nos.write(tenBytes, 1, -1);
+      fail("Expected exception from negative length");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+    try {
+      nos.write(tenBytes, 9, 2);
+      fail("Expected exception from offset+length > array size");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+    try {
+      nos.write(tenBytes, 9, 100);
+      fail("Expected exception from offset+length > array size");
+    } catch (IndexOutOfBoundsException expected) {
+    }
+  }
+
   public void testLimit() throws Exception {
     byte[] big = newPreFilledByteArray(5);
     InputStream bin = new ByteArrayInputStream(big);
diff --git a/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java b/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java
index f8e40df..160df41 100644
--- a/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java
+++ b/guava-tests/test/com/google/common/io/LittleEndianDataInputStreamTest.java
@@ -92,6 +92,7 @@
     }
   }
 
+  @SuppressWarnings("DoNotCall")
   public void testReadLine() throws IOException {
     DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
     try {
diff --git a/guava-tests/test/com/google/common/io/SourceSinkTester.java b/guava-tests/test/com/google/common/io/SourceSinkTester.java
index 9b07355..55a302f 100644
--- a/guava-tests/test/com/google/common/io/SourceSinkTester.java
+++ b/guava-tests/test/com/google/common/io/SourceSinkTester.java
@@ -69,7 +69,7 @@
           .put("\\n at EOF", "hello\nworld\n")
           .put("\\r at EOF", "hello\nworld\r")
           .put("lorem ipsum", LOREM_IPSUM)
-          .build();
+          .buildOrThrow();
 
   protected final F factory;
   protected final T data;
diff --git a/guava-tests/test/com/google/common/math/IntMathTest.java b/guava-tests/test/com/google/common/math/IntMathTest.java
index 12b23e2..4db13ad 100644
--- a/guava-tests/test/com/google/common/math/IntMathTest.java
+++ b/guava-tests/test/com/google/common/math/IntMathTest.java
@@ -137,10 +137,11 @@
   @GwtIncompatible // BigIntegerMath // TODO(cpovirk): GWT-enable BigIntegerMath
   public void testConstantsHalfPowersOf10() {
     for (int i = 0; i < IntMath.halfPowersOf10.length; i++) {
-      assert IntMath.halfPowersOf10[i]
-          == Math.min(
+      assertEquals(
+          IntMath.halfPowersOf10[i],
+          Math.min(
               Integer.MAX_VALUE,
-              BigIntegerMath.sqrt(BigInteger.TEN.pow(2 * i + 1), FLOOR).longValue());
+              BigIntegerMath.sqrt(BigInteger.TEN.pow(2 * i + 1), FLOOR).longValue()));
     }
   }
 
diff --git a/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java b/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java
index 54d310f..ddb2064 100644
--- a/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java
+++ b/guava-tests/test/com/google/common/math/QuantilesAlgorithm.java
@@ -53,7 +53,7 @@
       for (int index : indexes) {
         builder.put(index, singleQuantileFromSorted(index, scale, dataset));
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
 
     private double singleQuantileFromSorted(int index, int scale, double[] dataset) {
@@ -97,7 +97,7 @@
       for (int index : indexes) {
         builder.put(index, singleQuantile(index, scale, dataset));
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
   },
 
diff --git a/guava-tests/test/com/google/common/math/QuantilesTest.java b/guava-tests/test/com/google/common/math/QuantilesTest.java
index a9b7872..e5d113d 100644
--- a/guava-tests/test/com/google/common/math/QuantilesTest.java
+++ b/guava-tests/test/com/google/common/math/QuantilesTest.java
@@ -557,7 +557,7 @@
         }
         assertThat(percentiles().indexes(index1, index2).compute(PSEUDORANDOM_DATASET))
             .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
-            .containsExactlyEntriesIn(expectedBuilder.build());
+            .containsExactlyEntriesIn(expectedBuilder.buildOrThrow());
       }
     }
   }
@@ -573,7 +573,7 @@
     Collections.shuffle(indexes, random);
     assertThat(percentiles().indexes(Ints.toArray(indexes)).compute(PSEUDORANDOM_DATASET))
         .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
-        .containsExactlyEntriesIn(expectedBuilder.build());
+        .containsExactlyEntriesIn(expectedBuilder.buildOrThrow());
   }
 
   @AndroidIncompatible // slow
@@ -589,7 +589,7 @@
     Collections.shuffle(indexes, random);
     assertThat(percentiles().indexes(Ints.toArray(indexes)).computeInPlace(dataset))
         .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
-        .containsExactlyEntriesIn(expectedBuilder.build());
+        .containsExactlyEntriesIn(expectedBuilder.buildOrThrow());
     assertThat(dataset).usingExactEquality().containsExactlyElementsIn(PSEUDORANDOM_DATASET);
   }
 
diff --git a/guava-tests/test/com/google/common/net/HostSpecifierTest.java b/guava-tests/test/com/google/common/net/HostSpecifierTest.java
index fadeff7..8112879 100644
--- a/guava-tests/test/com/google/common/net/HostSpecifierTest.java
+++ b/guava-tests/test/com/google/common/net/HostSpecifierTest.java
@@ -92,8 +92,9 @@
   }
 
   private void assertGood(String spec) throws ParseException {
-    HostSpecifier.fromValid(spec); // Throws exception if not working correctly
-    HostSpecifier.from(spec);
+    // Throws exception if not working correctly
+    HostSpecifier unused = HostSpecifier.fromValid(spec);
+    unused = HostSpecifier.from(spec);
     assertTrue(HostSpecifier.isValid(spec));
   }
 
diff --git a/guava-tests/test/com/google/common/net/InternetDomainNameTest.java b/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
index 7113fb4..c440ee5 100644
--- a/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
+++ b/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
@@ -232,7 +232,7 @@
 
   public void testValid() {
     for (String name : VALID_NAME) {
-      InternetDomainName.from(name);
+      InternetDomainName unused = InternetDomainName.from(name);
     }
   }
 
@@ -392,7 +392,7 @@
     // These would throw an exception if leniency were not preserved during parent() and child()
     // calls.
     InternetDomainName child = parent.child(LOTS_OF_DELTAS);
-    child.child(LOTS_OF_DELTAS);
+    InternetDomainName unused = child.child(LOTS_OF_DELTAS);
   }
 
   public void testValidTopPrivateDomain() {
diff --git a/guava-tests/test/com/google/common/net/PercentEscaperTest.java b/guava-tests/test/com/google/common/net/PercentEscaperTest.java
index 8443680..e600e4c 100644
--- a/guava-tests/test/com/google/common/net/PercentEscaperTest.java
+++ b/guava-tests/test/com/google/common/net/PercentEscaperTest.java
@@ -120,16 +120,11 @@
     }
   }
 
-  /**
-   * Tests that if space is a safe character you cannot also specify 'plusForSpace' (throws {@link
-   * IllegalArgumentException}).
-   */
   public void testBadArguments_plusforspace() {
-    try {
-      new PercentEscaper(" ", false);
-    } catch (IllegalArgumentException e) {
-      fail("Space can be a 'safe' character if plusForSpace is false");
-    }
+    // space can be a safe char if plusForSpace is false
+    PercentEscaper unused = new PercentEscaper(" ", false);
+
+    // space cannot be a safe char is plusForSpace is true
     String msg = "plusForSpace cannot be specified when space is a 'safe' character";
     try {
       new PercentEscaper(" ", true);
diff --git a/guava-tests/test/com/google/common/primitives/BooleansTest.java b/guava-tests/test/com/google/common/primitives/BooleansTest.java
index 560c337..43ec04c 100644
--- a/guava-tests/test/com/google/common/primitives/BooleansTest.java
+++ b/guava-tests/test/com/google/common/primitives/BooleansTest.java
@@ -299,7 +299,8 @@
     assertEquals(1, Booleans.asList(ARRAY_FALSE_TRUE).lastIndexOf(true));
     List<Boolean> reference = Booleans.asList(ARRAY_FALSE);
     assertEquals(Booleans.asList(ARRAY_FALSE), reference);
-    assertEquals(reference, reference);
+    // Explicitly call `equals`; `assertEquals` might return fast
+    assertTrue(reference.equals(reference));
   }
 
   public void testAsListHashcode() {
diff --git a/guava-tests/test/com/google/common/reflect/InvokableTest.java b/guava-tests/test/com/google/common/reflect/InvokableTest.java
index 3e51c82..5e15d66 100644
--- a/guava-tests/test/com/google/common/reflect/InvokableTest.java
+++ b/guava-tests/test/com/google/common/reflect/InvokableTest.java
@@ -601,7 +601,7 @@
   }
 
   public void testAnonymousClassInConstructor() {
-    new AnonymousClassInConstructor();
+    AnonymousClassInConstructor unused = new AnonymousClassInConstructor();
   }
 
   private static class AnonymousClassInConstructor {
@@ -621,7 +621,7 @@
   }
 
   public void testLocalClassInInstanceInitializer() {
-    new LocalClassInInstanceInitializer();
+    LocalClassInInstanceInitializer unused = new LocalClassInInstanceInitializer();
   }
 
   private static class LocalClassInInstanceInitializer {
@@ -633,7 +633,7 @@
   }
 
   public void testLocalClassInStaticInitializer() {
-    new LocalClassInStaticInitializer();
+    LocalClassInStaticInitializer unused = new LocalClassInStaticInitializer();
   }
 
   private static class LocalClassInStaticInitializer {
@@ -645,7 +645,8 @@
   }
 
   public void testLocalClassWithSeeminglyHiddenThisInStaticInitializer_BUG() {
-    new LocalClassWithSeeminglyHiddenThisInStaticInitializer();
+    LocalClassWithSeeminglyHiddenThisInStaticInitializer unused =
+        new LocalClassWithSeeminglyHiddenThisInStaticInitializer();
   }
 
   /**
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
index f49b962..991cada 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
@@ -359,7 +359,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testOverflowTimeout() throws Exception {
     // First, sanity check that naive multiplication would really overflow to a negative number:
     long nanosPerSecond = NANOSECONDS.convert(1, SECONDS);
diff --git a/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractClosingFutureTest.java
similarity index 91%
rename from guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
rename to guava-tests/test/com/google/common/util/concurrent/AbstractClosingFutureTest.java
index ab0e5f8..ecccd78 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractClosingFutureTest.java
@@ -81,7 +81,7 @@
  * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)} paths to complete a
  * {@link ClosingFuture} pipeline.
  */
-public abstract class ClosingFutureTest extends TestCase {
+public abstract class AbstractClosingFutureTest extends TestCase {
   // TODO(dpb): Use Expect once that supports JUnit 3, or we can use JUnit 4.
   final List<AssertionError> failures = new ArrayList<>();
   final StandardSubjectBuilder expect =
@@ -1633,7 +1633,7 @@
 
   /**
    * Marks the given step final and waits for it to fail. Expects the failure exception to match
-   * {@link ClosingFutureTest#exception}.
+   * {@link AbstractClosingFutureTest#exception}.
    */
   abstract void assertFinallyFailsWithException(ClosingFuture<?> closingFuture);
 
@@ -1645,191 +1645,6 @@
     assertTrue(awaitUninterruptibly(closingFuture.whenClosedCountDown(), 1, SECONDS));
   }
 
-  /** Tests for {@link ClosingFuture} that exercise {@link ClosingFuture#finishToFuture()}. */
-
-  public static class FinishToFutureTest extends ClosingFutureTest {
-
-    public void testFinishToFuture_throwsIfCalledTwice() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
-      try {
-        FluentFuture<Closeable> unused2 = closingFuture.finishToFuture();
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    public void testFinishToFuture_throwsAfterCallingFinishToValueAndCloser() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), directExecutor());
-      try {
-        FluentFuture<Closeable> unused = closingFuture.finishToFuture();
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    public void testFinishToFuture_preventsFurtherDerivation() {
-      ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
-      FluentFuture<String> unused = closingFuture.finishToFuture();
-      assertDerivingThrowsIllegalStateException(closingFuture);
-    }
-
-    @Override
-    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
-      return getUninterruptibly(closingFuture.finishToFuture());
-    }
-
-    @Override
-    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
-      assertThatFutureFailsWithException(closingFuture.finishToFuture());
-    }
-
-    @Override
-    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
-      assertThatFutureBecomesCancelled(closingFuture.finishToFuture());
-    }
-
-    @Override
-    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
-      assertThat(closingFuture.finishToFuture().cancel(false)).isTrue();
-      waitUntilClosed(closingFuture);
-      futureCancelled.countDown();
-    }
-  }
-
-  /**
-   * Tests for {@link ClosingFuture} that exercise {@link
-   * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)}.
-   */
-
-  public static class FinishToValueAndCloserTest extends ClosingFutureTest {
-
-    private final ExecutorService finishToValueAndCloserExecutor = newSingleThreadExecutor();
-    private volatile ValueAndCloser<?> valueAndCloser;
-
-    @Override
-    protected void tearDown() throws Exception {
-      super.tearDown();
-      assertWithMessage("finishToValueAndCloserExecutor was shut down")
-          .that(shutdownAndAwaitTermination(finishToValueAndCloserExecutor, 10, SECONDS))
-          .isTrue();
-    }
-
-    public void testFinishToValueAndCloser_throwsIfCalledTwice() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      closingFuture.finishToValueAndCloser(
-          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
-      try {
-        closingFuture.finishToValueAndCloser(
-            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    public void testFinishToValueAndCloser_throwsAfterCallingFinishToFuture() throws Exception {
-      ClosingFuture<Closeable> closingFuture =
-          ClosingFuture.submit(
-              new ClosingCallable<Closeable>() {
-                @Override
-                public Closeable call(DeferredCloser closer) throws Exception {
-                  return closer.eventuallyClose(mockCloseable, executor);
-                }
-              },
-              executor);
-      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
-      try {
-        closingFuture.finishToValueAndCloser(
-            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
-        fail("should have thrown");
-      } catch (IllegalStateException expected) {
-      }
-    }
-
-    @Override
-    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
-      return finishToValueAndCloser(closingFuture).get();
-    }
-
-    @Override
-    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
-      assertThatFutureFailsWithException(closingFuture.statusFuture());
-      ValueAndCloser<?> valueAndCloser = finishToValueAndCloser(closingFuture);
-      try {
-        valueAndCloser.get();
-        fail();
-      } catch (ExecutionException expected) {
-        assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
-      }
-      valueAndCloser.closeAsync();
-    }
-
-    @Override
-    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
-      assertThatFutureBecomesCancelled(closingFuture.statusFuture());
-    }
-
-    @Override
-    void waitUntilClosed(ClosingFuture<?> closingFuture) {
-      if (valueAndCloser != null) {
-        valueAndCloser.closeAsync();
-      }
-      super.waitUntilClosed(closingFuture);
-    }
-
-    @Override
-    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
-      assertThat(closingFuture.cancel(false)).isTrue();
-      ValueAndCloser<?> unused = finishToValueAndCloser(closingFuture);
-      waitUntilClosed(closingFuture);
-      futureCancelled.countDown();
-    }
-
-    private <V> ValueAndCloser<V> finishToValueAndCloser(ClosingFuture<V> closingFuture) {
-      final CountDownLatch valueAndCloserSet = new CountDownLatch(1);
-      closingFuture.finishToValueAndCloser(
-          new ValueAndCloserConsumer<V>() {
-            @Override
-            public void accept(ValueAndCloser<V> valueAndCloser) {
-              FinishToValueAndCloserTest.this.valueAndCloser = valueAndCloser;
-              valueAndCloserSet.countDown();
-            }
-          },
-          finishToValueAndCloserExecutor);
-      assertWithMessage("valueAndCloser was set")
-          .that(awaitUninterruptibly(valueAndCloserSet, 10, SECONDS))
-          .isTrue();
-      @SuppressWarnings("unchecked")
-      ValueAndCloser<V> valueAndCloserWithType = (ValueAndCloser<V>) valueAndCloser;
-      return valueAndCloserWithType;
-    }
-  }
-
   void assertThatFutureFailsWithException(Future<?> future) {
     try {
       getUninterruptibly(future);
@@ -1839,7 +1654,7 @@
     }
   }
 
-  private static void assertThatFutureBecomesCancelled(Future<?> future) throws ExecutionException {
+  static void assertThatFutureBecomesCancelled(Future<?> future) throws ExecutionException {
     try {
       getUninterruptibly(future);
       fail("Expected future to be canceled: " + future);
@@ -2006,7 +1821,7 @@
     }
   }
 
-  private static final class NoOpValueAndCloserConsumer<V> implements ValueAndCloserConsumer<V> {
+  static final class NoOpValueAndCloserConsumer<V> implements ValueAndCloserConsumer<V> {
     @Override
     public void accept(ValueAndCloser<V> valueAndCloser) {}
   }
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
index 557fc0b..9b3f0f8 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
@@ -68,7 +68,6 @@
         thrownByExecutionThread);
   }
 
-
   public void testServiceStartStop() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     assertFalse(service.startUpCalled);
@@ -85,7 +84,6 @@
     executionThread.join();
   }
 
-
   public void testServiceStopIdempotence() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
 
@@ -102,7 +100,6 @@
     executionThread.join();
   }
 
-
   public void testServiceExitingOnItsOwn() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     service.expectedShutdownState = Service.State.RUNNING;
@@ -173,7 +170,6 @@
     }
   }
 
-
   public void testServiceThrowOnStartUp() throws Exception {
     ThrowOnStartUpService service = new ThrowOnStartUpService();
     assertFalse(service.startUpCalled);
@@ -212,7 +208,6 @@
     }
   }
 
-
   public void testServiceThrowOnRun() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
 
@@ -229,7 +224,6 @@
     assertEquals(Service.State.FAILED, service.state());
   }
 
-
   public void testServiceThrowOnRunAndThenAgainOnShutDown() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
     service.throwOnShutDown = true;
@@ -271,7 +265,6 @@
     }
   }
 
-
   public void testServiceThrowOnShutDown() throws Exception {
     ThrowOnShutDown service = new ThrowOnShutDown();
 
@@ -331,7 +324,6 @@
     protected void run() throws Exception {}
   }
 
-
   public void testStopWhileStarting_runNotCalled() throws Exception {
     final CountDownLatch started = new CountDownLatch(1);
     FakeService service =
@@ -361,7 +353,6 @@
     assertEquals(0, service.shutdownCalled);
   }
 
-
   public void testDefaultService() throws InterruptedException {
     WaitOnRunService service = new WaitOnRunService();
     service.startAsync().awaitRunning();
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java
index 6c921b5..9aee780 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureCancellationCauseTest.java
@@ -30,6 +30,7 @@
 import junit.framework.TestCase;
 
 /** Tests for {@link AbstractFuture} with the cancellation cause system property set */
+@AndroidIncompatible // custom classloading
 
 public class AbstractFutureCancellationCauseTest extends TestCase {
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
index e55a31e..dc020fb 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
@@ -52,7 +52,6 @@
  *
  * @author Brian Stoler
  */
-
 public class AbstractFutureTest extends TestCase {
   public void testSuccess() throws ExecutionException, InterruptedException {
     final Object value = new Object();
@@ -292,6 +291,7 @@
    * derived from observing how much time actually passed for various operations.
    */
   @SuppressWarnings({"DeprecatedThreadMethods", "ThreadPriorityCheck"})
+  @AndroidIncompatible // Thread.suspend
   public void testToString_delayedTimeout() throws Exception {
     TimedWaiterThread thread =
         new TimedWaiterThread(new AbstractFuture<Object>() {}, 2, TimeUnit.SECONDS);
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
index 7cad8b0..2df5a4f 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
@@ -36,7 +36,6 @@
 
   // Functional tests using real thread. We only verify publicly visible state.
   // Interaction assertions are done by the single-threaded unit tests.
-
   public static class FunctionalTest extends TestCase {
 
     private static class DefaultService extends AbstractIdleService {
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
index a2411ad..a05a838 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
@@ -19,6 +19,8 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.util.concurrent.AbstractScheduledService.Scheduler.newFixedDelaySchedule;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.util.concurrent.AbstractScheduledService.Cancellable;
@@ -47,10 +49,9 @@
  *
  * @author Luke Sandberg
  */
-
 public class AbstractScheduledServiceTest extends TestCase {
 
-  volatile Scheduler configuration = newFixedDelaySchedule(0, 10, TimeUnit.MILLISECONDS);
+  volatile Scheduler configuration = newFixedDelaySchedule(0, 10, MILLISECONDS);
   volatile ScheduledFuture<?> future = null;
 
   volatile boolean atFixedRateCalled = false;
@@ -113,7 +114,7 @@
       service.startAsync().awaitRunning();
       fail();
     } catch (IllegalStateException e) {
-      assertEquals(service.startUpException, e.getCause());
+      assertThat(e).hasCauseThat().isEqualTo(service.startUpException);
     }
     assertEquals(0, service.numberOfTimesRunCalled.get());
     assertEquals(Service.State.FAILED, service.state());
@@ -156,7 +157,7 @@
       service.awaitTerminated();
       fail();
     } catch (IllegalStateException e) {
-      assertEquals(service.shutDownException, e.getCause());
+      assertThat(e).hasCauseThat().isEqualTo(service.shutDownException);
     }
     assertEquals(Service.State.FAILED, service.state());
   }
@@ -208,7 +209,7 @@
 
           @Override
           protected Scheduler scheduler() {
-            return newFixedDelaySchedule(0, 1, TimeUnit.MILLISECONDS);
+            return newFixedDelaySchedule(0, 1, MILLISECONDS);
           }
         };
 
@@ -217,7 +218,7 @@
     service.awaitRunning();
     service.stopAsync();
     service.awaitTerminated();
-    assertTrue(executor.get().awaitTermination(100, TimeUnit.MILLISECONDS));
+    assertTrue(executor.get().awaitTermination(100, MILLISECONDS));
   }
 
   public void testDefaultExecutorIsShutdownWhenServiceFails() throws Exception {
@@ -240,7 +241,7 @@
 
           @Override
           protected Scheduler scheduler() {
-            return newFixedDelaySchedule(0, 1, TimeUnit.MILLISECONDS);
+            return newFixedDelaySchedule(0, 1, MILLISECONDS);
           }
         };
 
@@ -250,7 +251,7 @@
     } catch (IllegalStateException expected) {
     }
 
-    assertTrue(executor.get().awaitTermination(100, TimeUnit.MILLISECONDS));
+    assertTrue(executor.get().awaitTermination(100, MILLISECONDS));
   }
 
   public void testSchedulerOnlyCalledOnce() throws Exception {
@@ -277,7 +278,7 @@
         new AbstractScheduledService() {
           @Override
           protected Scheduler scheduler() {
-            return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.NANOSECONDS);
+            return Scheduler.newFixedDelaySchedule(0, 1, NANOSECONDS);
           }
 
           @Override
@@ -294,7 +295,7 @@
           }
         };
     try {
-      service.startAsync().awaitRunning(1, TimeUnit.MILLISECONDS);
+      service.startAsync().awaitRunning(1, MILLISECONDS);
       fail("Expected timeout");
     } catch (TimeoutException e) {
       assertThat(e)
@@ -366,9 +367,9 @@
   public static class SchedulerTest extends TestCase {
     // These constants are arbitrary and just used to make sure that the correct method is called
     // with the correct parameters.
-    private static final int initialDelay = 10;
-    private static final int delay = 20;
-    private static final TimeUnit unit = TimeUnit.MILLISECONDS;
+    private static final int INITIAL_DELAY = 10;
+    private static final int DELAY = 20;
+    private static final TimeUnit UNIT = MILLISECONDS;
 
     // Unique runnable object used for comparison.
     final Runnable testRunnable =
@@ -382,14 +383,14 @@
         Runnable command, long initialDelay, long delay, TimeUnit unit) {
       assertFalse(called); // only called once.
       called = true;
-      assertEquals(SchedulerTest.initialDelay, initialDelay);
-      assertEquals(SchedulerTest.delay, delay);
-      assertEquals(SchedulerTest.unit, unit);
+      assertEquals(INITIAL_DELAY, initialDelay);
+      assertEquals(DELAY, delay);
+      assertEquals(UNIT, unit);
       assertEquals(testRunnable, command);
     }
 
     public void testFixedRateSchedule() {
-      Scheduler schedule = Scheduler.newFixedRateSchedule(initialDelay, delay, unit);
+      Scheduler schedule = Scheduler.newFixedRateSchedule(INITIAL_DELAY, DELAY, UNIT);
       Cancellable unused =
           schedule.schedule(
               null,
@@ -397,7 +398,7 @@
                 @Override
                 public ScheduledFuture<?> scheduleAtFixedRate(
                     Runnable command, long initialDelay, long period, TimeUnit unit) {
-                  assertSingleCallWithCorrectParameters(command, initialDelay, delay, unit);
+                  assertSingleCallWithCorrectParameters(command, initialDelay, period, unit);
                   return new ThrowingScheduledFuture<>();
                 }
               },
@@ -406,7 +407,7 @@
     }
 
     public void testFixedDelaySchedule() {
-      Scheduler schedule = newFixedDelaySchedule(initialDelay, delay, unit);
+      Scheduler schedule = newFixedDelaySchedule(INITIAL_DELAY, DELAY, UNIT);
       Cancellable unused =
           schedule.schedule(
               null,
@@ -440,7 +441,6 @@
       }
     }
 
-
     public void testFixedDelayScheduleFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -461,7 +461,6 @@
       service.awaitTerminated();
     }
 
-
     public void testCustomSchedulerFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -487,17 +486,16 @@
       service.awaitTerminated();
     }
 
-    private class TestCustomScheduler extends AbstractScheduledService.CustomScheduler {
+    private static class TestCustomScheduler extends AbstractScheduledService.CustomScheduler {
       public AtomicInteger scheduleCounter = new AtomicInteger(0);
 
       @Override
       protected Schedule getNextSchedule() throws Exception {
         scheduleCounter.incrementAndGet();
-        return new Schedule(0, TimeUnit.SECONDS);
+        return new Schedule(0, SECONDS);
       }
     }
 
-
     public void testCustomSchedule_startStop() throws Exception {
       final CyclicBarrier firstBarrier = new CyclicBarrier(2);
       final CyclicBarrier secondBarrier = new CyclicBarrier(2);
@@ -528,7 +526,6 @@
       future.cancel(false);
     }
 
-
     public void testCustomSchedulerServiceStop() throws Exception {
       TestAbstractScheduledCustomService service = new TestAbstractScheduledCustomService();
       service.startAsync().awaitRunning();
@@ -538,11 +535,10 @@
       service.secondBarrier.await();
       service.awaitTerminated();
       // Sleep for a while just to ensure that our task wasn't called again.
-      Thread.sleep(unit.toMillis(3 * delay));
+      Thread.sleep(UNIT.toMillis(3 * DELAY));
       assertEquals(1, service.numIterations.get());
     }
 
-
     public void testCustomScheduler_deadlock() throws InterruptedException, BrokenBarrierException {
       final CyclicBarrier inGetNextSchedule = new CyclicBarrier(2);
       // This will flakily deadlock, so run it multiple times to increase the flake likelihood
@@ -562,7 +558,7 @@
                       Thread.yield();
                       throw new RuntimeException("boom");
                     }
-                    return new Schedule(0, TimeUnit.NANOSECONDS);
+                    return new Schedule(0, NANOSECONDS);
                   }
                 };
               }
@@ -573,7 +569,6 @@
       }
     }
 
-
     public void testBig() throws Exception {
       TestAbstractScheduledCustomService service =
           new TestAbstractScheduledCustomService() {
@@ -584,7 +579,7 @@
                 protected Schedule getNextSchedule() throws Exception {
                   // Explicitly yield to increase the probability of a pathological scheduling.
                   Thread.yield();
-                  return new Schedule(0, TimeUnit.SECONDS);
+                  return new Schedule(0, SECONDS);
                 }
               };
             }
@@ -627,13 +622,12 @@
         return new CustomScheduler() {
           @Override
           protected Schedule getNextSchedule() throws Exception {
-            return new Schedule(delay, unit);
+            return new Schedule(DELAY, UNIT);
           }
         };
       }
     }
 
-
     public void testCustomSchedulerFailure() throws Exception {
       TestFailingCustomScheduledService service = new TestFailingCustomScheduledService();
       service.startAsync().awaitRunning();
@@ -644,7 +638,7 @@
       }
       Thread.sleep(1000);
       try {
-        service.stopAsync().awaitTerminated(100, TimeUnit.SECONDS);
+        service.stopAsync().awaitTerminated(100, SECONDS);
         fail();
       } catch (IllegalStateException e) {
         assertEquals(State.FAILED, service.state());
@@ -677,7 +671,7 @@
             if (numIterations.get() > 2) {
               throw new IllegalStateException("Failed");
             }
-            return new Schedule(delay, unit);
+            return new Schedule(DELAY, UNIT);
           }
         };
       }
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
index e3c22a8..5f42106 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
@@ -330,7 +330,6 @@
     }
   }
 
-
   public void testAwaitTerminated() throws Exception {
     final NoOpService service = new NoOpService();
     Thread waiter =
@@ -348,7 +347,6 @@
     assertFalse(waiter.isAlive());
   }
 
-
   public void testAwaitTerminated_FailedService() throws Exception {
     final ManualSwitchedService service = new ManualSwitchedService();
     final AtomicReference<Throwable> exception = Atomics.newReference();
@@ -376,7 +374,6 @@
     assertThat(exception.get()).hasCauseThat().isEqualTo(EXCEPTION);
   }
 
-
   public void testThreadedServiceStartAndWaitStopAndWait() throws Throwable {
     ThreadedService service = new ThreadedService();
     RecordingListener listener = RecordingListener.record(service);
@@ -394,7 +391,6 @@
         listener.getStateHistory());
   }
 
-
   public void testThreadedServiceStopIdempotence() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -410,7 +406,6 @@
     throwIfSet(thrownByExecutionThread);
   }
 
-
   public void testThreadedServiceStopIdempotenceAfterWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -428,7 +423,6 @@
     throwIfSet(thrownByExecutionThread);
   }
 
-
   public void testThreadedServiceStopIdempotenceDoubleWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -661,7 +655,6 @@
     }
   }
 
-
   public void testAddListenerAfterFailureDoesntCauseDeadlock() throws InterruptedException {
     final StartFailingService service = new StartFailingService();
     service.startAsync();
@@ -681,7 +674,6 @@
     assertFalse(thread + " is deadlocked", thread.isAlive());
   }
 
-
   public void testListenerDoesntDeadlockOnStartAndWaitFromRunning() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
@@ -696,7 +688,6 @@
     service.stopAsync();
   }
 
-
   public void testListenerDoesntDeadlockOnStopAndWaitFromTerminated() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java
index 038e2ec..de7d58a 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleArrayTest.java
@@ -13,6 +13,10 @@
 
 package com.google.common.util.concurrent;
 
+import static java.lang.Math.max;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.testing.NullPointerTester;
 import java.util.Arrays;
 
 /** Unit test for {@link AtomicDoubleArray}. */
@@ -48,6 +52,13 @@
     assertEquals(Double.doubleToRawLongBits(x), Double.doubleToRawLongBits(y));
   }
 
+  @GwtIncompatible // NullPointerTester
+  public void testNulls() {
+    new NullPointerTester().testAllPublicStaticMethods(AtomicDoubleArray.class);
+    new NullPointerTester().testAllPublicConstructors(AtomicDoubleArray.class);
+    new NullPointerTester().testAllPublicInstanceMethods(new AtomicDoubleArray(1));
+  }
+
   /** constructor creates array of given size with all elements zero */
   public void testConstructor() {
     AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
@@ -181,7 +192,6 @@
   }
 
   /** compareAndSet in one thread enables another waiting for value to succeed */
-
   public void testCompareAndSetInMultipleThreads() throws InterruptedException {
     final AtomicDoubleArray a = new AtomicDoubleArray(1);
     a.set(0, 1.0);
@@ -211,7 +221,8 @@
         assertBitEquals(prev, aa.get(i));
         assertFalse(aa.weakCompareAndSet(i, unused, x));
         assertBitEquals(prev, aa.get(i));
-        while (!aa.weakCompareAndSet(i, prev, x)) {;
+        while (!aa.weakCompareAndSet(i, prev, x)) {
+          ;
         }
         assertBitEquals(x, aa.get(i));
         prev = x;
@@ -261,6 +272,128 @@
     }
   }
 
+  /** getAndAccumulate with sum adds given value to current, and returns previous value */
+  public void testGetAndAccumulateWithSum() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.getAndAccumulate(i, y, Double::sum);
+          assertBitEquals(x, z);
+          assertBitEquals(x + y, aa.get(i));
+        }
+      }
+    }
+  }
+
+  /** getAndAccumulate with max stores max of given value to current, and returns previous value */
+  public void testGetAndAccumulateWithMax() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.getAndAccumulate(i, y, Double::max);
+          double expectedMax = max(x, y);
+          assertBitEquals(x, z);
+          assertBitEquals(expectedMax, aa.get(i));
+        }
+      }
+    }
+  }
+
+  /** accumulateAndGet with sum adds given value to current, and returns current value */
+  public void testAccumulateAndGetWithSum() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.accumulateAndGet(i, y, Double::sum);
+          assertBitEquals(x + y, z);
+          assertBitEquals(x + y, aa.get(i));
+        }
+      }
+    }
+  }
+
+  /** accumulateAndGet with max stores max of given value to current, and returns current value */
+  public void testAccumulateAndGetWithMax() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.accumulateAndGet(i, y, Double::max);
+          double expectedMax = max(x, y);
+          assertBitEquals(expectedMax, z);
+          assertBitEquals(expectedMax, aa.get(i));
+        }
+      }
+    }
+  }
+
+  /** getAndUpdate adds given value to current, and returns previous value */
+  public void testGetAndUpdateWithSum() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.getAndUpdate(i, value -> value + y);
+          assertBitEquals(x, z);
+          assertBitEquals(x + y, aa.get(i));
+        }
+      }
+    }
+  }
+
+  /** getAndUpdate subtracts given value to current, and returns previous value */
+  public void testGetAndUpdateWithSubtract() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.getAndUpdate(i, value -> value - y);
+          assertBitEquals(x, z);
+          assertBitEquals(x - y, aa.get(i));
+        }
+      }
+    }
+  }
+
+  /** updateAndGet adds given value to current, and returns current value */
+  public void testUpdateAndGetWithSum() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.updateAndGet(i, value -> value + y);
+          assertBitEquals(x + y, z);
+          assertBitEquals(x + y, aa.get(i));
+        }
+      }
+    }
+  }
+
+  /** updateAndGet subtracts given value to current, and returns current value */
+  public void testUpdateAndGetWithSubtract() {
+    AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
+    for (int i : new int[] {0, SIZE - 1}) {
+      for (double x : VALUES) {
+        for (double y : VALUES) {
+          aa.set(i, x);
+          double z = aa.updateAndGet(i, value -> value - y);
+          assertBitEquals(x - y, z);
+          assertBitEquals(x - y, aa.get(i));
+        }
+      }
+    }
+  }
+
   static final long COUNTDOWN = 100000;
 
   class Counter extends CheckedRunnable {
@@ -296,7 +429,6 @@
    * Multiple threads using same array of counters successfully update a number of times equal to
    * total count
    */
-
   public void testCountingInMultipleThreads() throws InterruptedException {
     final AtomicDoubleArray aa = new AtomicDoubleArray(SIZE);
     for (int i = 0; i < SIZE; i++) {
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
index df9bd8b..f7ffe51 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
@@ -13,6 +13,7 @@
 
 package com.google.common.util.concurrent;
 
+import static java.lang.Math.max;
 
 /** Unit test for {@link AtomicDouble}. */
 public class AtomicDoubleTest extends JSR166TestCase {
@@ -97,7 +98,6 @@
   }
 
   /** compareAndSet in one thread enables another waiting for value to succeed */
-
   public void testCompareAndSetInMultipleThreads() throws Exception {
     final AtomicDouble at = new AtomicDouble(1.0);
     Thread t =
@@ -125,7 +125,8 @@
       assertBitEquals(prev, at.get());
       assertFalse(at.weakCompareAndSet(unused, x));
       assertBitEquals(prev, at.get());
-      while (!at.weakCompareAndSet(prev, x)) {;
+      while (!at.weakCompareAndSet(prev, x)) {
+        ;
       }
       assertBitEquals(x, at.get());
       prev = x;
@@ -166,6 +167,108 @@
     }
   }
 
+  /** getAndAccumulate with sum adds given value to current, and returns previous value */
+  public void testGetAndAccumulateWithSum() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.getAndAccumulate(y, Double::sum);
+        assertBitEquals(x, z);
+        assertBitEquals(x + y, a.get());
+      }
+    }
+  }
+
+  /** getAndAccumulate with max stores max of given value to current, and returns previous value */
+  public void testGetAndAccumulateWithMax() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.getAndAccumulate(y, Double::max);
+        double expectedMax = max(x, y);
+        assertBitEquals(x, z);
+        assertBitEquals(expectedMax, a.get());
+      }
+    }
+  }
+
+  /** accumulateAndGet with sum adds given value to current, and returns current value */
+  public void testAccumulateAndGetWithSum() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.accumulateAndGet(y, Double::sum);
+        assertBitEquals(x + y, z);
+        assertBitEquals(x + y, a.get());
+      }
+    }
+  }
+
+  /** accumulateAndGet with max stores max of given value to current, and returns current value */
+  public void testAccumulateAndGetWithMax() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.accumulateAndGet(y, Double::max);
+        double expectedMax = max(x, y);
+        assertBitEquals(expectedMax, z);
+        assertBitEquals(expectedMax, a.get());
+      }
+    }
+  }
+
+  /** getAndUpdate with sum stores sum of given value to current, and returns previous value */
+  public void testGetAndUpdateWithSum() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.getAndUpdate(value -> value + y);
+        assertBitEquals(x, z);
+        assertBitEquals(x + y, a.get());
+      }
+    }
+  }
+
+  /**
+   * getAndUpdate with subtract stores subtraction of value from current, and returns previous value
+   */
+  public void testGetAndUpdateWithSubtract() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.getAndUpdate(value -> value - y);
+        assertBitEquals(x, z);
+        assertBitEquals(x - y, a.get());
+      }
+    }
+  }
+
+  /** updateAndGet with sum stores sum of given value to current, and returns current value */
+  public void testUpdateAndGetWithSum() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.updateAndGet(value -> value + y);
+        assertBitEquals(x + y, z);
+        assertBitEquals(x + y, a.get());
+      }
+    }
+  }
+
+  /**
+   * updateAndGet with subtract stores subtraction of value from current, and returns current value
+   */
+  public void testUpdateAndGetWithSubtract() {
+    for (double x : VALUES) {
+      for (double y : VALUES) {
+        AtomicDouble a = new AtomicDouble(x);
+        double z = a.updateAndGet(value -> value - y);
+        assertBitEquals(x - y, z);
+        assertBitEquals(x - y, a.get());
+      }
+    }
+  }
+
   /** a deserialized serialized atomic holds same value */
   public void testSerialization() throws Exception {
     AtomicDouble a = new AtomicDouble();
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
index 4765825..b1e741a 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
@@ -16,13 +16,15 @@
 
 package com.google.common.util.concurrent;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
+
 import com.google.common.annotations.GwtIncompatible;
+import java.util.ArrayList;
 import java.util.Random;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
 import junit.framework.TestCase;
 
 /**
@@ -31,29 +33,27 @@
  * @author mike nonemacher
  */
 @GwtIncompatible // threads
-
 public class AtomicLongMapBasherTest extends TestCase {
   private final Random random = new Random(301);
 
-  public void testModify_basher() throws InterruptedException {
+  public void testModify_basher() throws Exception {
     int nTasks = 3000;
     int nThreads = 100;
     final int getsPerTask = 1000;
     final int deltaRange = 10000;
     final String key = "key";
 
-    final AtomicLong sum = new AtomicLong();
     final AtomicLongMap<String> map = AtomicLongMap.create();
 
     ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
+    ArrayList<Future<Long>> futures = new ArrayList<>();
     for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
-      Future<?> possiblyIgnoredError =
+      futures.add(
           threadPool.submit(
-              new Runnable() {
+              new Callable<Long>() {
                 @Override
-                public void run() {
-                  int threadSum = 0;
+                public Long call() {
+                  long threadSum = 0;
                   for (int j = 0; j < getsPerTask; j++) {
                     long delta = random.nextInt(deltaRange);
                     int behavior = random.nextInt(10);
@@ -106,14 +106,16 @@
                         throw new AssertionError();
                     }
                   }
-                  sum.addAndGet(threadSum);
+                  return threadSum;
                 }
-              });
+              }));
     }
-
     threadPool.shutdown();
-    assertTrue(threadPool.awaitTermination(300, TimeUnit.SECONDS));
-
-    assertEquals(sum.get(), map.get(key));
+    assertTrue(threadPool.awaitTermination(300, SECONDS));
+    long sum = 0;
+    for (Future<Long> f : futures) {
+      sum += f.get();
+    }
+    assertEquals(sum, map.get(key));
   }
 }
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
index 587a4ec..878ea5e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
@@ -52,7 +52,7 @@
     Map<String, Long> in = ImmutableMap.of("1", 1L, "2", 2L, "3", 3L);
     AtomicLongMap<String> map = AtomicLongMap.create(in);
     assertFalse(map.isEmpty());
-    assertSame(3, map.size());
+    assertEquals(3, map.size());
     assertTrue(map.containsKey("1"));
     assertTrue(map.containsKey("2"));
     assertTrue(map.containsKey("3"));
@@ -302,7 +302,7 @@
     Map<String, Long> in = ImmutableMap.of("1", 1L, "2", 2L, "3", 3L);
     AtomicLongMap<String> map = AtomicLongMap.create();
     assertTrue(map.isEmpty());
-    assertSame(0, map.size());
+    assertEquals(0, map.size());
     assertFalse(map.containsKey("1"));
     assertFalse(map.containsKey("2"));
     assertFalse(map.containsKey("3"));
@@ -312,7 +312,7 @@
 
     map.putAll(in);
     assertFalse(map.isEmpty());
-    assertSame(3, map.size());
+    assertEquals(3, map.size());
     assertTrue(map.containsKey("1"));
     assertTrue(map.containsKey("2"));
     assertTrue(map.containsKey("3"));
diff --git a/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToFutureTest.java
new file mode 100644
index 0000000..79288eb
--- /dev/null
+++ b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToFutureTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2017 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.util.concurrent;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+
+import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
+import com.google.common.util.concurrent.ClosingFuture.DeferredCloser;
+import java.io.Closeable;
+import java.util.concurrent.ExecutionException;
+
+/** Tests for {@link ClosingFuture} that exercise {@link ClosingFuture#finishToFuture()}. */
+public class ClosingFutureFinishToFutureTest extends AbstractClosingFutureTest {
+  public void testFinishToFuture_throwsIfCalledTwice() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+    try {
+      FluentFuture<Closeable> unused2 = closingFuture.finishToFuture();
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testFinishToFuture_throwsAfterCallingFinishToValueAndCloser() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), directExecutor());
+    try {
+      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testFinishToFuture_preventsFurtherDerivation() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    FluentFuture<String> unused = closingFuture.finishToFuture();
+    assertDerivingThrowsIllegalStateException(closingFuture);
+  }
+
+  @Override
+  <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+    return getUninterruptibly(closingFuture.finishToFuture());
+  }
+
+  @Override
+  void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+    assertThatFutureFailsWithException(closingFuture.finishToFuture());
+  }
+
+  @Override
+  void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+    assertThatFutureBecomesCancelled(closingFuture.finishToFuture());
+  }
+
+  @Override
+  void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+    assertThat(closingFuture.finishToFuture().cancel(false)).isTrue();
+    waitUntilClosed(closingFuture);
+    futureCancelled.countDown();
+  }
+}
diff --git a/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToValueAndCloserTest.java b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToValueAndCloserTest.java
new file mode 100644
index 0000000..ac3cf55
--- /dev/null
+++ b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureFinishToValueAndCloserTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2017 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.util.concurrent;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.util.concurrent.MoreExecutors.shutdownAndAwaitTermination;
+import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
+import com.google.common.util.concurrent.ClosingFuture.DeferredCloser;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloser;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloserConsumer;
+import java.io.Closeable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Tests for {@link ClosingFuture} that exercise {@link
+ * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)}.
+ */
+public class ClosingFutureFinishToValueAndCloserTest extends AbstractClosingFutureTest {
+  private final ExecutorService finishToValueAndCloserExecutor = newSingleThreadExecutor();
+  private volatile ValueAndCloser<?> valueAndCloser;
+
+  @Override
+  protected void tearDown() throws Exception {
+    super.tearDown();
+    assertWithMessage("finishToValueAndCloserExecutor was shut down")
+        .that(shutdownAndAwaitTermination(finishToValueAndCloserExecutor, 10, SECONDS))
+        .isTrue();
+  }
+
+  public void testFinishToValueAndCloser_throwsIfCalledTwice() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    closingFuture.finishToValueAndCloser(
+        new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+    try {
+      closingFuture.finishToValueAndCloser(
+          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testFinishToValueAndCloser_throwsAfterCallingFinishToFuture() throws Exception {
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, executor);
+              }
+            },
+            executor);
+    FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+    try {
+      closingFuture.finishToValueAndCloser(
+          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+      fail("should have thrown");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  @Override
+  <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+    return finishToValueAndCloser(closingFuture).get();
+  }
+
+  @Override
+  void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+    assertThatFutureFailsWithException(closingFuture.statusFuture());
+    ValueAndCloser<?> valueAndCloser = finishToValueAndCloser(closingFuture);
+    try {
+      valueAndCloser.get();
+      fail();
+    } catch (ExecutionException expected) {
+      assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+    }
+    valueAndCloser.closeAsync();
+  }
+
+  @Override
+  void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+    assertThatFutureBecomesCancelled(closingFuture.statusFuture());
+  }
+
+  @Override
+  void waitUntilClosed(ClosingFuture<?> closingFuture) {
+    if (valueAndCloser != null) {
+      valueAndCloser.closeAsync();
+    }
+    super.waitUntilClosed(closingFuture);
+  }
+
+  @Override
+  void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+    assertThat(closingFuture.cancel(false)).isTrue();
+    ValueAndCloser<?> unused = finishToValueAndCloser(closingFuture);
+    waitUntilClosed(closingFuture);
+    futureCancelled.countDown();
+  }
+
+  private <V> ValueAndCloser<V> finishToValueAndCloser(ClosingFuture<V> closingFuture) {
+    final CountDownLatch valueAndCloserSet = new CountDownLatch(1);
+    closingFuture.finishToValueAndCloser(
+        new ValueAndCloserConsumer<V>() {
+          @Override
+          public void accept(ValueAndCloser<V> valueAndCloser) {
+            ClosingFutureFinishToValueAndCloserTest.this.valueAndCloser = valueAndCloser;
+            valueAndCloserSet.countDown();
+          }
+        },
+        finishToValueAndCloserExecutor);
+    assertWithMessage("valueAndCloser was set")
+        .that(awaitUninterruptibly(valueAndCloserSet, 10, SECONDS))
+        .isTrue();
+    @SuppressWarnings("unchecked")
+    ValueAndCloser<V> valueAndCloserWithType = (ValueAndCloser<V>) valueAndCloser;
+    return valueAndCloserWithType;
+  }
+}
diff --git a/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java b/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
index 18e69b1..2b1dd2f 100644
--- a/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
@@ -442,7 +442,6 @@
     lockD.lock();
   }
 
-
   public void testReentrantLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(lockA);
     thread.start();
@@ -454,7 +453,6 @@
     assertTrue(lockA.tryLock());
   }
 
-
   public void testReentrantWriteLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(writeLockA);
     thread.start();
@@ -468,7 +466,6 @@
     assertTrue(readLockA.tryLock());
   }
 
-
   public void testReentrantReadLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(readLockA);
     thread.start();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java b/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
index 5bd3cf7..34678ed 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
@@ -36,7 +36,6 @@
 
   private final ExecutionList list = new ExecutionList();
 
-
   public void testRunOnPopulatedList() throws Exception {
     Executor exec = Executors.newCachedThreadPool();
     CountDownLatch countDownLatch = new CountDownLatch(3);
@@ -67,7 +66,6 @@
     assertEquals(1, runCalled.get());
   }
 
-
   public void testExecute_idempotentConcurrently() throws InterruptedException {
     final CountDownLatch okayToRun = new CountDownLatch(1);
     final AtomicInteger runCalled = new AtomicInteger();
@@ -103,7 +101,6 @@
     assertEquals(1, runCalled.get());
   }
 
-
   public void testAddAfterRun() throws Exception {
     // Run the previous test
     testRunOnPopulatedList();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java b/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
index 1c03f5a..068287c 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
@@ -88,7 +88,6 @@
     assertThat(thirdCallable.called).isTrue();
   }
 
-
   public void testCancellationMultipleThreads() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> unused = serializer.submit(blockingCallable, executor);
@@ -116,7 +115,6 @@
     assertThat(getDone(future2)).isFalse();
   }
 
-
   public void testSecondTaskWaitsForFirstEvenIfCancelled() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> future1 = serializer.submit(blockingCallable, executor);
@@ -327,7 +325,6 @@
   private static final int DIRECT_EXECUTIONS_PER_THREAD = 100;
 
   @GwtIncompatible // threads
-
   public void testAvoidsStackOverflow_multipleThreads() throws Exception {
     final LongHolder holder = new LongHolder();
     final ArrayList<ListenableFuture<Integer>> lengthChecks = new ArrayList<>();
diff --git a/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
index cc4751d..ab53f53 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
@@ -132,7 +132,6 @@
     assertThat(f.get()).isEqualTo(2);
   }
 
-
   @GwtIncompatible // withTimeout
   public void testWithTimeout() throws Exception {
     ScheduledExecutorService executor = newScheduledThreadPool(1);
diff --git a/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java b/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
index 3bc69bd..666a189 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
@@ -353,7 +353,7 @@
 
   public static final class WillBeUnloadedException extends Exception {}
 
-
+  @AndroidIncompatible // "Parent ClassLoader may not be null"; maybe avoidable if we try?
   public void testGetChecked_classUnloading() throws Exception {
     WeakReference<?> classUsedByGetChecked = doTestClassUnloading();
     GcFinalization.awaitClear(classUsedByGetChecked);
diff --git a/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java b/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
index 0c3a9ae..3fe2347 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
@@ -53,6 +53,7 @@
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.annotations.GwtCompatible;
@@ -410,7 +411,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testTransformAsync_interruptPropagatesToTransformingThread() throws Exception {
     SettableFuture<String> input = SettableFuture.create();
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -803,7 +803,6 @@
   }
 
   @GwtIncompatible // Threads
-
   public void testTransformAsync_functionToString() throws Exception {
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
@@ -1132,7 +1131,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testCatchingAsync_interruptPropagatesToTransformingThread() throws Exception {
     SettableFuture<String> input = SettableFuture.create();
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -1172,7 +1170,6 @@
   }
 
   @GwtIncompatible // Threads
-
   public void testCatchingAsync_functionToString() throws Exception {
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
@@ -1749,7 +1746,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testTransformAsync_asyncFunction_cancelledWhileApplyingFunction()
       throws InterruptedException, ExecutionException {
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -1784,7 +1780,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testTransformAsync_asyncFunction_cancelledBeforeApplyingFunction()
       throws InterruptedException {
     final AtomicBoolean functionCalled = new AtomicBoolean();
@@ -1858,7 +1853,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testSubmitAsync_asyncCallable_cancelledWhileApplyingFunction()
       throws InterruptedException, ExecutionException {
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -1892,7 +1886,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testSubmitAsync_asyncCallable_cancelledBeforeApplyingFunction()
       throws InterruptedException {
     final AtomicBoolean callableCalled = new AtomicBoolean();
@@ -1926,7 +1919,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testSubmitAsync_asyncCallable_returnsInterruptedFuture() throws InterruptedException {
     assertThat(Thread.interrupted()).isFalse();
     SettableFuture<Integer> cancelledFuture = SettableFuture.create();
@@ -2015,7 +2007,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_error() throws InterruptedException {
     final Error error = new Error("deliberate");
     AsyncCallable<Integer> callable =
@@ -2037,14 +2028,10 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_nullInsteadOfFuture() throws Exception {
     ListenableFuture<?> chainedFuture =
         scheduleAsync(
-            constantAsyncCallable(null),
-            1,
-            TimeUnit.NANOSECONDS,
-            newSingleThreadScheduledExecutor());
+            constantAsyncCallable(null), 1, NANOSECONDS, newSingleThreadScheduledExecutor());
     try {
       chainedFuture.get();
       fail();
@@ -2059,7 +2046,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_cancelledWhileApplyingFunction()
       throws InterruptedException, ExecutionException {
     final CountDownLatch inFunction = new CountDownLatch(1);
@@ -2075,7 +2061,7 @@
           }
         };
     ListenableFuture<Integer> future =
-        scheduleAsync(callable, 1, TimeUnit.NANOSECONDS, newSingleThreadScheduledExecutor());
+        scheduleAsync(callable, 1, NANOSECONDS, newSingleThreadScheduledExecutor());
     inFunction.await();
     future.cancel(false);
     callableDone.countDown();
@@ -2092,7 +2078,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testScheduleAsync_asyncCallable_cancelledBeforeCallingFunction()
       throws InterruptedException {
     final AtomicBoolean callableCalled = new AtomicBoolean();
@@ -2114,7 +2099,7 @@
             awaitUninterruptibly(beforeFunction);
           }
         });
-    ListenableFuture<Integer> future = scheduleAsync(callable, 1, TimeUnit.NANOSECONDS, executor);
+    ListenableFuture<Integer> future = scheduleAsync(callable, 1, NANOSECONDS, executor);
     future.cancel(false);
 
     // Unpause the executor.
@@ -2547,7 +2532,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_noLeakInterruption() throws Exception {
     final SettableFuture<String> stringFuture = SettableFuture.create();
     AsyncCallable<String> combiner =
@@ -2591,7 +2575,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_asyncResult() throws Exception {
     SettableFuture<Integer> futureInteger = SettableFuture.create();
     SettableFuture<Boolean> futureBoolean = SettableFuture.create();
@@ -2683,7 +2666,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_cancelledNotInterrupted() throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
     SettableFuture<Boolean> booleanFuture = SettableFuture.create();
@@ -2722,7 +2704,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllComplete_interrupted() throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
     SettableFuture<Boolean> booleanFuture = SettableFuture.create();
@@ -2815,7 +2796,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllCompleteRunnable_resultCanceledWithoutInterrupt_doesNotInterruptRunnable()
       throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
@@ -2856,7 +2836,6 @@
   }
 
   @GwtIncompatible // threads
-
   public void testWhenAllCompleteRunnable_resultCanceledWithInterrupt_InterruptsRunnable()
       throws Exception {
     SettableFuture<String> stringFuture = SettableFuture.create();
@@ -3375,13 +3354,11 @@
         : pseudoTimedGetUninterruptibly(future, 2500, MILLISECONDS);
   }
 
-
   @GwtIncompatible // threads
   public void testAllAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.allMerger);
   }
 
-
   @GwtIncompatible // threads
   public void testSuccessfulAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.successMerger);
diff --git a/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java b/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
index d0fcee2..2499020 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
@@ -131,7 +131,6 @@
     }
   }
 
-
   public void testFutureCancellableBeforeFunctionCompletion() throws Exception {
     // Set the result in a separate thread since this test runs the function
     // (which will block) in the same thread.
diff --git a/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java b/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
index 4e2c85e..8b5caeb 100644
--- a/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
@@ -46,7 +46,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class GeneratedMonitorTest extends TestCase {
 
   public static TestSuite suite() {
diff --git a/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java b/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
index 4d7a45f..bb3b43b 100644
--- a/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
@@ -22,7 +22,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class InterruptibleMonitorTest extends MonitorTestCase {
 
   public InterruptibleMonitorTest() {
diff --git a/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java b/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
index afa7eae..fcfe744 100644
--- a/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
@@ -25,7 +25,6 @@
 import java.util.concurrent.locks.LockSupport;
 import junit.framework.TestCase;
 
-
 public final class InterruptibleTaskTest extends TestCase {
 
   // Regression test for a deadlock where a task could be stuck busy waiting for the task to
@@ -91,6 +90,14 @@
    * protect ourselves from that we want to make sure that tasks don't spin too much waiting for the
    * interrupting thread to complete the protocol.
    */
+  /*
+   * This test hangs (or maybe is just *very* slow) under Android.
+   *
+   * TODO(b/218700094): Ideally, get this to pass under Android. Failing that, convince ourselves
+   * that the test isn't exposing a real problem with InterruptibleTask, one that could matter in
+   * prod.
+   */
+  @AndroidIncompatible
   public void testInterruptIsSlow() throws Exception {
     final CountDownLatch isInterruptibleRegistered = new CountDownLatch(1);
     final SlowChannel slowChannel = new SlowChannel();
diff --git a/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java b/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
index 3bb819a..741ff45 100644
--- a/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
@@ -100,7 +100,6 @@
     assertTrue(listenableFuture.isDone());
   }
 
-
   public void testListenInPoolThreadUsesGivenExecutor() throws Exception {
     ExecutorService executorService =
         newCachedThreadPool(new ThreadFactoryBuilder().setDaemon(true).build());
@@ -125,7 +124,6 @@
     assertTrue(listenableFuture.isDone());
   }
 
-
   public void testListenInPoolThreadCustomExecutorInterrupted() throws Exception {
     final CountDownLatch submitSuccessful = new CountDownLatch(1);
     ExecutorService executorService =
@@ -235,7 +233,6 @@
     }
   }
 
-
   @SuppressWarnings("IsInstanceIncompatibleType") // intentional.
   public void testListenInPoolThreadRunsListenerAfterRuntimeException() throws Exception {
     RuntimeExceptionThrowingFuture<String> input = new RuntimeExceptionThrowingFuture<>();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java b/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
index 8969a75..fd51a73 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
@@ -80,7 +80,6 @@
     super.tearDown();
   }
 
-
   public void testListenerDoesNotRunUntilTaskCompletes() throws Exception {
 
     // Test default state of not started.
@@ -106,7 +105,6 @@
     assertFalse(task.isCancelled());
   }
 
-
   public void testListenerCalledOnException() throws Exception {
     throwException = true;
 
@@ -142,7 +140,6 @@
     assertEquals(1, runLatch.getCount());
   }
 
-
   public void testListenerCalledOnCancelFromRunning() throws Exception {
     exec.execute(task);
     runLatch.await();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java b/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
index 5fd9b95..e0eb32e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
@@ -129,7 +129,6 @@
         logHandler.getStoredLogRecords().get(0).getMessage());
   }
 
-
   public void testEnqueueAndDispatch_multithreaded() throws InterruptedException {
     Object listener = new Object();
     ExecutorService service = Executors.newFixedThreadPool(4);
@@ -153,7 +152,6 @@
     }
   }
 
-
   public void testEnqueueAndDispatch_multithreaded_withThrowingRunnable()
       throws InterruptedException {
     Object listener = new Object();
diff --git a/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java b/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java
index a9ead52..44f8d31 100644
--- a/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java
+++ b/guava-tests/test/com/google/common/util/concurrent/MonitorTestCase.java
@@ -26,7 +26,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public abstract class MonitorTestCase extends TestCase {
 
   public class TestGuard extends Monitor.Guard {
diff --git a/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java b/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
index fe4e7f5..aac6173 100644
--- a/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
@@ -88,7 +88,6 @@
         public void run() {}
       };
 
-
   public void testDirectExecutorServiceServiceInThreadExecution() throws Exception {
     final ListeningExecutorService executor = newDirectExecutorService();
     final ThreadLocal<Integer> threadLocalCount =
@@ -168,7 +167,6 @@
     assertEquals(10, threadLocalCount.get().intValue());
   }
 
-
   public void testDirectExecutorServiceServiceTermination() throws Exception {
     final ExecutorService executor = newDirectExecutorService();
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -259,7 +257,6 @@
    * Test for a bug where threads weren't getting signaled when shutdown was called, only when tasks
    * completed.
    */
-
   public void testDirectExecutorService_awaitTermination_missedSignal() {
     final ExecutorService service = MoreExecutors.newDirectExecutorService();
     Thread waiter =
@@ -342,6 +339,7 @@
      */
   }
 
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testListeningDecorator_noWrapExecuteTask() {
     ExecutorService delegate = mock(ExecutorService.class);
     ListeningExecutorService service = listeningDecorator(delegate);
@@ -354,7 +352,6 @@
     verify(delegate).execute(task);
   }
 
-
   public void testListeningDecorator_scheduleSuccess() throws Exception {
     final CountDownLatch completed = new CountDownLatch(1);
     ScheduledThreadPoolExecutor delegate =
@@ -380,7 +377,6 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
-
   public void testListeningDecorator_scheduleFailure() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -391,7 +387,6 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
-
   public void testListeningDecorator_schedulePeriodic() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -412,7 +407,6 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
-
   public void testListeningDecorator_cancelled() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     BlockingQueue<?> delegateQueue = delegate.getQueue();
@@ -566,7 +560,7 @@
     }
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testAddDelayedShutdownHook_success() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -578,7 +572,7 @@
     shutdownFirst.verify(service).awaitTermination(2, TimeUnit.SECONDS);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testAddDelayedShutdownHook_interrupted() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -588,7 +582,6 @@
     verify(service).shutdown();
   }
 
-
   public void testGetExitingExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor =
@@ -597,7 +590,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetExitingExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -607,7 +600,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetExitingExecutorService_shutdownHookRegistered() throws InterruptedException {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -618,7 +611,6 @@
     verify(executor).shutdown();
   }
 
-
   public void testGetExitingScheduledExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
@@ -626,7 +618,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetExitingScheduledExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = mock(ScheduledThreadPoolExecutor.class);
@@ -636,7 +628,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testGetScheduledExitingExecutorService_shutdownHookRegistered()
       throws InterruptedException {
     TestApplication application = new TestApplication();
@@ -669,7 +661,6 @@
     assertEquals(oldName, Thread.currentThread().getName());
   }
 
-
   public void testExecutors_nullCheck() throws Exception {
     new ClassSanityTester()
         .setDefault(RateLimiter.class, RateLimiter.create(1.0))
@@ -699,14 +690,13 @@
   /* Half of a 1-second timeout in nanoseconds */
   private static final long HALF_SECOND_NANOS = NANOSECONDS.convert(1L, SECONDS) / 2;
 
-
   public void testShutdownAndAwaitTermination_immediateShutdown() throws Exception {
     ExecutorService service = Executors.newSingleThreadExecutor();
     assertTrue(shutdownAndAwaitTermination(service, 1L, SECONDS));
     assertTrue(service.isTerminated());
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_immediateShutdownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS)).thenReturn(true);
@@ -716,7 +706,7 @@
     verify(service).awaitTermination(HALF_SECOND_NANOS, NANOSECONDS);
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_forcedShutDownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -729,7 +719,7 @@
     verify(service).shutdownNow();
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_nonTerminationInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -741,7 +731,7 @@
     verify(service).shutdownNow();
   }
 
-
+  @AndroidIncompatible // Mocking ExecutorService is forbidden there. TODO(b/218700094): Don't mock.
   public void testShutdownAndAwaitTermination_interruptedInternal() throws Exception {
     final ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
diff --git a/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java b/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
index 20209e8..80e7ab2 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
@@ -274,7 +274,14 @@
     assertEquals(1, numCalls.get());
   }
 
-
+  /*
+   * Under Android, MyError propagates up and fails the test?
+   *
+   * TODO(b/218700094): Does this matter to prod users, or is it just a feature of our testing
+   * environment? If the latter, maybe write a custom Executor that avoids failing the test when it
+   * sees an Error?
+   */
+  @AndroidIncompatible
   public void testTaskThrowsError() throws Exception {
     class MyError extends Error {}
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -313,7 +320,6 @@
     }
   }
 
-
   public void testRejectedExecutionThrownWithMultipleCalls() throws Exception {
     final CountDownLatch latch = new CountDownLatch(1);
     final SettableFuture<?> future = SettableFuture.create();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java b/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
index e8552ed..9f89fb1 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
@@ -120,7 +120,6 @@
     }
   }
 
-
   public void testServiceStartupTimes() {
     Service a = new NoOpDelayedService(150);
     Service b = new NoOpDelayedService(353);
@@ -132,7 +131,6 @@
     assertThat(startupTimes.get(b)).isAtLeast(353);
   }
 
-
   public void testServiceStartupDurations() {
     Service a = new NoOpDelayedService(150);
     Service b = new NoOpDelayedService(353);
@@ -144,7 +142,6 @@
     assertThat(startupTimes.get(b)).isAtLeast(Duration.ofMillis(353));
   }
 
-
   public void testServiceStartupTimes_selfStartingServices() {
     // This tests to ensure that:
     // 1. service times are accurate when the service is started by the manager
@@ -179,7 +176,6 @@
     assertThat(startupTimes.get(b)).isNotNull();
   }
 
-
   public void testServiceStartStop() {
     Service a = new NoOpService();
     Service b = new NoOpService();
@@ -201,7 +197,6 @@
     assertTrue(listener.failedServices.isEmpty());
   }
 
-
   public void testFailStart() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStartService();
@@ -229,7 +224,6 @@
     assertTrue(listener.stoppedCalled);
   }
 
-
   public void testFailRun() throws Exception {
     Service a = new NoOpService();
     Service b = new FailRunService();
@@ -252,7 +246,6 @@
     assertTrue(listener.stoppedCalled);
   }
 
-
   public void testFailStop() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStopService();
@@ -281,7 +274,6 @@
     assertThat(toString).contains("FailStartService");
   }
 
-
   public void testTimeouts() throws Exception {
     Service a = new NoOpDelayedService(50);
     ServiceManager manager = new ServiceManager(asList(a));
@@ -458,7 +450,6 @@
    * Tests that a ServiceManager can be fully shut down if one of its failure listeners is slow or
    * even permanently blocked.
    */
-
   public void testListenerDeadlock() throws InterruptedException {
     final CountDownLatch failEnter = new CountDownLatch(1);
     final CountDownLatch failLeave = new CountDownLatch(1);
@@ -619,7 +610,6 @@
    *
    * <p>Before the bug was fixed this test would fail at least 30% of the time.
    */
-
   public void testTransitionRace() throws TimeoutException {
     for (int k = 0; k < 1000; k++) {
       List<Service> services = Lists.newArrayList();
diff --git a/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
index 9b8b88f..105e8de 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
@@ -51,19 +51,16 @@
     }
   }
 
-
   public void testSetValue() throws Exception {
     assertTrue(future.set("value"));
     tester.testCompletedFuture("value");
   }
 
-
   public void testSetFailure() throws Exception {
     assertTrue(future.setException(new Exception("failure")));
     tester.testFailedFuture("failure");
   }
 
-
   public void testSetFailureNull() throws Exception {
     try {
       future.setException(null);
@@ -75,7 +72,6 @@
     tester.testFailedFuture("failure");
   }
 
-
   public void testCancel() throws Exception {
     assertTrue(future.cancel(true));
     tester.testCancelledFuture();
diff --git a/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java b/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
index 04b824f..3540686 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
@@ -34,7 +34,6 @@
  * @author kevinb
  * @author Jens Nyman
  */
-
 public class SimpleTimeLimiterTest extends TestCase {
 
   private static final long DELAY_MS = 50;
diff --git a/guava-tests/test/com/google/common/util/concurrent/StripedTest.java b/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
index fa9d87f..688d6fd 100644
--- a/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
@@ -129,7 +129,7 @@
     assertTrue(Striped.lazyWeakLock(256).size() == 256);
   }
 
-
+  @AndroidIncompatible // Presumably GC doesn't trigger, despite our efforts.
   public void testWeakImplementations() {
     for (Striped<?> striped : weakImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
@@ -137,7 +137,7 @@
     }
   }
 
-
+  @AndroidIncompatible // Presumably GC doesn't trigger, despite our efforts.
   public void testWeakReadWrite() {
     Striped<ReadWriteLock> striped = Striped.lazyWeakReadWriteLock(1000);
     Object key = new Object();
@@ -150,7 +150,7 @@
     readLock.unlock();
   }
 
-
+  @AndroidIncompatible // Presumably GC doesn't trigger, despite our efforts.
   public void testStrongImplementations() {
     for (Striped<?> striped : strongImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
diff --git a/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java b/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java
index 8a52ffe..5b77f9a 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SupplementalMonitorTest.java
@@ -33,7 +33,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class SupplementalMonitorTest extends TestCase {
 
   public void testLeaveWithoutEnterThrowsIMSE() {
diff --git a/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java b/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
index 7684b96..a3a7b8e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
@@ -56,7 +56,6 @@
     builder = new ThreadFactoryBuilder();
   }
 
-
   public void testThreadFactoryBuilder_defaults() throws InterruptedException {
     ThreadFactory threadFactory = builder.build();
     Thread thread = threadFactory.newThread(monitoredRunnable);
@@ -93,7 +92,6 @@
     assertThat(thread.getName()).matches("^pool-\\d+-thread-" + threadId + "$");
   }
 
-
   public void testNameFormatWithPercentS_custom() {
     String format = "super-duper-thread-%s";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -102,7 +100,6 @@
     }
   }
 
-
   public void testNameFormatWithPercentD_custom() {
     String format = "super-duper-thread-%d";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -111,21 +108,18 @@
     }
   }
 
-
   public void testDaemon_false() {
     ThreadFactory factory = builder.setDaemon(false).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertFalse(thread.isDaemon());
   }
 
-
   public void testDaemon_true() {
     ThreadFactory factory = builder.setDaemon(true).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertTrue(thread.isDaemon());
   }
 
-
   public void testPriority_custom() {
     for (int i = Thread.MIN_PRIORITY; i <= Thread.MAX_PRIORITY; i++) {
       ThreadFactory factory = builder.setPriority(i).build();
@@ -150,7 +144,6 @@
     }
   }
 
-
   public void testUncaughtExceptionHandler_custom() {
     assertEquals(
         UNCAUGHT_EXCEPTION_HANDLER,
@@ -161,7 +154,6 @@
             .getUncaughtExceptionHandler());
   }
 
-
   public void testBuildMutateBuild() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -177,7 +169,6 @@
     unused = builder.build(); // this is *also* allowed
   }
 
-
   public void testBuildMutate() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -186,7 +177,6 @@
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
   }
 
-
   public void testThreadFactory() throws InterruptedException {
     final String THREAD_NAME = "ludicrous speed";
     final int THREAD_PRIORITY = 1;
diff --git a/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java b/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java
index 157afa7..e735ae0 100644
--- a/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest.java
@@ -84,7 +84,6 @@
   }
 
   @GwtIncompatible // blocking wait
-
   public void testCancel_interrupted() throws Exception {
     final AtomicBoolean interruptedExceptionThrown = new AtomicBoolean();
     final CountDownLatch enterLatch = new CountDownLatch(1);
@@ -135,7 +134,6 @@
   }
 
   @GwtIncompatible // blocking wait
-
   public void testRunIdempotency() throws Exception {
     final int numThreads = 10;
     final ExecutorService executor = Executors.newFixedThreadPool(numThreads);
@@ -171,7 +169,6 @@
   }
 
   @GwtIncompatible // blocking wait
-
   public void testToString() throws Exception {
     final CountDownLatch enterLatch = new CountDownLatch(1);
     final CountDownLatch exitLatch = new CountDownLatch(1);
diff --git a/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java b/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java
index eb8455b..4a26b49 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UncaughtExceptionHandlersTest.java
@@ -23,7 +23,6 @@
 import junit.framework.TestCase;
 
 /** @author Gregory Kick */
-
 public class UncaughtExceptionHandlersTest extends TestCase {
 
   private Runtime runtimeMock;
diff --git a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
index 0d24266..3f91b81 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
@@ -77,7 +77,6 @@
    * This first test doesn't test anything in Uninterruptibles, just demonstrates some normal
    * behavior of futures so that you can contrast the next test with it.
    */
-
   public void testRegularFutureInterrupted() throws ExecutionException {
 
     /*
@@ -116,7 +115,6 @@
     assertTrue(sleeper.completed);
   }
 
-
   public void testMakeUninterruptible_timeoutPreservedThroughInterruption()
       throws ExecutionException {
 
@@ -155,32 +153,26 @@
     }
   }
 
-
   public void testMakeUninterruptible_untimed_uninterrupted() throws Exception {
     runUntimedInterruptsTest(0);
   }
 
-
   public void testMakeUninterruptible_untimed_interrupted() throws Exception {
     runUntimedInterruptsTest(1);
   }
 
-
   public void testMakeUninterruptible_untimed_multiplyInterrupted() throws Exception {
     runUntimedInterruptsTest(38);
   }
 
-
   public void testMakeUninterruptible_timed_uninterrupted() throws Exception {
     runTimedInterruptsTest(0);
   }
 
-
   public void testMakeUninterruptible_timed_interrupted() throws Exception {
     runTimedInterruptsTest(1);
   }
 
-
   public void testMakeUninterruptible_timed_multiplyInterrupted() throws Exception {
     runTimedInterruptsTest(38);
   }
@@ -218,7 +210,6 @@
   /**
    * Confirms that the test code triggers {@link InterruptedException} in a standard {@link Future}.
    */
-
   public void testMakeUninterruptible_plainFutureSanityCheck() throws Exception {
     SettableFuture<String> future = SettableFuture.create();
     FutureTask<Boolean> wasInterrupted = untimedInterruptReporter(future, true);
@@ -235,7 +226,6 @@
     }
   }
 
-
   public void testMakeUninterruptible_timedGetZeroTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
@@ -248,7 +238,6 @@
     assertEquals(RESULT, getUninterruptibly(future, 0, SECONDS));
   }
 
-
   public void testMakeUninterruptible_timedGetNegativeTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
diff --git a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
index 59bf808..3e775ba 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
@@ -22,7 +22,6 @@
  *
  * @author Justin T. Sampson
  */
-
 public class UninterruptibleMonitorTest extends MonitorTestCase {
 
   public UninterruptibleMonitorTest() {
diff --git a/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java b/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
index 4343d89..1b6501e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
@@ -55,7 +55,6 @@
  *
  * @author Anthony Zana
  */
-
 public class UninterruptiblesTest extends TestCase {
   private static final String EXPECTED_TAKE = "expectedTake";
 
diff --git a/guava/pom.xml b/guava/pom.xml
index 4a4f9eb..81a2005 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>31.0.1-jre</version>
+    <version>31.1-jre</version>
   </parent>
   <artifactId>guava</artifactId>
   <packaging>bundle</packaging>
@@ -129,7 +129,7 @@
           <!-- excludePackageNames requires specification of packages separately from "all subpackages".
                https://issues.apache.org/jira/browse/MJAVADOC-584 -->
           <excludePackageNames>
-            com.google.common.base.internal,com.google.common.base.internal.*,com.google.thirdparty.publicsuffix,com.google.thirdparty.publicsuffix.*,com.oracle.*,com.sun.*,java.*,javax.*,jdk,jdk.*,org.*,sun.*
+            com.azul.tooling.in,com.google.common.base.internal,com.google.common.base.internal.*,com.google.thirdparty.publicsuffix,com.google.thirdparty.publicsuffix.*,com.oracle.*,com.sun.*,java.*,javax.*,jdk,jdk.*,org.*,sun.*
           </excludePackageNames>
           <!-- Ignore some tags that are found in Java 11 sources but not recognized... under -source 8, I think it was? I can no longer reproduce the failure. -->
           <tags>
diff --git a/guava/src/com/google/common/base/CharMatcher.java b/guava/src/com/google/common/base/CharMatcher.java
index e052f80..253bc6a 100644
--- a/guava/src/com/google/common/base/CharMatcher.java
+++ b/guava/src/com/google/common/base/CharMatcher.java
@@ -1462,10 +1462,10 @@
     // [[[:Zs:][:Zl:][:Zp:][:Cc:][:Cf:][:Cs:][:Co:]]&[\u0000-\uFFFF]]
     // with the "Abbreviate" option, and get the ranges from there.
     private static final String RANGE_STARTS =
-        "\u0000\u007f\u00ad\u0600\u061c\u06dd\u070f\u08e2\u1680\u180e\u2000\u2028\u205f\u2066"
+        "\u0000\u007f\u00ad\u0600\u061c\u06dd\u070f\u0890\u08e2\u1680\u180e\u2000\u2028\u205f\u2066"
             + "\u3000\ud800\ufeff\ufff9";
     private static final String RANGE_ENDS = // inclusive ends
-        "\u0020\u00a0\u00ad\u0605\u061c\u06dd\u070f\u08e2\u1680\u180e\u200f\u202f\u2064\u206f"
+        "\u0020\u00a0\u00ad\u0605\u061c\u06dd\u070f\u0891\u08e2\u1680\u180e\u200f\u202f\u2064\u206f"
             + "\u3000\uf8ff\ufeff\ufffb";
 
     static final Invisible INSTANCE = new Invisible();
diff --git a/guava/src/com/google/common/base/Converter.java b/guava/src/com/google/common/base/Converter.java
index 208a032..422480d 100644
--- a/guava/src/com/google/common/base/Converter.java
+++ b/guava/src/com/google/common/base/Converter.java
@@ -19,7 +19,9 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.CheckReturnValue;
 import com.google.errorprone.annotations.ForOverride;
+import com.google.errorprone.annotations.InlineMe;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.Serializable;
@@ -270,7 +272,7 @@
    * both use cases by using @PolyNull. (By contrast, we can't use @PolyNull for our superinterface
    * (`implements Function<@PolyNull A, @PolyNull B>`), at least as far as I know.)
    */
-  public Iterable<B> convertAll(final Iterable<? extends A> fromIterable) {
+  public Iterable<B> convertAll(Iterable<? extends A> fromIterable) {
     checkNotNull(fromIterable, "fromIterable");
     return new Iterable<B>() {
       @Override
@@ -307,7 +309,7 @@
    *
    * <p><b>Note:</b> you should not override this method. It is non-final for legacy reasons.
    */
-  @CanIgnoreReturnValue
+  @CheckReturnValue
   public Converter<B, A> reverse() {
     Converter<B, A> result = reverse;
     return (result == null) ? reverse = new ReverseConverter<>(this) : result;
@@ -492,6 +494,7 @@
    */
   @SuppressWarnings("nullness")
   @CheckForNull
+  @InlineMe(replacement = "this.convert(a)")
   public final B apply(@CheckForNull A a) {
     return convert(a);
   }
diff --git a/guava/src/com/google/common/base/Enums.java b/guava/src/com/google/common/base/Enums.java
index 449b7e3..5c55b65 100644
--- a/guava/src/com/google/common/base/Enums.java
+++ b/guava/src/com/google/common/base/Enums.java
@@ -105,8 +105,8 @@
    *
    * @since 16.0
    */
-  public static <T extends Enum<T>> Converter<String, T> stringConverter(final Class<T> enumClass) {
-    return new StringConverter<T>(enumClass);
+  public static <T extends Enum<T>> Converter<String, T> stringConverter(Class<T> enumClass) {
+    return new StringConverter<>(enumClass);
   }
 
   private static final class StringConverter<T extends Enum<T>> extends Converter<String, T>
diff --git a/guava/src/com/google/common/base/Equivalence.java b/guava/src/com/google/common/base/Equivalence.java
index fbcd212..4e2e898 100644
--- a/guava/src/com/google/common/base/Equivalence.java
+++ b/guava/src/com/google/common/base/Equivalence.java
@@ -165,7 +165,43 @@
    * @since 10.0
    */
   public final <S extends @Nullable T> Wrapper<S> wrap(@ParametricNullness S reference) {
-    return new Wrapper<S>(this, reference);
+    /*
+     * I'm pretty sure that this warning "makes sense" but doesn't indicate a real problem.
+     *
+     * Why it "makes sense": If we pass a `@Nullable Foo`, then we should also pass an
+     * `Equivalence<? super @Nullable Foo>`. And there's no such thing because Equivalence doesn't
+     * permit nullable type arguments.
+     *
+     * Why there's no real problem: Every Equivalence can handle null.
+     *
+     * We could work around this by giving Wrapper 2 type parameters. In the terms of this method,
+     * that would be both the T parameter (from the class) and the S parameter (from this method).
+     * However, such a change would be source-incompatible. (Plus, there's no reason for the S
+     * parameter from the user's perspective, so it would be a wart.)
+     *
+     * We could probably also work around this by making Wrapper non-final and putting the
+     * implementation into a subclass with those 2 type parameters. But we like `final`, if only to
+     * deter users from using mocking frameworks to construct instances. (And could also complicate
+     * serialization, which is discussed more in the next paragraph.)
+     *
+     * We could probably also work around this by having Wrapper accept an instance of a new
+     * WrapperGuts class, which would then be the class that would declare the 2 type parameters.
+     * But that would break deserialization of previously serialized Wrapper instances. And while we
+     * specifically say not to rely on serialization across Guava versions, users sometimes do. So
+     * we'd rather not break them without a good enough reason.
+     *
+     * (We could work around the serialization problem by writing custom serialization code. But
+     * even that helps only the case of serializing with an old version and deserializing with a
+     * new, not vice versa -- unless we introduce WrapperGuts and the logic to handle it today, wait
+     * until "everyone" has picked up a version of Guava with that code, and *then* change to use
+     * WrapperGuts.)
+     *
+     * Anyway, a suppression isn't really a big deal. But I have tried to do some due diligence on
+     * avoiding it :)
+     */
+    @SuppressWarnings("nullness")
+    Wrapper<S> w = new Wrapper<>(this, reference);
+    return w;
   }
 
   /**
diff --git a/guava/src/com/google/common/base/FinalizableReferenceQueue.java b/guava/src/com/google/common/base/FinalizableReferenceQueue.java
index 5ce1d31..7447b80 100644
--- a/guava/src/com/google/common/base/FinalizableReferenceQueue.java
+++ b/guava/src/com/google/common/base/FinalizableReferenceQueue.java
@@ -156,7 +156,7 @@
   public FinalizableReferenceQueue() {
     // We could start the finalizer lazily, but I'd rather it blow up early.
     queue = new ReferenceQueue<>();
-    frqRef = new PhantomReference<Object>(this, queue);
+    frqRef = new PhantomReference<>(this, queue);
     boolean threadStarted = false;
     try {
       startFinalizer.invoke(null, FinalizableReference.class, queue, frqRef);
diff --git a/guava/src/com/google/common/base/FunctionalEquivalence.java b/guava/src/com/google/common/base/FunctionalEquivalence.java
index 8bb67be..4383f4f 100644
--- a/guava/src/com/google/common/base/FunctionalEquivalence.java
+++ b/guava/src/com/google/common/base/FunctionalEquivalence.java
@@ -20,6 +20,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Equivalence applied on functional result.
@@ -34,11 +35,11 @@
 
   private static final long serialVersionUID = 0;
 
-  private final Function<? super F, ? extends T> function;
+  private final Function<? super F, ? extends @Nullable T> function;
   private final Equivalence<T> resultEquivalence;
 
   FunctionalEquivalence(
-      Function<? super F, ? extends T> function, Equivalence<T> resultEquivalence) {
+      Function<? super F, ? extends @Nullable T> function, Equivalence<T> resultEquivalence) {
     this.function = checkNotNull(function);
     this.resultEquivalence = checkNotNull(resultEquivalence);
   }
diff --git a/guava/src/com/google/common/base/Functions.java b/guava/src/com/google/common/base/Functions.java
index 5337d0e..7878504 100644
--- a/guava/src/com/google/common/base/Functions.java
+++ b/guava/src/com/google/common/base/Functions.java
@@ -288,7 +288,7 @@
    */
   public static <T extends @Nullable Object> Function<T, Boolean> forPredicate(
       Predicate<T> predicate) {
-    return new PredicateFunction<T>(predicate);
+    return new PredicateFunction<>(predicate);
   }
 
   /** @see Functions#forPredicate */
diff --git a/guava/src/com/google/common/base/Joiner.java b/guava/src/com/google/common/base/Joiner.java
index 0f3d6e4..8b29f68 100644
--- a/guava/src/com/google/common/base/Joiner.java
+++ b/guava/src/com/google/common/base/Joiner.java
@@ -236,7 +236,7 @@
    * Returns a joiner with the same behavior as this one, except automatically substituting {@code
    * nullText} for any provided null elements.
    */
-  public Joiner useForNull(final String nullText) {
+  public Joiner useForNull(String nullText) {
     checkNotNull(nullText);
     return new Joiner(this) {
       @Override
@@ -493,9 +493,7 @@
   }
 
   private static Iterable<@Nullable Object> iterable(
-      @CheckForNull final Object first,
-      @CheckForNull final Object second,
-      final @Nullable Object[] rest) {
+      @CheckForNull Object first, @CheckForNull Object second, @Nullable Object[] rest) {
     checkNotNull(rest);
     return new AbstractList<@Nullable Object>() {
       @Override
diff --git a/guava/src/com/google/common/base/ParametricNullness.java b/guava/src/com/google/common/base/ParametricNullness.java
index c736055..5b595ad 100644
--- a/guava/src/com/google/common/base/ParametricNullness.java
+++ b/guava/src/com/google/common/base/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/base/Predicates.java b/guava/src/com/google/common/base/Predicates.java
index c3b5562..dc487fc 100644
--- a/guava/src/com/google/common/base/Predicates.java
+++ b/guava/src/com/google/common/base/Predicates.java
@@ -82,7 +82,7 @@
    * false}.
    */
   public static <T extends @Nullable Object> Predicate<T> not(Predicate<T> predicate) {
-    return new NotPredicate<T>(predicate);
+    return new NotPredicate<>(predicate);
   }
 
   /**
@@ -94,7 +94,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> and(
       Iterable<? extends Predicate<? super T>> components) {
-    return new AndPredicate<T>(defensiveCopy(components));
+    return new AndPredicate<>(defensiveCopy(components));
   }
 
   /**
@@ -116,7 +116,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> and(
       Predicate<? super T> first, Predicate<? super T> second) {
-    return new AndPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
+    return new AndPredicate<>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
   /**
@@ -128,7 +128,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> or(
       Iterable<? extends Predicate<? super T>> components) {
-    return new OrPredicate<T>(defensiveCopy(components));
+    return new OrPredicate<>(defensiveCopy(components));
   }
 
   /**
@@ -150,7 +150,7 @@
    */
   public static <T extends @Nullable Object> Predicate<T> or(
       Predicate<? super T> first, Predicate<? super T> second) {
-    return new OrPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
+    return new OrPredicate<>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
   /**
@@ -213,7 +213,7 @@
    * @param target the collection that may contain the function input
    */
   public static <T extends @Nullable Object> Predicate<T> in(Collection<? extends T> target) {
-    return new InPredicate<T>(target);
+    return new InPredicate<>(target);
   }
 
   /**
@@ -713,7 +713,7 @@
   }
 
   static <T> List<T> defensiveCopy(Iterable<T> iterable) {
-    ArrayList<T> list = new ArrayList<T>();
+    ArrayList<T> list = new ArrayList<>();
     for (T element : iterable) {
       list.add(checkNotNull(element));
     }
diff --git a/guava/src/com/google/common/base/Present.java b/guava/src/com/google/common/base/Present.java
index 59efebc..4e62da2 100644
--- a/guava/src/com/google/common/base/Present.java
+++ b/guava/src/com/google/common/base/Present.java
@@ -71,7 +71,7 @@
 
   @Override
   public <V> Optional<V> transform(Function<? super T, V> function) {
-    return new Present<V>(
+    return new Present<>(
         checkNotNull(
             function.apply(reference),
             "the Function passed to Optional.transform() must not return null."));
diff --git a/guava/src/com/google/common/base/Suppliers.java b/guava/src/com/google/common/base/Suppliers.java
index 57d3486..6ced905 100644
--- a/guava/src/com/google/common/base/Suppliers.java
+++ b/guava/src/com/google/common/base/Suppliers.java
@@ -226,7 +226,7 @@
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public static <T extends @Nullable Object> Supplier<T> memoizeWithExpiration(
       Supplier<T> delegate, long duration, TimeUnit unit) {
-    return new ExpiringMemoizingSupplier<T>(delegate, duration, unit);
+    return new ExpiringMemoizingSupplier<>(delegate, duration, unit);
   }
 
   @VisibleForTesting
@@ -286,7 +286,7 @@
   /** Returns a supplier that always supplies {@code instance}. */
   public static <T extends @Nullable Object> Supplier<T> ofInstance(
       @ParametricNullness T instance) {
-    return new SupplierOfInstance<T>(instance);
+    return new SupplierOfInstance<>(instance);
   }
 
   private static class SupplierOfInstance<T extends @Nullable Object>
@@ -331,7 +331,7 @@
    */
   public static <T extends @Nullable Object> Supplier<T> synchronizedSupplier(
       Supplier<T> delegate) {
-    return new ThreadSafeSupplier<T>(delegate);
+    return new ThreadSafeSupplier<>(delegate);
   }
 
   private static class ThreadSafeSupplier<T extends @Nullable Object>
diff --git a/guava/src/com/google/common/base/Throwables.java b/guava/src/com/google/common/base/Throwables.java
index 7832d18..e45ce80 100644
--- a/guava/src/com/google/common/base/Throwables.java
+++ b/guava/src/com/google/common/base/Throwables.java
@@ -19,7 +19,6 @@
 import static java.util.Collections.unmodifiableList;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -290,7 +289,6 @@
    * @return an unmodifiable list containing the cause chain starting with {@code throwable}
    * @throws IllegalArgumentException if there is a loop in the causal chain
    */
-  @Beta // TODO(kevinb): decide best return type
   public static List<Throwable> getCausalChain(Throwable throwable) {
     checkNotNull(throwable);
     List<Throwable> causes = new ArrayList<>(4);
@@ -330,7 +328,6 @@
    *     ClassCastException}'s cause is {@code throwable}.
    * @since 22.0
    */
-  @Beta
   @GwtIncompatible // Class.cast(Object)
   @CheckForNull
   public static <X extends Throwable> X getCauseAs(
@@ -382,11 +379,12 @@
    * exception's creation.
    *
    * @since 19.0
+   * @deprecated This method is equivalent to {@link Throwable#getStackTrace()} on JDK versions past
+   *     JDK 8 and on all Android versions. Use {@link Throwable#getStackTrace()} directly, or where
+   *     possible use the {@code java.lang.StackWalker.walk} method introduced in JDK 9.
    */
-  // TODO(cpovirk): Say something about the possibility that List access could fail at runtime?
-  @Beta
+  @Deprecated
   @GwtIncompatible // lazyStackTraceIsLazy, jlaStackTrace
-  // TODO(cpovirk): Consider making this available under GWT (slow implementation only).
   public static List<StackTraceElement> lazyStackTrace(Throwable throwable) {
     return lazyStackTraceIsLazy()
         ? jlaStackTrace(throwable)
@@ -398,15 +396,17 @@
    * documentation.
    *
    * @since 19.0
+   * @deprecated This method always returns false on JDK versions past JDK 8 and on all Android
+   *     versions.
    */
-  @Beta
+  @Deprecated
   @GwtIncompatible // getStackTraceElementMethod
   public static boolean lazyStackTraceIsLazy() {
     return getStackTraceElementMethod != null && getStackTraceDepthMethod != null;
   }
 
   @GwtIncompatible // invokeAccessibleNonThrowingMethod
-  private static List<StackTraceElement> jlaStackTrace(final Throwable t) {
+  private static List<StackTraceElement> jlaStackTrace(Throwable t) {
     checkNotNull(t);
     /*
      * TODO(cpovirk): Consider optimizing iterator() to catch IOOBE instead of doing bounds checks.
diff --git a/guava/src/com/google/common/base/internal/Finalizer.java b/guava/src/com/google/common/base/internal/Finalizer.java
index 75d0d72..b45ec15 100644
--- a/guava/src/com/google/common/base/internal/Finalizer.java
+++ b/guava/src/com/google/common/base/internal/Finalizer.java
@@ -23,7 +23,7 @@
 import java.lang.reflect.Method;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Thread that finalizes referents. All references should implement {@code
@@ -43,6 +43,7 @@
  * collected, and this class can detect when the main class loader has been garbage collected and
  * stop itself.
  */
+// no @ElementTypesAreNonNullByDefault for the reasons discussed above
 public class Finalizer implements Runnable {
 
   private static final Logger logger = Logger.getLogger(Finalizer.class.getName());
@@ -116,10 +117,11 @@
   // By preference, we will use the Thread constructor that has an `inheritThreadLocals` parameter.
   // But before Java 9, our only way not to inherit ThreadLocals is to zap them after the thread
   // is created, by accessing a private field.
-  private static final @Nullable Constructor<Thread> bigThreadConstructor =
-      getBigThreadConstructor();
+  @CheckForNull
+  private static final Constructor<Thread> bigThreadConstructor = getBigThreadConstructor();
 
-  private static final @Nullable Field inheritableThreadLocals =
+  @CheckForNull
+  private static final Field inheritableThreadLocals =
       (bigThreadConstructor == null) ? getInheritableThreadLocalsField() : null;
 
   /** Constructs a new finalizer thread. */
@@ -129,8 +131,7 @@
       PhantomReference<Object> frqReference) {
     this.queue = queue;
 
-    this.finalizableReferenceClassReference =
-        new WeakReference<Class<?>>(finalizableReferenceClass);
+    this.finalizableReferenceClassReference = new WeakReference<>(finalizableReferenceClass);
 
     // Keep track of the FRQ that started us so we know when to stop.
     this.frqReference = frqReference;
@@ -191,7 +192,8 @@
   }
 
   /** Looks up FinalizableReference.finalizeReferent() method. */
-  private @Nullable Method getFinalizeReferentMethod() {
+  @CheckForNull
+  private Method getFinalizeReferentMethod() {
     Class<?> finalizableReferenceClass = finalizableReferenceClassReference.get();
     if (finalizableReferenceClass == null) {
       /*
@@ -209,7 +211,8 @@
     }
   }
 
-  private static @Nullable Field getInheritableThreadLocalsField() {
+  @CheckForNull
+  private static Field getInheritableThreadLocalsField() {
     try {
       Field inheritableThreadLocals = Thread.class.getDeclaredField("inheritableThreadLocals");
       inheritableThreadLocals.setAccessible(true);
@@ -223,7 +226,8 @@
     }
   }
 
-  private static @Nullable Constructor<Thread> getBigThreadConstructor() {
+  @CheckForNull
+  private static Constructor<Thread> getBigThreadConstructor() {
     try {
       return Thread.class.getConstructor(
           ThreadGroup.class, Runnable.class, String.class, long.class, boolean.class);
diff --git a/guava/src/com/google/common/cache/CacheBuilder.java b/guava/src/com/google/common/cache/CacheBuilder.java
index 3537bab..668769b 100644
--- a/guava/src/com/google/common/cache/CacheBuilder.java
+++ b/guava/src/com/google/common/cache/CacheBuilder.java
@@ -48,8 +48,10 @@
  *
  * <p>The successor to Guava's caching API is <a
  * href="https://github.com/ben-manes/caffeine/wiki">Caffeine</a>. Its API is designed to make it a
- * nearly drop-in replacement -- though it requires Java 8 APIs and is not available for Android or
- * GWT/j2cl. Its equivalent to {@code CacheBuilder} is its <a
+ * nearly drop-in replacement -- though it requires Java 8 APIs, is not available for Android or
+ * GWT/j2cl, and may have <a href="https://github.com/ben-manes/caffeine/wiki/Guava">different
+ * (usually better) behavior</a> when multiple threads attempt concurrent mutations. Its equivalent
+ * to {@code CacheBuilder} is its <a
  * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/Caffeine.html">{@code
  * Caffeine}</a> class. Caffeine offers better performance, more features (including asynchronous
  * loading), and fewer <a
diff --git a/guava/src/com/google/common/cache/CacheBuilderSpec.java b/guava/src/com/google/common/cache/CacheBuilderSpec.java
index 64b5ad2..7757f3b 100644
--- a/guava/src/com/google/common/cache/CacheBuilderSpec.java
+++ b/guava/src/com/google/common/cache/CacheBuilderSpec.java
@@ -108,7 +108,7 @@
           .put("expireAfterWrite", new WriteDurationParser())
           .put("refreshAfterWrite", new RefreshDurationParser())
           .put("refreshInterval", new RefreshDurationParser())
-          .build();
+          .buildOrThrow();
 
   @VisibleForTesting @CheckForNull Integer initialCapacity;
   @VisibleForTesting @CheckForNull Long maximumSize;
diff --git a/guava/src/com/google/common/cache/LocalCache.java b/guava/src/com/google/common/cache/LocalCache.java
index f421781..f2cbee3 100644
--- a/guava/src/com/google/common/cache/LocalCache.java
+++ b/guava/src/com/google/common/cache/LocalCache.java
@@ -21,6 +21,7 @@
 import static com.google.common.util.concurrent.Futures.transform;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+import static java.util.Collections.unmodifiableSet;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import com.google.common.annotations.GwtCompatible;
@@ -35,7 +36,6 @@
 import com.google.common.cache.CacheBuilder.OneWeigher;
 import com.google.common.cache.CacheLoader.InvalidCacheLoadException;
 import com.google.common.cache.CacheLoader.UnsupportedLoadingOperationException;
-import com.google.common.cache.LocalCache.AbstractCacheSet;
 import com.google.common.collect.AbstractSequentialIterator;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -2189,7 +2189,7 @@
       }
     }
 
-    V compute(K key, int hash, BiFunction<? super K, ? super V, ? extends V> function) {
+    V compute(K key, int hash, BiFunction<? super K, ? super @Nullable V, ? extends V> function) {
       ReferenceEntry<K, V> e;
       ValueReference<K, V> valueReference = null;
       ComputingValueReference<K, V> computingValueReference = null;
@@ -3558,7 +3558,7 @@
       }
     }
 
-    public V compute(K key, BiFunction<? super K, ? super V, ? extends V> function) {
+    public V compute(K key, BiFunction<? super K, ? super @Nullable V, ? extends V> function) {
       stopwatch.start();
       V previousValue;
       try {
@@ -3993,7 +3993,7 @@
     int hits = 0;
     int misses = 0;
 
-    Map<K, V> result = Maps.newLinkedHashMap();
+    ImmutableMap.Builder<K, V> result = ImmutableMap.builder();
     for (Object key : keys) {
       V value = get(key);
       if (value == null) {
@@ -4008,7 +4008,7 @@
     }
     globalStatsCounter.recordHits(hits);
     globalStatsCounter.recordMisses(misses);
-    return ImmutableMap.copyOf(result);
+    return result.buildKeepingLast();
   }
 
   ImmutableMap<K, V> getAll(Iterable<? extends K> keys) throws ExecutionException {
@@ -4033,7 +4033,7 @@
     try {
       if (!keysToLoad.isEmpty()) {
         try {
-          Map<K, V> newEntries = loadAll(keysToLoad, defaultLoader);
+          Map<K, V> newEntries = loadAll(unmodifiableSet(keysToLoad), defaultLoader);
           for (K key : keysToLoad) {
             V value = newEntries.get(key);
             if (value == null) {
@@ -4205,7 +4205,7 @@
   }
 
   @Override
-  public V compute(K key, BiFunction<? super K, ? super V, ? extends V> function) {
+  public V compute(K key, BiFunction<? super K, ? super @Nullable V, ? extends V> function) {
     checkNotNull(key);
     checkNotNull(function);
     int hash = hash(key);
diff --git a/guava/src/com/google/common/cache/LongAddables.java b/guava/src/com/google/common/cache/LongAddables.java
index b0f9e2b..249c6e1 100644
--- a/guava/src/com/google/common/cache/LongAddables.java
+++ b/guava/src/com/google/common/cache/LongAddables.java
@@ -31,7 +31,8 @@
   static {
     Supplier<LongAddable> supplier;
     try {
-      new LongAdder(); // trigger static initialization of the LongAdder class, which may fail
+      // trigger static initialization of the LongAdder class, which may fail
+      LongAdder unused = new LongAdder();
       supplier =
           new Supplier<LongAddable>() {
             @Override
diff --git a/guava/src/com/google/common/cache/ParametricNullness.java b/guava/src/com/google/common/cache/ParametricNullness.java
index 19305a6..64682de 100644
--- a/guava/src/com/google/common/cache/ParametricNullness.java
+++ b/guava/src/com/google/common/cache/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/cache/RemovalListeners.java b/guava/src/com/google/common/cache/RemovalListeners.java
index d0623e7..38edf35 100644
--- a/guava/src/com/google/common/cache/RemovalListeners.java
+++ b/guava/src/com/google/common/cache/RemovalListeners.java
@@ -39,20 +39,10 @@
    * @param executor the executor with which removal notifications are asynchronously executed
    */
   public static <K, V> RemovalListener<K, V> asynchronous(
-      final RemovalListener<K, V> listener, final Executor executor) {
+      RemovalListener<K, V> listener, Executor executor) {
     checkNotNull(listener);
     checkNotNull(executor);
-    return new RemovalListener<K, V>() {
-      @Override
-      public void onRemoval(final RemovalNotification<K, V> notification) {
-        executor.execute(
-            new Runnable() {
-              @Override
-              public void run() {
-                listener.onRemoval(notification);
-              }
-            });
-      }
-    };
+    return (RemovalNotification<K, V> notification) ->
+        executor.execute(() -> listener.onRemoval(notification));
   }
 }
diff --git a/guava/src/com/google/common/cache/RemovalNotification.java b/guava/src/com/google/common/cache/RemovalNotification.java
index dab7fe5..b96fc57 100644
--- a/guava/src/com/google/common/cache/RemovalNotification.java
+++ b/guava/src/com/google/common/cache/RemovalNotification.java
@@ -47,7 +47,7 @@
    */
   public static <K, V> RemovalNotification<K, V> create(
       @CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
-    return new RemovalNotification(key, value, cause);
+    return new RemovalNotification<>(key, value, cause);
   }
 
   private RemovalNotification(@CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
diff --git a/guava/src/com/google/common/collect/AbstractSortedMultiset.java b/guava/src/com/google/common/collect/AbstractSortedMultiset.java
index fd4fce2..621e8f9 100644
--- a/guava/src/com/google/common/collect/AbstractSortedMultiset.java
+++ b/guava/src/com/google/common/collect/AbstractSortedMultiset.java
@@ -56,7 +56,7 @@
 
   @Override
   NavigableSet<E> createElementSet() {
-    return new SortedMultisets.NavigableElementSet<E>(this);
+    return new SortedMultisets.NavigableElementSet<>(this);
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/ArrayListMultimap.java b/guava/src/com/google/common/collect/ArrayListMultimap.java
index c8f7106..e31f491 100644
--- a/guava/src/com/google/common/collect/ArrayListMultimap.java
+++ b/guava/src/com/google/common/collect/ArrayListMultimap.java
@@ -53,8 +53,7 @@
  * with a call to {@link Multimaps#synchronizedListMultimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/ArrayTable.java b/guava/src/com/google/common/collect/ArrayTable.java
index 01652c5..1fce762 100644
--- a/guava/src/com/google/common/collect/ArrayTable.java
+++ b/guava/src/com/google/common/collect/ArrayTable.java
@@ -84,7 +84,7 @@
  * thread that reads from another.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @since 10.0
diff --git a/guava/src/com/google/common/collect/CartesianList.java b/guava/src/com/google/common/collect/CartesianList.java
index 475b3f2..4c31b12 100644
--- a/guava/src/com/google/common/collect/CartesianList.java
+++ b/guava/src/com/google/common/collect/CartesianList.java
@@ -45,7 +45,7 @@
       }
       axesBuilder.add(copy);
     }
-    return new CartesianList<E>(axesBuilder.build());
+    return new CartesianList<>(axesBuilder.build());
   }
 
   CartesianList(ImmutableList<List<E>> axes) {
@@ -112,7 +112,7 @@
   }
 
   @Override
-  public ImmutableList<E> get(final int index) {
+  public ImmutableList<E> get(int index) {
     checkElementIndex(index, size());
     return new ImmutableList<E>() {
 
diff --git a/guava/src/com/google/common/collect/CollectCollectors.java b/guava/src/com/google/common/collect/CollectCollectors.java
index 63eec12..f582660 100644
--- a/guava/src/com/google/common/collect/CollectCollectors.java
+++ b/guava/src/com/google/common/collect/CollectCollectors.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.stream.Collectors.collectingAndThen;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -194,7 +195,7 @@
     checkNotNull(keyFunction);
     checkNotNull(valueFunction);
     checkNotNull(mergeFunction);
-    return Collectors.collectingAndThen(
+    return collectingAndThen(
         Collectors.toMap(keyFunction, valueFunction, mergeFunction, LinkedHashMap::new),
         ImmutableMap::copyOf);
   }
@@ -229,7 +230,7 @@
     checkNotNull(keyFunction);
     checkNotNull(valueFunction);
     checkNotNull(mergeFunction);
-    return Collectors.collectingAndThen(
+    return collectingAndThen(
         Collectors.toMap(
             keyFunction, valueFunction, mergeFunction, () -> new TreeMap<K, V>(comparator)),
         ImmutableSortedMap::copyOfSorted);
@@ -368,7 +369,7 @@
           Function<? super T, ? extends Stream<? extends V>> valuesFunction) {
     checkNotNull(keyFunction);
     checkNotNull(valuesFunction);
-    return Collectors.collectingAndThen(
+    return collectingAndThen(
         flatteningToMultimap(
             input -> checkNotNull(keyFunction.apply(input)),
             input -> valuesFunction.apply(input).peek(Preconditions::checkNotNull),
@@ -395,7 +396,7 @@
           Function<? super T, ? extends Stream<? extends V>> valuesFunction) {
     checkNotNull(keyFunction);
     checkNotNull(valuesFunction);
-    return Collectors.collectingAndThen(
+    return collectingAndThen(
         flatteningToMultimap(
             input -> checkNotNull(keyFunction.apply(input)),
             input -> valuesFunction.apply(input).peek(Preconditions::checkNotNull),
diff --git a/guava/src/com/google/common/collect/CollectSpliterators.java b/guava/src/com/google/common/collect/CollectSpliterators.java
index 91f563d..7d0e82f 100644
--- a/guava/src/com/google/common/collect/CollectSpliterators.java
+++ b/guava/src/com/google/common/collect/CollectSpliterators.java
@@ -19,6 +19,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.lang.Math.max;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.j2objc.annotations.Weak;
@@ -225,7 +226,7 @@
         "flatMap does not support SORTED characteristic");
     checkNotNull(fromSpliterator);
     checkNotNull(function);
-    return new FlatMapSpliteratorOfObject<InElementT, OutElementT>(
+    return new FlatMapSpliteratorOfObject<>(
         null, fromSpliterator, function, topCharacteristics, topSize);
   }
 
@@ -247,7 +248,7 @@
         "flatMap does not support SORTED characteristic");
     checkNotNull(fromSpliterator);
     checkNotNull(function);
-    return new FlatMapSpliteratorOfInt<InElementT>(
+    return new FlatMapSpliteratorOfInt<>(
         null, fromSpliterator, function, topCharacteristics, topSize);
   }
 
@@ -269,7 +270,7 @@
         "flatMap does not support SORTED characteristic");
     checkNotNull(fromSpliterator);
     checkNotNull(function);
-    return new FlatMapSpliteratorOfLong<InElementT>(
+    return new FlatMapSpliteratorOfLong<>(
         null, fromSpliterator, function, topCharacteristics, topSize);
   }
 
@@ -291,7 +292,7 @@
         "flatMap does not support SORTED characteristic");
     checkNotNull(fromSpliterator);
     checkNotNull(function);
-    return new FlatMapSpliteratorOfDouble<InElementT>(
+    return new FlatMapSpliteratorOfDouble<>(
         null, fromSpliterator, function, topCharacteristics, topSize);
   }
 
@@ -409,9 +410,9 @@
     @Override
     public final long estimateSize() {
       if (prefix != null) {
-        estimatedSize = Math.max(estimatedSize, prefix.estimateSize());
+        estimatedSize = max(estimatedSize, prefix.estimateSize());
       }
-      return Math.max(estimatedSize, 0);
+      return max(estimatedSize, 0);
     }
 
     @Override
diff --git a/guava/src/com/google/common/collect/Comparators.java b/guava/src/com/google/common/collect/Comparators.java
index 1b90fb8..5779be3 100644
--- a/guava/src/com/google/common/collect/Comparators.java
+++ b/guava/src/com/google/common/collect/Comparators.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
@@ -62,7 +61,6 @@
   // Note: 90% of the time we don't add type parameters or wildcards that serve only to "tweak" the
   // desired return type. However, *nested* generics introduce a special class of problems that we
   // think tip it over into being worthwhile.
-  @Beta
   public static <T extends @Nullable Object, S extends T> Comparator<Iterable<S>> lexicographical(
       Comparator<T> comparator) {
     return new LexicographicalOrdering<S>(checkNotNull(comparator));
@@ -73,7 +71,6 @@
    * equal to the element that preceded it, according to the specified comparator. Note that this is
    * always true when the iterable has fewer than two elements.
    */
-  @Beta
   public static <T extends @Nullable Object> boolean isInOrder(
       Iterable<? extends T> iterable, Comparator<T> comparator) {
     checkNotNull(comparator);
@@ -96,7 +93,6 @@
    * greater than the element that preceded it, according to the specified comparator. Note that
    * this is always true when the iterable has fewer than two elements.
    */
-  @Beta
   public static <T extends @Nullable Object> boolean isInStrictOrder(
       Iterable<? extends T> iterable, Comparator<T> comparator) {
     checkNotNull(comparator);
@@ -178,7 +174,6 @@
    *
    * @since 22.0
    */
-  @Beta
   public static <T> Comparator<Optional<T>> emptiesFirst(Comparator<? super T> valueComparator) {
     checkNotNull(valueComparator);
     return Comparator.<Optional<T>, @Nullable T>comparing(
@@ -192,7 +187,6 @@
    *
    * @since 22.0
    */
-  @Beta
   public static <T> Comparator<Optional<T>> emptiesLast(Comparator<? super T> valueComparator) {
     checkNotNull(valueComparator);
     return Comparator.<Optional<T>, @Nullable T>comparing(
@@ -212,7 +206,6 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
    * @since 30.0
    */
-  @Beta
   public static <T extends Comparable<? super T>> T min(T a, T b) {
     return (a.compareTo(b) <= 0) ? a : b;
   }
@@ -232,7 +225,6 @@
    *     comparator.
    * @since 30.0
    */
-  @Beta
   @ParametricNullness
   public static <T extends @Nullable Object> T min(
       @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
@@ -252,7 +244,6 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
    * @since 30.0
    */
-  @Beta
   public static <T extends Comparable<? super T>> T max(T a, T b) {
     return (a.compareTo(b) >= 0) ? a : b;
   }
@@ -272,7 +263,6 @@
    *     comparator.
    * @since 30.0
    */
-  @Beta
   @ParametricNullness
   public static <T extends @Nullable Object> T max(
       @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
diff --git a/guava/src/com/google/common/collect/ComparisonChain.java b/guava/src/com/google/common/collect/ComparisonChain.java
index 32aeb4d..9c05205 100644
--- a/guava/src/com/google/common/collect/ComparisonChain.java
+++ b/guava/src/com/google/common/collect/ComparisonChain.java
@@ -49,7 +49,7 @@
  * the presence of expensive {@code compareTo} and {@code compare} implementations.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CommonObjectUtilitiesExplained#comparecompareto"> {@code
+ * "https://github.com/google/guava/wiki/CommonObjectUtilitiesExplained#comparecompareto">{@code
  * ComparisonChain}</a>.
  *
  * @author Mark Davis
diff --git a/guava/src/com/google/common/collect/ConcurrentHashMultiset.java b/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
index ab03ead..4724841 100644
--- a/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
+++ b/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
@@ -49,8 +49,7 @@
  * {@code Multiset} operations (exceptions where noted). Null elements are not supported.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Cliff L. Biffle
  * @author mike nonemacher
@@ -88,7 +87,7 @@
     // TODO(schmoe): provide a way to use this class with other (possibly arbitrary)
     // ConcurrentMap implementors. One possibility is to extract most of this class into
     // an AbstractConcurrentMapMultiset.
-    return new ConcurrentHashMultiset<E>(new ConcurrentHashMap<E, AtomicInteger>());
+    return new ConcurrentHashMultiset<>(new ConcurrentHashMap<E, AtomicInteger>());
   }
 
   /**
@@ -121,7 +120,7 @@
    */
   @Beta
   public static <E> ConcurrentHashMultiset<E> create(ConcurrentMap<E, AtomicInteger> countMap) {
-    return new ConcurrentHashMultiset<E>(countMap);
+    return new ConcurrentHashMultiset<>(countMap);
   }
 
   @VisibleForTesting
@@ -449,7 +448,7 @@
 
   @Override
   Set<E> createElementSet() {
-    final Set<E> delegate = countMap.keySet();
+    Set<E> delegate = countMap.keySet();
     return new ForwardingSet<E>() {
       @Override
       protected Set<E> delegate() {
@@ -504,7 +503,7 @@
   Iterator<Entry<E>> entryIterator() {
     // AbstractIterator makes this fairly clean, but it doesn't support remove(). To support
     // remove(), we create an AbstractIterator, and then use ForwardingIterator to delegate to it.
-    final Iterator<Entry<E>> readOnlyIterator =
+    Iterator<Entry<E>> readOnlyIterator =
         new AbstractIterator<Entry<E>>() {
           private final Iterator<Map.Entry<E, AtomicInteger>> mapEntries =
               countMap.entrySet().iterator();
diff --git a/guava/src/com/google/common/collect/ContiguousSet.java b/guava/src/com/google/common/collect/ContiguousSet.java
index cd77042..b3e4889 100644
--- a/guava/src/com/google/common/collect/ContiguousSet.java
+++ b/guava/src/com/google/common/collect/ContiguousSet.java
@@ -242,7 +242,7 @@
   @Override
   @GwtIncompatible // NavigableSet
   ImmutableSortedSet<C> createDescendingSet() {
-    return new DescendingImmutableSortedSet<C>(this);
+    return new DescendingImmutableSortedSet<>(this);
   }
 
   /** Returns a short-hand representation of the contents such as {@code "[1..100]"}. */
diff --git a/guava/src/com/google/common/collect/Cut.java b/guava/src/com/google/common/collect/Cut.java
index 4a8d4c7..21fe5ff 100644
--- a/guava/src/com/google/common/collect/Cut.java
+++ b/guava/src/com/google/common/collect/Cut.java
@@ -308,7 +308,7 @@
   }
 
   static <C extends Comparable> Cut<C> belowValue(C endpoint) {
-    return new BelowValue<C>(endpoint);
+    return new BelowValue<>(endpoint);
   }
 
   private static final class BelowValue<C extends Comparable> extends Cut<C> {
@@ -392,7 +392,7 @@
   }
 
   static <C extends Comparable> Cut<C> aboveValue(C endpoint) {
-    return new AboveValue<C>(endpoint);
+    return new AboveValue<>(endpoint);
   }
 
   private static final class AboveValue<C extends Comparable> extends Cut<C> {
diff --git a/guava/src/com/google/common/collect/DescendingMultiset.java b/guava/src/com/google/common/collect/DescendingMultiset.java
index ec5a1d0..7db0fbb 100644
--- a/guava/src/com/google/common/collect/DescendingMultiset.java
+++ b/guava/src/com/google/common/collect/DescendingMultiset.java
@@ -54,7 +54,7 @@
   public NavigableSet<E> elementSet() {
     NavigableSet<E> result = elementSet;
     if (result == null) {
-      return elementSet = new SortedMultisets.NavigableElementSet<E>(this);
+      return elementSet = new SortedMultisets.NavigableElementSet<>(this);
     }
     return result;
   }
diff --git a/guava/src/com/google/common/collect/DiscreteDomain.java b/guava/src/com/google/common/collect/DiscreteDomain.java
index bce7062..222ebe5 100644
--- a/guava/src/com/google/common/collect/DiscreteDomain.java
+++ b/guava/src/com/google/common/collect/DiscreteDomain.java
@@ -37,7 +37,7 @@
  * represent partial domains such as "prime integers" or "strings of length 5."
  *
  * <p>See the Guava User Guide section on <a href=
- * "https://github.com/google/guava/wiki/RangesExplained#discrete-domains"> {@code
+ * "https://github.com/google/guava/wiki/RangesExplained#discrete-domains">{@code
  * DiscreteDomain}</a>.
  *
  * @author Kevin Bourrillion
diff --git a/guava/src/com/google/common/collect/EmptyContiguousSet.java b/guava/src/com/google/common/collect/EmptyContiguousSet.java
index f4fe33c..50d7b12 100644
--- a/guava/src/com/google/common/collect/EmptyContiguousSet.java
+++ b/guava/src/com/google/common/collect/EmptyContiguousSet.java
@@ -150,7 +150,7 @@
     }
 
     private Object readResolve() {
-      return new EmptyContiguousSet<C>(domain);
+      return new EmptyContiguousSet<>(domain);
     }
 
     private static final long serialVersionUID = 0;
@@ -159,7 +159,7 @@
   @GwtIncompatible // serialization
   @Override
   Object writeReplace() {
-    return new SerializedForm<C>(domain);
+    return new SerializedForm<>(domain);
   }
 
   @GwtIncompatible // NavigableSet
diff --git a/guava/src/com/google/common/collect/EnumBiMap.java b/guava/src/com/google/common/collect/EnumBiMap.java
index 82aa052..97d3c2e 100644
--- a/guava/src/com/google/common/collect/EnumBiMap.java
+++ b/guava/src/com/google/common/collect/EnumBiMap.java
@@ -32,7 +32,7 @@
  * An {@code EnumBiMap} and its inverse are both serializable.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap}</a>.
  *
  * @author Mike Bostock
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/EnumHashBiMap.java b/guava/src/com/google/common/collect/EnumHashBiMap.java
index f68bc4c..5fbbb70 100644
--- a/guava/src/com/google/common/collect/EnumHashBiMap.java
+++ b/guava/src/com/google/common/collect/EnumHashBiMap.java
@@ -36,7 +36,7 @@
  * EnumHashBiMap} and its inverse are both serializable.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap}</a>.
  *
  * @author Mike Bostock
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/EnumMultiset.java b/guava/src/com/google/common/collect/EnumMultiset.java
index 09dde1b..778902e 100644
--- a/guava/src/com/google/common/collect/EnumMultiset.java
+++ b/guava/src/com/google/common/collect/EnumMultiset.java
@@ -38,8 +38,7 @@
  * in O(1).
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/EvictingQueue.java b/guava/src/com/google/common/collect/EvictingQueue.java
index 45f59f3..5667dfa 100644
--- a/guava/src/com/google/common/collect/EvictingQueue.java
+++ b/guava/src/com/google/common/collect/EvictingQueue.java
@@ -54,7 +54,7 @@
 
   private EvictingQueue(int maxSize) {
     checkArgument(maxSize >= 0, "maxSize (%s) must >= 0", maxSize);
-    this.delegate = new ArrayDeque<E>(maxSize);
+    this.delegate = new ArrayDeque<>(maxSize);
     this.maxSize = maxSize;
   }
 
@@ -65,7 +65,7 @@
    * queue.
    */
   public static <E> EvictingQueue<E> create(int maxSize) {
-    return new EvictingQueue<E>(maxSize);
+    return new EvictingQueue<>(maxSize);
   }
 
   /**
diff --git a/guava/src/com/google/common/collect/FilteredEntryMultimap.java b/guava/src/com/google/common/collect/FilteredEntryMultimap.java
index 3ff00b7..de946a2 100644
--- a/guava/src/com/google/common/collect/FilteredEntryMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredEntryMultimap.java
@@ -118,7 +118,7 @@
   }
 
   @Override
-  public Collection<V> get(@ParametricNullness final K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     return filterCollection(unfiltered.get(key), new ValuePredicate(key));
   }
 
@@ -396,15 +396,11 @@
           return FilteredEntryMultimap.this.keySet().size();
         }
 
-        private boolean removeEntriesIf(final Predicate<? super Multiset.Entry<K>> predicate) {
+        private boolean removeEntriesIf(Predicate<? super Multiset.Entry<K>> predicate) {
           return FilteredEntryMultimap.this.removeEntriesIf(
-              new Predicate<Map.Entry<K, Collection<V>>>() {
-                @Override
-                public boolean apply(Map.Entry<K, Collection<V>> entry) {
-                  return predicate.apply(
-                      Multisets.immutableEntry(entry.getKey(), entry.getValue().size()));
-                }
-              });
+              (Map.Entry<K, Collection<V>> entry) ->
+                  predicate.apply(
+                      Multisets.immutableEntry(entry.getKey(), entry.getValue().size())));
         }
 
         @Override
diff --git a/guava/src/com/google/common/collect/GeneralRange.java b/guava/src/com/google/common/collect/GeneralRange.java
index 20cf4fb..3d7256f 100644
--- a/guava/src/com/google/common/collect/GeneralRange.java
+++ b/guava/src/com/google/common/collect/GeneralRange.java
@@ -46,7 +46,7 @@
 
     T upperEndpoint = range.hasUpperBound() ? range.upperEndpoint() : null;
     BoundType upperBoundType = range.hasUpperBound() ? range.upperBoundType() : OPEN;
-    return new GeneralRange<T>(
+    return new GeneralRange<>(
         Ordering.natural(),
         range.hasLowerBound(),
         lowerEndpoint,
@@ -58,7 +58,7 @@
 
   /** Returns the whole range relative to the specified comparator. */
   static <T extends @Nullable Object> GeneralRange<T> all(Comparator<? super T> comparator) {
-    return new GeneralRange<T>(comparator, false, null, OPEN, false, null, OPEN);
+    return new GeneralRange<>(comparator, false, null, OPEN, false, null, OPEN);
   }
 
   /**
@@ -67,7 +67,7 @@
    */
   static <T extends @Nullable Object> GeneralRange<T> downTo(
       Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
-    return new GeneralRange<T>(comparator, true, endpoint, boundType, false, null, OPEN);
+    return new GeneralRange<>(comparator, true, endpoint, boundType, false, null, OPEN);
   }
 
   /**
@@ -76,7 +76,7 @@
    */
   static <T extends @Nullable Object> GeneralRange<T> upTo(
       Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
-    return new GeneralRange<T>(comparator, false, null, OPEN, true, endpoint, boundType);
+    return new GeneralRange<>(comparator, false, null, OPEN, true, endpoint, boundType);
   }
 
   /**
@@ -89,7 +89,7 @@
       BoundType lowerType,
       @ParametricNullness T upper,
       BoundType upperType) {
-    return new GeneralRange<T>(comparator, true, lower, lowerType, true, upper, upperType);
+    return new GeneralRange<>(comparator, true, lower, lowerType, true, upper, upperType);
   }
 
   private final Comparator<? super T> comparator;
@@ -138,7 +138,7 @@
       checkArgument(
           cmp <= 0, "lowerEndpoint (%s) > upperEndpoint (%s)", lowerEndpoint, upperEndpoint);
       if (cmp == 0) {
-        checkArgument(lowerBoundType != OPEN | upperBoundType != OPEN);
+        checkArgument(lowerBoundType != OPEN || upperBoundType != OPEN);
       }
     }
   }
@@ -233,7 +233,7 @@
       }
     }
 
-    return new GeneralRange<T>(comparator, hasLowBound, lowEnd, lowType, hasUpBound, upEnd, upType);
+    return new GeneralRange<>(comparator, hasLowBound, lowEnd, lowType, hasUpBound, upEnd, upType);
   }
 
   @Override
@@ -268,7 +268,7 @@
     GeneralRange<T> result = reverse;
     if (result == null) {
       result =
-          new GeneralRange<T>(
+          new GeneralRange<>(
               Ordering.from(comparator).reverse(),
               hasUpperBound,
               getUpperEndpoint(),
diff --git a/guava/src/com/google/common/collect/HashBasedTable.java b/guava/src/com/google/common/collect/HashBasedTable.java
index c8ba50f..21882e6 100644
--- a/guava/src/com/google/common/collect/HashBasedTable.java
+++ b/guava/src/com/google/common/collect/HashBasedTable.java
@@ -41,7 +41,7 @@
  * concurrently and one of the threads modifies the table, it must be synchronized externally.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @since 7.0
diff --git a/guava/src/com/google/common/collect/HashBiMap.java b/guava/src/com/google/common/collect/HashBiMap.java
index b6e2042..b0a5dd5 100644
--- a/guava/src/com/google/common/collect/HashBiMap.java
+++ b/guava/src/com/google/common/collect/HashBiMap.java
@@ -50,7 +50,7 @@
  * <p>This implementation guarantees insertion-based iteration order of its keys.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap} </a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap} </a>.
  *
  * @author Louis Wasserman
  * @author Mike Bostock
@@ -489,6 +489,7 @@
     public Iterator<K> iterator() {
       return new Itr<K>() {
         @Override
+        @ParametricNullness
         K output(BiEntry<K, V> entry) {
           return entry.key;
         }
@@ -530,17 +531,20 @@
         }
 
         @Override
+        @ParametricNullness
         public K getKey() {
           return delegate.key;
         }
 
         @Override
+        @ParametricNullness
         public V getValue() {
           return delegate.value;
         }
 
         @Override
-        public V setValue(V value) {
+        @ParametricNullness
+        public V setValue(@ParametricNullness V value) {
           V oldValue = delegate.value;
           int valueHash = smearedHash(value);
           if (valueHash == delegate.valueHash && Objects.equal(value, oldValue)) {
@@ -675,6 +679,7 @@
       public Iterator<V> iterator() {
         return new Itr<V>() {
           @Override
+          @ParametricNullness
           V output(BiEntry<K, V> entry) {
             return entry.value;
           }
@@ -703,17 +708,20 @@
           }
 
           @Override
+          @ParametricNullness
           public V getKey() {
             return delegate.value;
           }
 
           @Override
+          @ParametricNullness
           public K getValue() {
             return delegate.key;
           }
 
           @Override
-          public K setValue(K key) {
+          @ParametricNullness
+          public K setValue(@ParametricNullness K key) {
             K oldKey = delegate.key;
             int keyHash = smearedHash(key);
             if (keyHash == delegate.keyHash && Objects.equal(key, oldKey)) {
diff --git a/guava/src/com/google/common/collect/ImmutableBiMap.java b/guava/src/com/google/common/collect/ImmutableBiMap.java
index 2f2e9ab..4c222c1 100644
--- a/guava/src/com/google/common/collect/ImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/ImmutableBiMap.java
@@ -480,6 +480,21 @@
       }
     }
 
+    /**
+     * Throws {@link UnsupportedOperationException}. This method is inherited from {@link
+     * ImmutableMap.Builder}, but it does not make sense for bimaps.
+     *
+     * @throws UnsupportedOperationException always
+     * @deprecated This method does not make sense for bimaps and should not be called.
+     * @since 31.1
+     */
+    @DoNotCall
+    @Deprecated
+    @Override
+    public ImmutableBiMap<K, V> buildKeepingLast() {
+      throw new UnsupportedOperationException("Not supported for bimaps");
+    }
+
     @Override
     @VisibleForTesting
     ImmutableBiMap<K, V> buildJdkBacked() {
diff --git a/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java b/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
index aeabe5d..c59e9fd 100644
--- a/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
+++ b/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
@@ -62,7 +62,7 @@
    */
   public static <B, T extends B> ImmutableClassToInstanceMap<B> of(Class<T> type, T value) {
     ImmutableMap<Class<? extends B>, B> map = ImmutableMap.<Class<? extends B>, B>of(type, value);
-    return new ImmutableClassToInstanceMap<B>(map);
+    return new ImmutableClassToInstanceMap<>(map);
   }
 
   /**
@@ -70,7 +70,7 @@
    * Builder} constructor.
    */
   public static <B> Builder<B> builder() {
-    return new Builder<B>();
+    return new Builder<>();
   }
 
   /**
@@ -131,11 +131,11 @@
      * @throws IllegalArgumentException if duplicate keys were added
      */
     public ImmutableClassToInstanceMap<B> build() {
-      ImmutableMap<Class<? extends B>, B> map = mapBuilder.build();
+      ImmutableMap<Class<? extends B>, B> map = mapBuilder.buildOrThrow();
       if (map.isEmpty()) {
         return of();
       } else {
-        return new ImmutableClassToInstanceMap<B>(map);
+        return new ImmutableClassToInstanceMap<>(map);
       }
     }
   }
diff --git a/guava/src/com/google/common/collect/ImmutableCollection.java b/guava/src/com/google/common/collect/ImmutableCollection.java
index 80fefb6..314f83c 100644
--- a/guava/src/com/google/common/collect/ImmutableCollection.java
+++ b/guava/src/com/google/common/collect/ImmutableCollection.java
@@ -156,7 +156,7 @@
  * <h3>See also</h3>
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @since 2.0
  */
diff --git a/guava/src/com/google/common/collect/ImmutableList.java b/guava/src/com/google/common/collect/ImmutableList.java
index 115c022..bc81665 100644
--- a/guava/src/com/google/common/collect/ImmutableList.java
+++ b/guava/src/com/google/common/collect/ImmutableList.java
@@ -53,7 +53,7 @@
  * {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @see ImmutableMap
  * @see ImmutableSet
diff --git a/guava/src/com/google/common/collect/ImmutableListMultimap.java b/guava/src/com/google/common/collect/ImmutableListMultimap.java
index f847016..0184c5b 100644
--- a/guava/src/com/google/common/collect/ImmutableListMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableListMultimap.java
@@ -43,7 +43,7 @@
  * detailed at {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @since 2.0
@@ -377,7 +377,7 @@
       }
     }
 
-    return new ImmutableListMultimap<>(builder.build(), size);
+    return new ImmutableListMultimap<>(builder.buildOrThrow(), size);
   }
 
   ImmutableListMultimap(ImmutableMap<K, ImmutableList<V>> map, int size) {
@@ -490,7 +490,7 @@
 
     ImmutableMap<Object, ImmutableList<Object>> tmpMap;
     try {
-      tmpMap = builder.build();
+      tmpMap = builder.buildOrThrow();
     } catch (IllegalArgumentException e) {
       throw (InvalidObjectException) new InvalidObjectException(e.getMessage()).initCause(e);
     }
diff --git a/guava/src/com/google/common/collect/ImmutableMap.java b/guava/src/com/google/common/collect/ImmutableMap.java
index 23335b2..b24ed6c 100644
--- a/guava/src/com/google/common/collect/ImmutableMap.java
+++ b/guava/src/com/google/common/collect/ImmutableMap.java
@@ -32,14 +32,16 @@
 import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
-import java.util.AbstractMap;
 import java.util.Arrays;
+import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.EnumMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 import java.util.SortedMap;
 import java.util.Spliterator;
 import java.util.Spliterators;
@@ -56,7 +58,7 @@
  * {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jesse Wilson
  * @author Kevin Bourrillion
@@ -334,8 +336,7 @@
    * UnsupportedOperationException}.
    */
   static <K, V> Entry<K, V> entryOf(K key, V value) {
-    checkEntryNotNull(key, value);
-    return new AbstractMap.SimpleImmutableEntry<>(key, value);
+    return new ImmutableMapEntry<>(key, value);
   }
 
   /**
@@ -365,7 +366,7 @@
   }
 
   static void checkNoConflict(
-      boolean safe, String conflictDescription, Entry<?, ?> entry1, Entry<?, ?> entry2) {
+      boolean safe, String conflictDescription, Object entry1, Object entry2) {
     if (!safe) {
       throw conflictException(conflictDescription, entry1, entry2);
     }
@@ -438,8 +439,9 @@
     }
 
     /**
-     * Associates {@code key} with {@code value} in the built map. Duplicate keys are not allowed,
-     * and will cause {@link #build} to fail.
+     * Associates {@code key} with {@code value} in the built map. If the same key is put more than
+     * once, {@link #buildOrThrow} will fail, while {@link #buildKeepingLast} will keep the last
+     * value put for that key.
      */
     @CanIgnoreReturnValue
     public Builder<K, V> put(K key, V value) {
@@ -451,8 +453,9 @@
     }
 
     /**
-     * Adds the given {@code entry} to the map, making it immutable if necessary. Duplicate keys are
-     * not allowed, and will cause {@link #build} to fail.
+     * Adds the given {@code entry} to the map, making it immutable if necessary. If the same key is
+     * put more than once, {@link #buildOrThrow} will fail, while {@link #buildKeepingLast} will
+     * keep the last value put for that key.
      *
      * @since 11.0
      */
@@ -462,8 +465,9 @@
     }
 
     /**
-     * Associates all of the given map's keys and values in the built map. Duplicate keys are not
-     * allowed, and will cause {@link #build} to fail.
+     * Associates all of the given map's keys and values in the built map. If the same key is put
+     * more than once, {@link #buildOrThrow} will fail, while {@link #buildKeepingLast} will keep
+     * the last value put for that key.
      *
      * @throws NullPointerException if any key or value in {@code map} is null
      */
@@ -473,8 +477,9 @@
     }
 
     /**
-     * Adds all of the given entries to the built map. Duplicate keys are not allowed, and will
-     * cause {@link #build} to fail.
+     * Adds all of the given entries to the built map. If the same key is put more than once, {@link
+     * #buildOrThrow} will fail, while {@link #buildKeepingLast} will keep the last value put for
+     * that key.
      *
      * @throws NullPointerException if any key, value, or entry is null
      * @since 19.0
@@ -518,10 +523,55 @@
       return this;
     }
 
-    /*
-     * TODO(kevinb): Should build() and the ImmutableBiMap & ImmutableSortedMap
-     * versions throw an IllegalStateException instead?
-     */
+    private ImmutableMap<K, V> build(boolean throwIfDuplicateKeys) {
+      /*
+       * If entries is full, or if hash flooding is detected, then this implementation may end up
+       * using the entries array directly and writing over the entry objects with non-terminal
+       * entries, but this is safe; if this Builder is used further, it will grow the entries array
+       * (so it can't affect the original array), and future build() calls will always copy any
+       * entry objects that cannot be safely reused.
+       */
+      switch (size) {
+        case 0:
+          return of();
+        case 1:
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> onlyEntry = requireNonNull(entries[0]);
+          return of(onlyEntry.getKey(), onlyEntry.getValue());
+        default:
+          break;
+      }
+      // localEntries is an alias for the entries field, except if we end up removing duplicates in
+      // a copy of the entries array. Likewise, localSize is the same as size except in that case.
+      // It's possible to keep using this Builder after calling buildKeepingLast(), so we need to
+      // ensure that its state is not corrupted by removing duplicates that should cause a later
+      // buildOrThrow() to fail, or by changing the size.
+      @Nullable Entry<K, V>[] localEntries;
+      int localSize = size;
+      if (valueComparator == null) {
+        localEntries = entries;
+      } else {
+        if (entriesUsed) {
+          entries = Arrays.copyOf(entries, size);
+        }
+        localEntries = entries;
+        if (!throwIfDuplicateKeys) {
+          // We want to retain only the last-put value for any given key, before sorting.
+          // This could be improved, but orderEntriesByValue is rather rarely used anyway.
+          @SuppressWarnings("nullness") // entries 0..size-1 are non-null
+          Entry<K, V>[] nonNullEntries = (Entry<K, V>[]) localEntries;
+          localEntries = lastEntryForEachKey(nonNullEntries, size);
+          localSize = localEntries.length;
+        }
+        Arrays.sort(
+            localEntries,
+            0,
+            localSize,
+            Ordering.from(valueComparator).onResultOf(Maps.<V>valueFunction()));
+      }
+      entriesUsed = true;
+      return RegularImmutableMap.fromEntryArray(localSize, localEntries, throwIfDuplicateKeys);
+    }
 
     /**
      * Returns a newly-created immutable map. The iteration order of the returned map is the order
@@ -548,31 +598,26 @@
      * @since 31.0
      */
     public ImmutableMap<K, V> buildOrThrow() {
-      /*
-       * If entries is full, or if hash flooding is detected, then this implementation may end up
-       * using the entries array directly and writing over the entry objects with non-terminal
-       * entries, but this is safe; if this Builder is used further, it will grow the entries array
-       * (so it can't affect the original array), and future build() calls will always copy any
-       * entry objects that cannot be safely reused.
-       */
-      if (valueComparator != null) {
-        if (entriesUsed) {
-          entries = Arrays.copyOf(entries, size);
-        }
-        Arrays.sort(
-            entries, 0, size, Ordering.from(valueComparator).onResultOf(Maps.<V>valueFunction()));
-      }
-      switch (size) {
-        case 0:
-          return of();
-        case 1:
-          // requireNonNull is safe because the first `size` elements have been filled in.
-          Entry<K, V> onlyEntry = requireNonNull(entries[0]);
-          return of(onlyEntry.getKey(), onlyEntry.getValue());
-        default:
-          entriesUsed = true;
-          return RegularImmutableMap.fromEntryArray(size, entries);
-      }
+      return build(true);
+    }
+
+    /**
+     * Returns a newly-created immutable map, using the last value for any key that was added more
+     * than once. The iteration order of the returned map is the order in which entries were
+     * inserted into the builder, unless {@link #orderEntriesByValue} was called, in which case
+     * entries are sorted by value. If a key was added more than once, it appears in iteration order
+     * based on the first time it was added, again unless {@link #orderEntriesByValue} was called.
+     *
+     * <p>In the current implementation, all values associated with a given key are stored in the
+     * {@code Builder} object, even though only one of them will be used in the built map. If there
+     * can be many repeated keys, it may be more space-efficient to use a {@link
+     * java.util.LinkedHashMap LinkedHashMap} and {@link ImmutableMap#copyOf(Map)} rather than
+     * {@code ImmutableMap.Builder}.
+     *
+     * @since 31.1
+     */
+    public ImmutableMap<K, V> buildKeepingLast() {
+      return build(false);
     }
 
     @VisibleForTesting // only for testing JDK backed implementation
@@ -588,9 +633,30 @@
           return of(onlyEntry.getKey(), onlyEntry.getValue());
         default:
           entriesUsed = true;
-          return JdkBackedImmutableMap.create(size, entries);
+          return JdkBackedImmutableMap.create(size, entries, /* throwIfDuplicateKeys= */ true);
       }
     }
+
+    private static <K, V> Entry<K, V>[] lastEntryForEachKey(Entry<K, V>[] entries, int size) {
+      Set<K> seen = new HashSet<>();
+      BitSet dups = new BitSet(); // slots that are overridden by a later duplicate key
+      for (int i = size - 1; i >= 0; i--) {
+        if (!seen.add(entries[i].getKey())) {
+          dups.set(i);
+        }
+      }
+      if (dups.isEmpty()) {
+        return entries;
+      }
+      @SuppressWarnings({"rawtypes", "unchecked"})
+      Entry<K, V>[] newEntries = new Entry[size - dups.cardinality()];
+      for (int inI = 0, outI = 0; inI < size; inI++) {
+        if (!dups.get(inI)) {
+          newEntries[outI++] = entries[inI];
+        }
+      }
+      return newEntries;
+    }
   }
 
   /**
@@ -905,6 +971,31 @@
   @Override
   @CheckForNull
   public final V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
+    /*
+     * Even though it's weird to pass a defaultValue that is null, some callers do so. Those who
+     * pass a literal "null" should probably just use `get`, but I would expect other callers to
+     * pass an expression that *might* be null. This could happen with:
+     *
+     * - a `getFooOrDefault(@CheckForNull Foo defaultValue)` method that returns
+     *   `map.getOrDefault(FOO_KEY, defaultValue)`
+     *
+     * - a call that consults a chain of maps, as in `mapA.getOrDefault(key, mapB.getOrDefault(key,
+     *   ...))`
+     *
+     * So it makes sense for the parameter (and thus the return type) to be @CheckForNull.
+     *
+     * Two other points:
+     *
+     * 1. We'll want to use something like @PolyNull once we can make that work for the various
+     * platforms we target.
+     *
+     * 2. Kotlin's Map type has a getOrDefault method that accepts and returns a "plain V," in
+     * contrast to the "V?" type that we're using. As a result, Kotlin sees a conflict between the
+     * nullness annotations in ImmutableMap and those in its own Map type. In response, it considers
+     * the parameter and return type both to be platform types. As a result, Kotlin permits calls
+     * that can lead to NullPointerException. That's unfortunate. But hopefully most Kotlin callers
+     * use `get(key) ?: defaultValue` instead of this method, anyway.
+     */
     V result = get(key);
     // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
     if (result != null) {
@@ -1148,7 +1239,7 @@
         builder.put(keyIter.next(), valueIter.next());
       }
 
-      return builder.build();
+      return builder.buildOrThrow();
     }
 
     @SuppressWarnings("unchecked")
@@ -1161,7 +1252,7 @@
       for (int i = 0; i < keys.length; i++) {
         builder.put(keys[i], values[i]);
       }
-      return builder.build();
+      return builder.buildOrThrow();
     }
 
     /**
diff --git a/guava/src/com/google/common/collect/ImmutableMultimap.java b/guava/src/com/google/common/collect/ImmutableMultimap.java
index 5dfbb9b..d16e1bc 100644
--- a/guava/src/com/google/common/collect/ImmutableMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableMultimap.java
@@ -64,7 +64,7 @@
  * immediately after the last entry having that key.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/ImmutableMultiset.java b/guava/src/com/google/common/collect/ImmutableMultiset.java
index f397a49..b05ab3f 100644
--- a/guava/src/com/google/common/collect/ImmutableMultiset.java
+++ b/guava/src/com/google/common/collect/ImmutableMultiset.java
@@ -47,7 +47,7 @@
  * element when the multiset was created.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -325,7 +325,7 @@
 
   @GwtIncompatible // not present in emulated superclass
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     for (Multiset.Entry<E> entry : entrySet()) {
       Arrays.fill(dst, offset, offset + entry.getCount(), entry.getElement());
       offset += entry.getCount();
diff --git a/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/guava/src/com/google/common/collect/ImmutableSetMultimap.java
index 007c16b..52d6e55 100644
--- a/guava/src/com/google/common/collect/ImmutableSetMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableSetMultimap.java
@@ -51,7 +51,7 @@
  * Undefined behavior and bugs will result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Mike Ward
  * @since 2.0
@@ -428,7 +428,7 @@
       }
     }
 
-    return new ImmutableSetMultimap<>(builder.build(), size, valueComparator);
+    return new ImmutableSetMultimap<>(builder.buildOrThrow(), size, valueComparator);
   }
 
   /**
@@ -634,7 +634,7 @@
 
     ImmutableMap<Object, ImmutableSet<Object>> tmpMap;
     try {
-      tmpMap = builder.build();
+      tmpMap = builder.buildOrThrow();
     } catch (IllegalArgumentException e) {
       throw (InvalidObjectException) new InvalidObjectException(e.getMessage()).initCause(e);
     }
diff --git a/guava/src/com/google/common/collect/ImmutableSortedMap.java b/guava/src/com/google/common/collect/ImmutableSortedMap.java
index c4b59c8..ab97193 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedMap.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedMap.java
@@ -54,7 +54,7 @@
  * not correctly obey its specification.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -743,6 +743,24 @@
           return fromEntries(comparator, false, entries, size);
       }
     }
+
+    /**
+     * Throws UnsupportedOperationException. A future version may support this operation. Then the
+     * value for any given key will be the one that was last supplied in a {@code put} operation for
+     * that key.
+     *
+     * @throws UnsupportedOperationException always
+     * @since 31.1
+     * @deprecated This method is not currently implemented, and may never be.
+     */
+    @DoNotCall
+    @Deprecated
+    @Override
+    public final ImmutableSortedMap<K, V> buildKeepingLast() {
+      // TODO(emcmanus): implement
+      throw new UnsupportedOperationException(
+          "ImmutableSortedMap.Builder does not yet implement buildKeepingLast()");
+    }
   }
 
   private final transient RegularImmutableSortedSet<K> keySet;
diff --git a/guava/src/com/google/common/collect/ImmutableSortedMultiset.java b/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
index bf5a2f4..0638df0 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
@@ -45,7 +45,7 @@
  * collection will not correctly obey its specification.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Louis Wasserman
  * @since 12.0
diff --git a/guava/src/com/google/common/collect/ImmutableSortedSet.java b/guava/src/com/google/common/collect/ImmutableSortedSet.java
index 8a7aec1..20d0072 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedSet.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedSet.java
@@ -53,7 +53,7 @@
  * collection will not correctly obey its specification.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
diff --git a/guava/src/com/google/common/collect/ImmutableTable.java b/guava/src/com/google/common/collect/ImmutableTable.java
index 6d15938..033c271 100644
--- a/guava/src/com/google/common/collect/ImmutableTable.java
+++ b/guava/src/com/google/common/collect/ImmutableTable.java
@@ -40,7 +40,7 @@
  * at {@link ImmutableCollection}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
+ * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained">immutable collections</a>.
  *
  * @author Gregory Kick
  * @since 11.0
diff --git a/guava/src/com/google/common/collect/Interners.java b/guava/src/com/google/common/collect/Interners.java
index a3ae374..10ae274 100644
--- a/guava/src/com/google/common/collect/Interners.java
+++ b/guava/src/com/google/common/collect/Interners.java
@@ -81,7 +81,7 @@
       if (!strong) {
         mapMaker.weakKeys();
       }
-      return new InternerImpl<E>(mapMaker);
+      return new InternerImpl<>(mapMaker);
     }
   }
 
@@ -158,7 +158,7 @@
    * @since 8.0
    */
   public static <E> Function<E, E> asFunction(Interner<E> interner) {
-    return new InternerFunction<E>(checkNotNull(interner));
+    return new InternerFunction<>(checkNotNull(interner));
   }
 
   private static class InternerFunction<E> implements Function<E, E> {
diff --git a/guava/src/com/google/common/collect/Iterables.java b/guava/src/com/google/common/collect/Iterables.java
index fb2b543..7928b15 100644
--- a/guava/src/com/google/common/collect/Iterables.java
+++ b/guava/src/com/google/common/collect/Iterables.java
@@ -57,7 +57,7 @@
  * absolutely necessary.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables">{@code
  * Iterables}</a>.
  *
  * @author Kevin Bourrillion
@@ -516,6 +516,10 @@
    * <p>Iterators returned by the returned iterable do not support the {@link Iterator#remove()}
    * method. The returned lists implement {@link RandomAccess}, whether or not the input list does.
    *
+   * <p><b>Note:</b> The current implementation eagerly allocates storage for {@code size} elements.
+   * As a consequence, passing values like {@code Integer.MAX_VALUE} can lead to {@link
+   * OutOfMemoryError}.
+   *
    * <p><b>Note:</b> if {@code iterable} is a {@link List}, use {@link Lists#partition(List, int)}
    * instead.
    *
diff --git a/guava/src/com/google/common/collect/Iterators.java b/guava/src/com/google/common/collect/Iterators.java
index 5ea2da9..2f9fd3b 100644
--- a/guava/src/com/google/common/collect/Iterators.java
+++ b/guava/src/com/google/common/collect/Iterators.java
@@ -60,7 +60,7 @@
  * necessary.
  *
  * <p>See the Guava User Guide section on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#iterables">{@code
  * Iterators}</a>.
  *
  * @author Kevin Bourrillion
@@ -127,7 +127,7 @@
 
   /** Returns an unmodifiable view of {@code iterator}. */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> unmodifiableIterator(
-      final Iterator<? extends T> iterator) {
+      Iterator<? extends T> iterator) {
     checkNotNull(iterator);
     if (iterator instanceof UnmodifiableIterator) {
       @SuppressWarnings("unchecked") // Since it's unmodifiable, the covariant cast is safe
@@ -397,7 +397,7 @@
    * should use an explicit {@code break} or be certain that you will eventually remove all the
    * elements.
    */
-  public static <T extends @Nullable Object> Iterator<T> cycle(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterator<T> cycle(Iterable<T> iterable) {
     checkNotNull(iterable);
     return new Iterator<T>() {
       Iterator<T> iterator = emptyModifiableIterator();
@@ -462,8 +462,7 @@
    *
    * <p>This is mainly just to avoid the intermediate ArrayDeque in ConsumingQueueIterator.
    */
-  private static <I extends Iterator<?>> Iterator<I> consumingForArray(
-      final @Nullable I... elements) {
+  private static <I extends Iterator<?>> Iterator<I> consumingForArray(@Nullable I... elements) {
     return new UnmodifiableIterator<I>() {
       int index = 0;
 
@@ -566,7 +565,7 @@
    */
   public static <T extends @Nullable Object> Iterator<T> concat(
       Iterator<? extends Iterator<? extends T>> inputs) {
-    return new ConcatenatedIterator<T>(inputs);
+    return new ConcatenatedIterator<>(inputs);
   }
 
   /** Concats a varargs array of iterators without making a defensive copy of the array. */
@@ -586,6 +585,10 @@
    *
    * <p>The returned lists implement {@link java.util.RandomAccess}.
    *
+   * <p><b>Note:</b> The current implementation eagerly allocates storage for {@code size} elements.
+   * As a consequence, passing values like {@code Integer.MAX_VALUE} can lead to {@link
+   * OutOfMemoryError}.
+   *
    * @param iterator the iterator to return a partitioned view of
    * @param size the desired size of each partition (the last may be smaller)
    * @return an iterator of immutable lists containing the elements of {@code iterator} divided into
@@ -617,7 +620,7 @@
   }
 
   private static <T extends @Nullable Object> UnmodifiableIterator<List<@Nullable T>> partitionImpl(
-      final Iterator<T> iterator, final int size, final boolean pad) {
+      Iterator<T> iterator, int size, boolean pad) {
     checkNotNull(iterator);
     checkArgument(size > 0);
     return new UnmodifiableIterator<List<@Nullable T>>() {
@@ -658,7 +661,7 @@
    * {@code retainIfTrue}.
    */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> filter(
-      final Iterator<T> unfiltered, final Predicate<? super T> retainIfTrue) {
+      Iterator<T> unfiltered, Predicate<? super T> retainIfTrue) {
     checkNotNull(unfiltered);
     checkNotNull(retainIfTrue);
     return new AbstractIterator<T>() {
@@ -817,7 +820,7 @@
    * element.
    */
   public static <F extends @Nullable Object, T extends @Nullable Object> Iterator<T> transform(
-      final Iterator<F> fromIterator, final Function<? super F, ? extends T> function) {
+      Iterator<F> fromIterator, Function<? super F, ? extends T> function) {
     checkNotNull(function);
     return new TransformedIterator<F, T>(fromIterator) {
       @ParametricNullness
@@ -952,7 +955,7 @@
    * @since 3.0
    */
   public static <T extends @Nullable Object> Iterator<T> limit(
-      final Iterator<T> iterator, final int limitSize) {
+      Iterator<T> iterator, int limitSize) {
     checkNotNull(iterator);
     checkArgument(limitSize >= 0, "limit is negative");
     return new Iterator<T>() {
@@ -991,8 +994,7 @@
    * @return an iterator that removes and returns elements from the supplied iterator
    * @since 2.0
    */
-  public static <T extends @Nullable Object> Iterator<T> consumingIterator(
-      final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Iterator<T> consumingIterator(Iterator<T> iterator) {
     checkNotNull(iterator);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -1052,7 +1054,7 @@
    * {@link ImmutableList#copyOf(Object[])}}, or {@link ImmutableList#of}.
    */
   @SafeVarargs
-  public static <T extends @Nullable Object> UnmodifiableIterator<T> forArray(final T... array) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> forArray(T... array) {
     return forArray(array, 0, array.length, 0);
   }
 
@@ -1064,7 +1066,7 @@
    * Arrays.asList(array).subList(offset, offset + length).listIterator(index)}.
    */
   static <T extends @Nullable Object> UnmodifiableListIterator<T> forArray(
-      final T[] array, final int offset, int length, int index) {
+      T[] array, int offset, int length, int index) {
     checkArgument(length >= 0);
     int end = offset + length;
 
@@ -1074,7 +1076,7 @@
     if (length == 0) {
       return emptyListIterator();
     }
-    return new ArrayItr<T>(array, offset, length, index);
+    return new ArrayItr<>(array, offset, length, index);
   }
 
   private static final class ArrayItr<T extends @Nullable Object>
@@ -1103,7 +1105,7 @@
    * <p>The {@link Iterable} equivalent of this method is {@link Collections#singleton}.
    */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> singletonIterator(
-      @ParametricNullness final T value) {
+      @ParametricNullness T value) {
     return new UnmodifiableIterator<T>() {
       boolean done;
 
@@ -1135,7 +1137,7 @@
    * return an {@code UnmodifiableIterator} instead of a plain {@code Iterator}.
    */
   public static <T extends @Nullable Object> UnmodifiableIterator<T> forEnumeration(
-      final Enumeration<T> enumeration) {
+      Enumeration<T> enumeration) {
     checkNotNull(enumeration);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -1157,8 +1159,7 @@
    * <p>The {@code Iterable} equivalent of this method is either {@link Collections#enumeration} (if
    * you have a {@link Collection}), or {@code Iterators.asEnumeration(collection.iterator())}.
    */
-  public static <T extends @Nullable Object> Enumeration<T> asEnumeration(
-      final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Enumeration<T> asEnumeration(Iterator<T> iterator) {
     checkNotNull(iterator);
     return new Enumeration<T>() {
       @Override
@@ -1266,7 +1267,7 @@
       PeekingImpl<T> peeking = (PeekingImpl<T>) iterator;
       return peeking;
     }
-    return new PeekingImpl<T>(iterator);
+    return new PeekingImpl<>(iterator);
   }
 
   /**
@@ -1299,7 +1300,7 @@
     checkNotNull(iterators, "iterators");
     checkNotNull(comparator, "comparator");
 
-    return new MergingIterator<T>(iterators, comparator);
+    return new MergingIterator<>(iterators, comparator);
   }
 
   /**
@@ -1315,17 +1316,12 @@
     final Queue<PeekingIterator<T>> queue;
 
     public MergingIterator(
-        Iterable<? extends Iterator<? extends T>> iterators,
-        final Comparator<? super T> itemComparator) {
+        Iterable<? extends Iterator<? extends T>> iterators, Comparator<? super T> itemComparator) {
       // A comparator that's used by the heap, allowing the heap
       // to be sorted based on the top of each iterator.
       Comparator<PeekingIterator<T>> heapComparator =
-          new Comparator<PeekingIterator<T>>() {
-            @Override
-            public int compare(PeekingIterator<T> o1, PeekingIterator<T> o2) {
-              return itemComparator.compare(o1.peek(), o2.peek());
-            }
-          };
+          (PeekingIterator<T> o1, PeekingIterator<T> o2) ->
+              itemComparator.compare(o1.peek(), o2.peek());
 
       queue = new PriorityQueue<>(2, heapComparator);
 
diff --git a/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java b/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java
index 09f3135..f126fde 100644
--- a/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java
@@ -78,7 +78,7 @@
     if (result == null) {
       inverse =
           result =
-              new JdkBackedImmutableBiMap<V, K>(
+              new JdkBackedImmutableBiMap<>(
                   new InverseEntries(), backwardDelegate, forwardDelegate);
       result.inverse = this;
     }
@@ -112,12 +112,12 @@
 
   @Override
   ImmutableSet<Entry<K, V>> createEntrySet() {
-    return new ImmutableMapEntrySet.RegularEntrySet<K, V>(this, entries);
+    return new ImmutableMapEntrySet.RegularEntrySet<>(this, entries);
   }
 
   @Override
   ImmutableSet<K> createKeySet() {
-    return new ImmutableMapKeySet<K, V>(this);
+    return new ImmutableMapKeySet<>(this);
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/JdkBackedImmutableMap.java b/guava/src/com/google/common/collect/JdkBackedImmutableMap.java
index 5b323b9..222c4de 100644
--- a/guava/src/com/google/common/collect/JdkBackedImmutableMap.java
+++ b/guava/src/com/google/common/collect/JdkBackedImmutableMap.java
@@ -21,6 +21,7 @@
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.function.BiConsumer;
 import javax.annotation.CheckForNull;
@@ -38,16 +39,50 @@
    * detected. This implementation may replace the entries in entryArray with its own entry objects
    * (though they will have the same key/value contents), and will take ownership of entryArray.
    */
-  static <K, V> ImmutableMap<K, V> create(int n, @Nullable Entry<K, V>[] entryArray) {
+  static <K, V> ImmutableMap<K, V> create(
+      int n, @Nullable Entry<K, V>[] entryArray, boolean throwIfDuplicateKeys) {
     Map<K, V> delegateMap = Maps.newHashMapWithExpectedSize(n);
+    // If duplicates are allowed, this map will track the last value for each duplicated key.
+    // A second pass will retain only the first entry for that key, but with this last value. The
+    // value will then be replaced by null, signaling that later entries with the same key should
+    // be deleted.
+    Map<K, @Nullable V> duplicates = null;
+    int dupCount = 0;
     for (int i = 0; i < n; i++) {
       // requireNonNull is safe because the first `n` elements have been filled in.
       entryArray[i] = makeImmutable(requireNonNull(entryArray[i]));
-      V oldValue = delegateMap.putIfAbsent(entryArray[i].getKey(), entryArray[i].getValue());
+      K key = entryArray[i].getKey();
+      V value = entryArray[i].getValue();
+      V oldValue = delegateMap.put(key, value);
       if (oldValue != null) {
-        throw conflictException("key", entryArray[i], entryArray[i].getKey() + "=" + oldValue);
+        if (throwIfDuplicateKeys) {
+          throw conflictException("key", entryArray[i], entryArray[i].getKey() + "=" + oldValue);
+        }
+        if (duplicates == null) {
+          duplicates = new HashMap<>();
+        }
+        duplicates.put(key, value);
+        dupCount++;
       }
     }
+    if (duplicates != null) {
+      @SuppressWarnings({"rawtypes", "unchecked"})
+      Entry<K, V>[] newEntryArray = new Entry[n - dupCount];
+      for (int inI = 0, outI = 0; inI < n; inI++) {
+        Entry<K, V> entry = requireNonNull(entryArray[inI]);
+        K key = entry.getKey();
+        if (duplicates.containsKey(key)) {
+          V value = duplicates.get(key);
+          if (value == null) {
+            continue; // delete this duplicate
+          }
+          entry = new ImmutableMapEntry<>(key, value);
+          duplicates.put(key, null);
+        }
+        newEntryArray[outI++] = entry;
+      }
+      entryArray = newEntryArray;
+    }
     return new JdkBackedImmutableMap<>(delegateMap, ImmutableList.asImmutableList(entryArray, n));
   }
 
@@ -72,7 +107,7 @@
 
   @Override
   ImmutableSet<Entry<K, V>> createEntrySet() {
-    return new ImmutableMapEntrySet.RegularEntrySet<K, V>(this, entries);
+    return new ImmutableMapEntrySet.RegularEntrySet<>(this, entries);
   }
 
   @Override
@@ -83,12 +118,12 @@
 
   @Override
   ImmutableSet<K> createKeySet() {
-    return new ImmutableMapKeySet<K, V>(this);
+    return new ImmutableMapKeySet<>(this);
   }
 
   @Override
   ImmutableCollection<V> createValues() {
-    return new ImmutableMapValues<K, V>(this);
+    return new ImmutableMapValues<>(this);
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java b/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java
index 7bdd9e8..faf22b3 100644
--- a/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java
+++ b/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java
@@ -71,7 +71,7 @@
   @Override
   public ImmutableSet<E> elementSet() {
     ImmutableSet<E> result = elementSet;
-    return (result == null) ? elementSet = new ElementSet<E>(entries, this) : result;
+    return (result == null) ? elementSet = new ElementSet<>(entries, this) : result;
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/LinkedHashMultimap.java b/guava/src/com/google/common/collect/LinkedHashMultimap.java
index b4d2ab9..8076cf8 100644
--- a/guava/src/com/google/common/collect/LinkedHashMultimap.java
+++ b/guava/src/com/google/common/collect/LinkedHashMultimap.java
@@ -76,8 +76,7 @@
  * result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
diff --git a/guava/src/com/google/common/collect/LinkedHashMultiset.java b/guava/src/com/google/common/collect/LinkedHashMultiset.java
index 13f70a7..5ee2015 100644
--- a/guava/src/com/google/common/collect/LinkedHashMultiset.java
+++ b/guava/src/com/google/common/collect/LinkedHashMultiset.java
@@ -32,8 +32,7 @@
  * element will appear at the end of the iteration.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Kevin Bourrillion
  * @author Jared Levy
diff --git a/guava/src/com/google/common/collect/LinkedListMultimap.java b/guava/src/com/google/common/collect/LinkedListMultimap.java
index a557870..a692434 100644
--- a/guava/src/com/google/common/collect/LinkedListMultimap.java
+++ b/guava/src/com/google/common/collect/LinkedListMultimap.java
@@ -90,8 +90,7 @@
  * with a call to {@link Multimaps#synchronizedListMultimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Mike Bostock
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/ListMultimap.java b/guava/src/com/google/common/collect/ListMultimap.java
index 1686068..29e5807 100644
--- a/guava/src/com/google/common/collect/ListMultimap.java
+++ b/guava/src/com/google/common/collect/ListMultimap.java
@@ -34,8 +34,7 @@
  * {@link #asMap} has {@code List} values.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/Lists.java b/guava/src/com/google/common/collect/Lists.java
index 31d6e2a..55dc73e 100644
--- a/guava/src/com/google/common/collect/Lists.java
+++ b/guava/src/com/google/common/collect/Lists.java
@@ -57,7 +57,7 @@
  * {@link Sets}, {@link Maps} and {@link Queues}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#lists"> {@code Lists}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#lists">{@code Lists}</a>.
  *
  * @author Kevin Bourrillion
  * @author Mike Bostock
@@ -76,9 +76,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableList#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code ArrayList} {@linkplain ArrayList#ArrayList() constructor}
-   * directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code ArrayList} {@linkplain ArrayList#ArrayList() constructor} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> ArrayList<E> newArrayList() {
@@ -118,10 +118,9 @@
    * ImmutableList#copyOf(Iterable)} instead. (Or, change {@code elements} to be a {@link
    * FluentIterable} and call {@code elements.toList()}.)
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Use the {@code ArrayList} {@linkplain ArrayList#ArrayList(Collection)
-   * constructor} directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond"
-   * syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method. Use
+   * the {@code ArrayList} {@linkplain ArrayList#ArrayList(Collection) constructor} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> ArrayList<E> newArrayList(
@@ -160,11 +159,11 @@
    * Creates an {@code ArrayList} instance backed by an array with the specified initial size;
    * simply delegates to {@link ArrayList#ArrayList(int)}.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use {@code new }{@link ArrayList#ArrayList(int) ArrayList}{@code <>(int)}
-   * directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
-   * (Unlike here, there is no risk of overload ambiguity, since the {@code ArrayList} constructors
-   * very wisely did not accept varargs.)
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use {@code new }{@link ArrayList#ArrayList(int) ArrayList}{@code <>(int)} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>. (Unlike here, there is no risk
+   * of overload ambiguity, since the {@code ArrayList} constructors very wisely did not accept
+   * varargs.)
    *
    * @param initialArraySize the exact size of the initial backing array for the returned array list
    *     ({@code ArrayList} documentation calls this value the "capacity")
@@ -210,10 +209,9 @@
    * outperform {@code LinkedList} except in certain rare and specific situations. Unless you have
    * spent a lot of time benchmarking your specific needs, use one of those instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedList} {@linkplain LinkedList#LinkedList()
-   * constructor} directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond"
-   * syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedList} {@linkplain LinkedList#LinkedList() constructor} directly, taking
+   * advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> LinkedList<E> newLinkedList() {
@@ -232,10 +230,9 @@
    * outperform {@code LinkedList} except in certain rare and specific situations. Unless you have
    * spent a lot of time benchmarking your specific needs, use one of those instead.
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Use the {@code LinkedList} {@linkplain LinkedList#LinkedList(Collection)
-   * constructor} directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond"
-   * syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method. Use
+   * the {@code LinkedList} {@linkplain LinkedList#LinkedList(Collection) constructor} directly,
+   * taking advantage of <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
   public static <E extends @Nullable Object> LinkedList<E> newLinkedList(
diff --git a/guava/src/com/google/common/collect/Maps.java b/guava/src/com/google/common/collect/Maps.java
index c892557..6265f5d 100644
--- a/guava/src/com/google/common/collect/Maps.java
+++ b/guava/src/com/google/common/collect/Maps.java
@@ -79,7 +79,7 @@
  * and {@link Queues}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#maps"> {@code Maps}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#maps">{@code Maps}</a>.
  *
  * @author Kevin Bourrillion
  * @author Mike Bostock
@@ -228,9 +228,9 @@
    *
    * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link #newEnumMap} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code HashMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code HashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code HashMap}
    */
@@ -246,9 +246,9 @@
    *
    * <p><b>Note:</b> if {@code K} is an {@link Enum} type, use {@link #newEnumMap} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code HashMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code HashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the mappings to be placed in the new map
    * @return a new {@code HashMap} initialized with the mappings from {@code map}
@@ -297,9 +297,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableMap#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedHashMap} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedHashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code LinkedHashMap}
    */
@@ -314,9 +314,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableMap#copyOf(Map)} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedHashMap} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedHashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the mappings to be placed in the new map
    * @return a new, {@code LinkedHashMap} initialized with the mappings from {@code map}
@@ -358,9 +358,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableSortedMap#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code TreeMap}
    */
@@ -375,9 +375,9 @@
    * <p><b>Note:</b> if mutability is not required, use {@link
    * ImmutableSortedMap#copyOfSorted(SortedMap)} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the sorted map whose mappings are to be placed in the new map and whose comparator
    *     is to be used to sort the new map
@@ -395,9 +395,9 @@
    * <p><b>Note:</b> if mutability is not required, use {@code
    * ImmutableSortedMap.orderedBy(comparator).build()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param comparator the comparator to sort the keys with
    * @return a new, empty {@code TreeMap}
@@ -426,9 +426,9 @@
   /**
    * Creates an {@code EnumMap} with the same mappings as the specified map.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code EnumMap} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code EnumMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @param map the map from which to initialize this {@code EnumMap}
    * @return a new {@code EnumMap} initialized with the mappings from {@code map}
@@ -443,9 +443,9 @@
   /**
    * Creates an {@code IdentityHashMap} instance.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code IdentityHashMap} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code IdentityHashMap} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code IdentityHashMap}
    */
@@ -575,7 +575,20 @@
     onlyOnRight.putAll(right); // will whittle it down
     SortedMap<K, V> onBoth = Maps.newTreeMap(comparator);
     SortedMap<K, MapDifference.ValueDifference<V>> differences = Maps.newTreeMap(comparator);
-    doDifference(left, right, Equivalence.equals(), onlyOnLeft, onlyOnRight, onBoth, differences);
+
+    /*
+     * V is a possibly nullable type, but we decided to declare Equivalence with a type parameter
+     * that is restricted to non-nullable types. Still, this code is safe: We made that decision
+     * about Equivalence not because Equivalence is null-hostile but because *every* Equivalence can
+     * handle null inputs -- and thus it would be meaningless for the type system to distinguish
+     * between "an Equivalence for nullable Foo" and "an Equivalence for non-nullable Foo."
+     *
+     * (And the unchecked cast is safe because Equivalence is contravariant.)
+     */
+    @SuppressWarnings({"nullness", "unchecked"})
+    Equivalence<V> equalsEquivalence = (Equivalence<V>) Equivalence.equals();
+
+    doDifference(left, right, equalsEquivalence, onlyOnLeft, onlyOnRight, onBoth, differences);
     return new SortedMapDifferenceImpl<>(onlyOnLeft, onlyOnRight, onBoth, differences);
   }
 
@@ -1296,13 +1309,13 @@
   public static <K, V> ImmutableMap<K, V> toMap(
       Iterator<K> keys, Function<? super K, V> valueFunction) {
     checkNotNull(valueFunction);
-    // Using LHM instead of a builder so as not to fail on duplicate keys
-    Map<K, V> builder = newLinkedHashMap();
+    ImmutableMap.Builder<K, V> builder = ImmutableMap.builder();
     while (keys.hasNext()) {
       K key = keys.next();
       builder.put(key, valueFunction.apply(key));
     }
-    return ImmutableMap.copyOf(builder);
+    // Using buildKeepingLast() so as not to fail on duplicate keys
+    return builder.buildKeepingLast();
   }
 
   /**
@@ -1379,7 +1392,7 @@
       builder.put(keyFunction.apply(value), value);
     }
     try {
-      return builder.build();
+      return builder.buildOrThrow();
     } catch (IllegalArgumentException duplicateKeys) {
       throw new IllegalArgumentException(
           duplicateKeys.getMessage()
@@ -1432,7 +1445,7 @@
       builder.put(key, requireNonNull(properties.getProperty(key)));
     }
 
-    return builder.build();
+    return builder.buildOrThrow();
   }
 
   /**
@@ -1705,6 +1718,57 @@
     }
 
     @Override
+    public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    @CheckForNull
+    public V putIfAbsent(K key, V value) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean remove(@Nullable Object key, @Nullable Object value) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean replace(K key, V oldValue, V newValue) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    @CheckForNull
+    public V replace(K key, V value) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V computeIfAbsent(
+        K key, java.util.function.Function<? super K, ? extends V> mappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V computeIfPresent(
+        K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V compute(
+        K key, BiFunction<? super K, ? super @Nullable V, ? extends V> remappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V merge(
+        K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
     public BiMap<V, K> inverse() {
       BiMap<V, K> result = inverse;
       return (result == null)
@@ -3558,6 +3622,57 @@
       throw new UnsupportedOperationException();
     }
 
+    @Override
+    public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    @CheckForNull
+    public V putIfAbsent(K key, V value) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean remove(@Nullable Object key, @Nullable Object value) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean replace(K key, V oldValue, V newValue) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    @CheckForNull
+    public V replace(K key, V value) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V computeIfAbsent(
+        K key, java.util.function.Function<? super K, ? extends V> mappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V computeIfPresent(
+        K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V compute(
+        K key, BiFunction<? super K, ? super @Nullable V, ? extends V> remappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public V merge(
+        K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+      throw new UnsupportedOperationException();
+    }
+
     @CheckForNull private transient UnmodifiableNavigableMap<K, V> descendingMap;
 
     @Override
@@ -4476,7 +4591,7 @@
     for (E e : list) {
       builder.put(e, i++);
     }
-    return builder.build();
+    return builder.buildOrThrow();
   }
 
   /**
diff --git a/guava/src/com/google/common/collect/MinMaxPriorityQueue.java b/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
index cd01279..181b3fb 100644
--- a/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
+++ b/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
@@ -131,7 +131,7 @@
    * instead.
    */
   public static <B> Builder<B> orderedBy(Comparator<B> comparator) {
-    return new Builder<B>(comparator);
+    return new Builder<>(comparator);
   }
 
   /**
@@ -216,7 +216,7 @@
      */
     public <T extends B> MinMaxPriorityQueue<T> create(Iterable<? extends T> initialContents) {
       MinMaxPriorityQueue<T> queue =
-          new MinMaxPriorityQueue<T>(
+          new MinMaxPriorityQueue<>(
               this, initialQueueSize(expectedSize, maximumSize, initialContents));
       for (T element : initialContents) {
         queue.offer(element);
@@ -436,11 +436,11 @@
       // Last element is moved to before index, swapped with trickled element.
       if (changes == null) {
         // The trickled element is still after index.
-        return new MoveDesc<E>(actualLastElement, toTrickle);
+        return new MoveDesc<>(actualLastElement, toTrickle);
       } else {
         // The trickled element is back before index, but the replaced element
         // has now been moved after index.
-        return new MoveDesc<E>(actualLastElement, changes.replaced);
+        return new MoveDesc<>(actualLastElement, changes.replaced);
       }
     }
     // Trickled element was after index to begin with, no adjustment needed.
@@ -560,7 +560,7 @@
       }
       // bubble it up the opposite heap
       if (otherHeap.bubbleUpAlternatingLevels(crossOver, toTrickle) < removeIndex) {
-        return new MoveDesc<E>(toTrickle, parent);
+        return new MoveDesc<>(toTrickle, parent);
       } else {
         return null;
       }
@@ -815,8 +815,8 @@
         if (moved != null) {
           // Either both are null or neither is, but we check both to satisfy the nullness checker.
           if (forgetMeNot == null || skipMe == null) {
-            forgetMeNot = new ArrayDeque<E>();
-            skipMe = new ArrayList<E>(3);
+            forgetMeNot = new ArrayDeque<>();
+            skipMe = new ArrayList<>(3);
           }
           if (!foundAndRemovedExactReference(skipMe, moved.toTrickle)) {
             forgetMeNot.add(moved.toTrickle);
diff --git a/guava/src/com/google/common/collect/Multimap.java b/guava/src/com/google/common/collect/Multimap.java
index e1a0a8e..0f83851 100644
--- a/guava/src/com/google/common/collect/Multimap.java
+++ b/guava/src/com/google/common/collect/Multimap.java
@@ -154,8 +154,7 @@
  * {@link UnsupportedOperationException}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/MultimapBuilder.java b/guava/src/com/google/common/collect/MultimapBuilder.java
index dddae28..3d6278a 100644
--- a/guava/src/com/google/common/collect/MultimapBuilder.java
+++ b/guava/src/com/google/common/collect/MultimapBuilder.java
@@ -84,7 +84,7 @@
    *
    * @throws IllegalArgumentException if {@code expectedKeys < 0}
    */
-  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys(int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
     return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
@@ -115,7 +115,7 @@
    * multimap, save that if all values associated with a key are removed and then the key is added
    * back into the multimap, that key will come last in the key iteration order.
    */
-  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys(int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
     return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
@@ -154,7 +154,7 @@
    * is not serializable.
    */
   public static <K0 extends @Nullable Object> MultimapBuilderWithKeys<K0> treeKeys(
-      final Comparator<K0> comparator) {
+      Comparator<K0> comparator) {
     checkNotNull(comparator);
     return new MultimapBuilderWithKeys<K0>() {
       @Override
@@ -169,8 +169,7 @@
    *
    * @since 16.0
    */
-  public static <K0 extends Enum<K0>> MultimapBuilderWithKeys<K0> enumKeys(
-      final Class<K0> keyClass) {
+  public static <K0 extends Enum<K0>> MultimapBuilderWithKeys<K0> enumKeys(Class<K0> keyClass) {
     checkNotNull(keyClass);
     return new MultimapBuilderWithKeys<K0>() {
       @SuppressWarnings("unchecked")
@@ -193,7 +192,7 @@
 
     @Override
     public List<V> get() {
-      return new ArrayList<V>(expectedValuesPerKey);
+      return new ArrayList<>(expectedValuesPerKey);
     }
   }
 
@@ -251,7 +250,7 @@
 
     @Override
     public SortedSet<V> get() {
-      return new TreeSet<V>(comparator);
+      return new TreeSet<>(comparator);
     }
   }
 
@@ -295,8 +294,7 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues(
-        final int expectedValuesPerKey) {
+    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues(int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
       return new ListMultimapBuilder<K0, @Nullable Object>() {
         @Override
@@ -330,7 +328,7 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues(final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues(int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
       return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
@@ -353,8 +351,7 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues(
-        final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues(int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
       return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
@@ -379,7 +376,7 @@
      * comparator} is not serializable.
      */
     public <V0 extends @Nullable Object> SortedSetMultimapBuilder<K0, V0> treeSetValues(
-        final Comparator<V0> comparator) {
+        Comparator<V0> comparator) {
       checkNotNull(comparator, "comparator");
       return new SortedSetMultimapBuilder<K0, V0>() {
         @Override
@@ -391,8 +388,7 @@
     }
 
     /** Uses an {@link EnumSet} to store value collections. */
-    public <V0 extends Enum<V0>> SetMultimapBuilder<K0, V0> enumSetValues(
-        final Class<V0> valueClass) {
+    public <V0 extends Enum<V0>> SetMultimapBuilder<K0, V0> enumSetValues(Class<V0> valueClass) {
       checkNotNull(valueClass, "valueClass");
       return new SetMultimapBuilder<K0, V0>() {
         @Override
diff --git a/guava/src/com/google/common/collect/Multimaps.java b/guava/src/com/google/common/collect/Multimaps.java
index 9bc9e98..22e457c 100644
--- a/guava/src/com/google/common/collect/Multimaps.java
+++ b/guava/src/com/google/common/collect/Multimaps.java
@@ -63,7 +63,7 @@
  * Provides static methods acting on or generating a {@code Multimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multimaps"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multimaps">{@code
  * Multimaps}</a>.
  *
  * @author Jared Levy
diff --git a/guava/src/com/google/common/collect/Multiset.java b/guava/src/com/google/common/collect/Multiset.java
index e7c7d62..ca56a74 100644
--- a/guava/src/com/google/common/collect/Multiset.java
+++ b/guava/src/com/google/common/collect/Multiset.java
@@ -80,8 +80,7 @@
  * {@code Multiset}, {@code AtomicLongMap} does not automatically remove zeros.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Kevin Bourrillion
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/Multisets.java b/guava/src/com/google/common/collect/Multisets.java
index e3203d2..71fe614 100644
--- a/guava/src/com/google/common/collect/Multisets.java
+++ b/guava/src/com/google/common/collect/Multisets.java
@@ -51,7 +51,7 @@
  * Provides static utility methods for creating and working with {@link Multiset} instances.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multisets"> {@code
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#multisets">{@code
  * Multisets}</a>.
  *
  * @author Kevin Bourrillion
diff --git a/guava/src/com/google/common/collect/NullnessCasts.java b/guava/src/com/google/common/collect/NullnessCasts.java
index 6ceeda7..4f894db 100644
--- a/guava/src/com/google/common/collect/NullnessCasts.java
+++ b/guava/src/com/google/common/collect/NullnessCasts.java
@@ -57,7 +57,7 @@
   }
 
   /** Returns {@code null} as any type, even one that does not include {@code null}. */
-  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals"})
+  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals", "ReturnMissingNullable"})
   // The warnings are legitimate. Each time we use this method, we document why.
   @ParametricNullness
   static <T extends @Nullable Object> T unsafeNull() {
diff --git a/guava/src/com/google/common/collect/ParametricNullness.java b/guava/src/com/google/common/collect/ParametricNullness.java
index b1cda48..94b1bcd 100644
--- a/guava/src/com/google/common/collect/ParametricNullness.java
+++ b/guava/src/com/google/common/collect/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/collect/PeekingIterator.java b/guava/src/com/google/common/collect/PeekingIterator.java
index a274fe4..8524ed7 100644
--- a/guava/src/com/google/common/collect/PeekingIterator.java
+++ b/guava/src/com/google/common/collect/PeekingIterator.java
@@ -27,7 +27,7 @@
  * An iterator that supports a one-element lookahead while iterating.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionHelpersExplained#peekingiterator"> {@code
+ * "https://github.com/google/guava/wiki/CollectionHelpersExplained#peekingiterator">{@code
  * PeekingIterator}</a>.
  *
  * @author Mick Killianey
diff --git a/guava/src/com/google/common/collect/Range.java b/guava/src/com/google/common/collect/Range.java
index ab5c077..2a5d464 100644
--- a/guava/src/com/google/common/collect/Range.java
+++ b/guava/src/com/google/common/collect/Range.java
@@ -16,6 +16,7 @@
 
 package com.google.common.collect;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
@@ -154,7 +155,7 @@
   }
 
   static <C extends Comparable<?>> Range<C> create(Cut<C> lowerBound, Cut<C> upperBound) {
-    return new Range<C>(lowerBound, upperBound);
+    return new Range<>(lowerBound, upperBound);
   }
 
   /**
@@ -556,6 +557,15 @@
     } else {
       Cut<C> newLower = (lowerCmp >= 0) ? lowerBound : connectedRange.lowerBound;
       Cut<C> newUpper = (upperCmp <= 0) ? upperBound : connectedRange.upperBound;
+
+      // create() would catch this, but give a confusing error message
+      checkArgument(
+          newLower.compareTo(newUpper) <= 0,
+          "intersection is undefined for disconnected ranges %s and %s",
+          this,
+          connectedRange);
+
+      // TODO(kevinb): all the precondition checks in the constructor are redundant...
       return create(newLower, newUpper);
     }
   }
diff --git a/guava/src/com/google/common/collect/RangeSet.java b/guava/src/com/google/common/collect/RangeSet.java
index 1fb7b10..79fbab1 100644
--- a/guava/src/com/google/common/collect/RangeSet.java
+++ b/guava/src/com/google/common/collect/RangeSet.java
@@ -43,7 +43,7 @@
  * <p>For a {@link Set} whose contents are specified by a {@link Range}, see {@link ContiguousSet}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#rangeset"> RangeSets</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#rangeset">RangeSets</a>.
  *
  * @author Kevin Bourrillion
  * @author Louis Wasserman
diff --git a/guava/src/com/google/common/collect/RegularContiguousSet.java b/guava/src/com/google/common/collect/RegularContiguousSet.java
index 913e2d7..787606e 100644
--- a/guava/src/com/google/common/collect/RegularContiguousSet.java
+++ b/guava/src/com/google/common/collect/RegularContiguousSet.java
@@ -58,7 +58,7 @@
       C fromElement, boolean fromInclusive, C toElement, boolean toInclusive) {
     if (fromElement.compareTo(toElement) == 0 && !fromInclusive && !toInclusive) {
       // Range would reject our attempt to create (x, x).
-      return new EmptyContiguousSet<C>(domain);
+      return new EmptyContiguousSet<>(domain);
     }
     return intersectionInCurrentDomain(
         Range.range(
@@ -231,14 +231,14 @@
     }
 
     private Object readResolve() {
-      return new RegularContiguousSet<C>(range, domain);
+      return new RegularContiguousSet<>(range, domain);
     }
   }
 
   @GwtIncompatible // serialization
   @Override
   Object writeReplace() {
-    return new SerializedForm<C>(range, domain);
+    return new SerializedForm<>(range, domain);
   }
 
   private static final long serialVersionUID = 0;
diff --git a/guava/src/com/google/common/collect/RegularImmutableBiMap.java b/guava/src/com/google/common/collect/RegularImmutableBiMap.java
index 60d22e2..b8bca95 100644
--- a/guava/src/com/google/common/collect/RegularImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/RegularImmutableBiMap.java
@@ -20,13 +20,14 @@
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.ImmutableMapEntry.createEntryArray;
+import static com.google.common.collect.RegularImmutableMap.MAX_HASH_BUCKET_LENGTH;
 import static com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMapEntry.NonTerminalImmutableBiMapEntry;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.common.collect.RegularImmutableMap.BucketOverflowException;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.Serializable;
@@ -88,11 +89,11 @@
       int valueBucket = Hashing.smear(valueHash) & mask;
 
       ImmutableMapEntry<K, V> nextInKeyBucket = keyTable[keyBucket];
-      int keyBucketLength = checkNoConflictInKeyBucket(key, entry, nextInKeyBucket);
       ImmutableMapEntry<K, V> nextInValueBucket = valueTable[valueBucket];
-      int valueBucketLength = checkNoConflictInValueBucket(value, entry, nextInValueBucket);
-      if (keyBucketLength > RegularImmutableMap.MAX_HASH_BUCKET_LENGTH
-          || valueBucketLength > RegularImmutableMap.MAX_HASH_BUCKET_LENGTH) {
+      try {
+        checkNoConflictInKeyBucket(key, value, nextInKeyBucket, /* throwIfDuplicateKeys= */ true);
+        checkNoConflictInValueBucket(value, entry, nextInValueBucket);
+      } catch (BucketOverflowException e) {
         return JdkBackedImmutableBiMap.create(n, entryArray);
       }
       ImmutableMapEntry<K, V> newEntry =
@@ -124,18 +125,20 @@
   // checkNoConflictInKeyBucket is static imported from RegularImmutableMap
 
   /**
-   * @return number of entries in this bucket
    * @throws IllegalArgumentException if another entry in the bucket has the same key
+   * @throws BucketOverflowException if this bucket has too many entries, which may indicate a hash
+   *     flooding attack
    */
-  @CanIgnoreReturnValue
-  private static int checkNoConflictInValueBucket(
-      Object value, Entry<?, ?> entry, @CheckForNull ImmutableMapEntry<?, ?> valueBucketHead) {
+  private static void checkNoConflictInValueBucket(
+      Object value, Entry<?, ?> entry, @CheckForNull ImmutableMapEntry<?, ?> valueBucketHead)
+      throws BucketOverflowException {
     int bucketSize = 0;
     for (; valueBucketHead != null; valueBucketHead = valueBucketHead.getNextInValueBucket()) {
       checkNoConflict(!value.equals(valueBucketHead.getValue()), "value", entry, valueBucketHead);
-      bucketSize++;
+      if (++bucketSize > MAX_HASH_BUCKET_LENGTH) {
+        throw new BucketOverflowException();
+      }
     }
-    return bucketSize;
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/RegularImmutableMap.java b/guava/src/com/google/common/collect/RegularImmutableMap.java
index 43425b2..f0f2031 100644
--- a/guava/src/com/google/common/collect/RegularImmutableMap.java
+++ b/guava/src/com/google/common/collect/RegularImmutableMap.java
@@ -28,6 +28,7 @@
 import com.google.common.collect.ImmutableMapEntry.NonTerminalImmutableMapEntry;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
+import java.util.IdentityHashMap;
 import java.util.function.BiConsumer;
 import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -73,7 +74,7 @@
   private final transient int mask;
 
   static <K, V> ImmutableMap<K, V> fromEntries(Entry<K, V>... entries) {
-    return fromEntryArray(entries.length, entries);
+    return fromEntryArray(entries.length, entries, /* throwIfDuplicateKeys= */ true);
   }
 
   /**
@@ -81,11 +82,26 @@
    * the entries in entryArray with its own entry objects (though they will have the same key/value
    * contents), and may take ownership of entryArray.
    */
-  static <K, V> ImmutableMap<K, V> fromEntryArray(int n, @Nullable Entry<K, V>[] entryArray) {
+  static <K, V> ImmutableMap<K, V> fromEntryArray(
+      int n, @Nullable Entry<K, V>[] entryArray, boolean throwIfDuplicateKeys) {
     checkPositionIndex(n, entryArray.length);
     if (n == 0) {
-      return (RegularImmutableMap<K, V>) EMPTY;
+      @SuppressWarnings("unchecked") // it has no entries so the type variables don't matter
+      ImmutableMap<K, V> empty = (ImmutableMap<K, V>) EMPTY;
+      return empty;
     }
+    try {
+      return fromEntryArrayCheckingBucketOverflow(n, entryArray, throwIfDuplicateKeys);
+    } catch (BucketOverflowException e) {
+      // probable hash flooding attack, fall back to j.u.HM based implementation and use its
+      // implementation of hash flooding protection
+      return JdkBackedImmutableMap.create(n, entryArray, throwIfDuplicateKeys);
+    }
+  }
+
+  private static <K, V> ImmutableMap<K, V> fromEntryArrayCheckingBucketOverflow(
+      int n, @Nullable Entry<K, V>[] entryArray, boolean throwIfDuplicateKeys)
+      throws BucketOverflowException {
     /*
      * The cast is safe: n==entryArray.length means that we have filled the whole array with Entry
      * instances, in which case it is safe to cast it from an array of nullable entries to an array
@@ -97,31 +113,90 @@
     int tableSize = Hashing.closedTableSize(n, MAX_LOAD_FACTOR);
     @Nullable ImmutableMapEntry<K, V>[] table = createEntryArray(tableSize);
     int mask = tableSize - 1;
-    for (int entryIndex = 0; entryIndex < n; entryIndex++) {
+    // If duplicates are allowed, this IdentityHashMap will record the final Entry for each
+    // duplicated key. We will use this final Entry to overwrite earlier slots in the entries array
+    // that have the same key. Then a second pass will remove all but the first of the slots that
+    // have this Entry. The value in the map becomes false when this first entry has been copied, so
+    // we know not to copy the remaining ones.
+    IdentityHashMap<Entry<K, V>, Boolean> duplicates = null;
+    int dupCount = 0;
+    for (int entryIndex = n - 1; entryIndex >= 0; entryIndex--) {
       // requireNonNull is safe because the first `n` elements have been filled in.
       Entry<K, V> entry = requireNonNull(entryArray[entryIndex]);
       K key = entry.getKey();
       V value = entry.getValue();
       checkEntryNotNull(key, value);
       int tableIndex = Hashing.smear(key.hashCode()) & mask;
-      ImmutableMapEntry<K, V> existing = table[tableIndex];
-      // prepend, not append, so the entries can be immutable
-      ImmutableMapEntry<K, V> newEntry =
-          (existing == null)
-              ? makeImmutable(entry, key, value)
-              : new NonTerminalImmutableMapEntry<K, V>(key, value, existing);
-      table[tableIndex] = newEntry;
-      entries[entryIndex] = newEntry;
-      int bucketSize = checkNoConflictInKeyBucket(key, newEntry, existing);
-      if (bucketSize > MAX_HASH_BUCKET_LENGTH) {
-        // probable hash flooding attack, fall back to j.u.HM based implementation and use its
-        // implementation of hash flooding protection
-        return JdkBackedImmutableMap.create(n, entryArray);
+      ImmutableMapEntry<K, V> keyBucketHead = table[tableIndex];
+      ImmutableMapEntry<K, V> effectiveEntry =
+          checkNoConflictInKeyBucket(key, value, keyBucketHead, throwIfDuplicateKeys);
+      if (effectiveEntry == null) {
+        // prepend, not append, so the entries can be immutable
+        effectiveEntry =
+            (keyBucketHead == null)
+                ? makeImmutable(entry, key, value)
+                : new NonTerminalImmutableMapEntry<K, V>(key, value, keyBucketHead);
+        table[tableIndex] = effectiveEntry;
+      } else {
+        // We already saw this key, and the first value we saw (going backwards) is the one we are
+        // keeping. So we won't touch table[], but we do still want to add the existing entry that
+        // we found to entries[] so that we will see this key in the right place when iterating.
+        if (duplicates == null) {
+          duplicates = new IdentityHashMap<>();
+        }
+        duplicates.put(effectiveEntry, true);
+        dupCount++;
+        // Make sure we are not overwriting the original entries array, in case we later do
+        // buildOrThrow(). We would want an exception to include two values for the duplicate key.
+        if (entries == entryArray) {
+          entries = entries.clone();
+        }
+      }
+      entries[entryIndex] = effectiveEntry;
+    }
+    if (duplicates != null) {
+      // Explicit type parameters needed here to avoid a problem with nullness inference.
+      entries = RegularImmutableMap.<K, V>removeDuplicates(entries, n, n - dupCount, duplicates);
+      int newTableSize = Hashing.closedTableSize(entries.length, MAX_LOAD_FACTOR);
+      if (newTableSize != tableSize) {
+        return fromEntryArrayCheckingBucketOverflow(
+            entries.length, entries, /* throwIfDuplicateKeys= */ true);
       }
     }
     return new RegularImmutableMap<>(entries, table, mask);
   }
 
+  /**
+   * Constructs a new entry array where each duplicated key from the original appears only once, at
+   * its first position but with its final value. The {@code duplicates} map is modified.
+   *
+   * @param entries the original array of entries including duplicates
+   * @param n the number of valid entries in {@code entries}
+   * @param newN the expected number of entries once duplicates are removed
+   * @param duplicates a map of canonical {@link Entry} objects for each duplicate key. This map
+   *     will be updated by the method, setting each value to false as soon as the {@link Entry} has
+   *     been included in the new entry array.
+   * @return an array of {@code newN} entries where no key appears more than once.
+   */
+  static <K, V> Entry<K, V>[] removeDuplicates(
+      Entry<K, V>[] entries, int n, int newN, IdentityHashMap<Entry<K, V>, Boolean> duplicates) {
+    Entry<K, V>[] newEntries = createEntryArray(newN);
+    for (int in = 0, out = 0; in < n; in++) {
+      Entry<K, V> entry = entries[in];
+      Boolean status = duplicates.get(entry);
+      // null=>not dup'd; true=>dup'd, first; false=>dup'd, not first
+      if (status != null) {
+        if (status) {
+          duplicates.put(entry, false);
+        } else {
+          continue; // delete this entry; we already copied an earlier one for the same key
+        }
+      }
+      newEntries[out++] = entry;
+    }
+    return newEntries;
+  }
+
   /** Makes an entry usable internally by a new ImmutableMap without rereading its contents. */
   static <K, V> ImmutableMapEntry<K, V> makeImmutable(Entry<K, V> entry, K key, V value) {
     boolean reusable =
@@ -142,20 +217,41 @@
   }
 
   /**
-   * @return number of entries in this bucket
-   * @throws IllegalArgumentException if another entry in the bucket has the same key
+   * Checks if the given key already appears in the hash chain starting at {@code keyBucketHead}. If
+   * it does not, then null is returned. If it does, then if {@code throwIfDuplicateKeys} is true an
+   * {@code IllegalArgumentException} is thrown, and otherwise the existing {@link Entry} is
+   * returned.
+   *
+   * @throws IllegalArgumentException if another entry in the bucket has the same key and {@code
+   *     throwIfDuplicateKeys} is true
+   * @throws BucketOverflowException if this bucket has too many entries, which may indicate a hash
+   *     flooding attack
    */
   @CanIgnoreReturnValue
-  static int checkNoConflictInKeyBucket(
-      Object key, Entry<?, ?> entry, @CheckForNull ImmutableMapEntry<?, ?> keyBucketHead) {
+  static <K, V> @Nullable ImmutableMapEntry<K, V> checkNoConflictInKeyBucket(
+      Object key,
+      Object newValue,
+      @CheckForNull ImmutableMapEntry<K, V> keyBucketHead,
+      boolean throwIfDuplicateKeys)
+      throws BucketOverflowException {
     int bucketSize = 0;
     for (; keyBucketHead != null; keyBucketHead = keyBucketHead.getNextInKeyBucket()) {
-      checkNoConflict(!key.equals(keyBucketHead.getKey()), "key", entry, keyBucketHead);
-      bucketSize++;
+      if (keyBucketHead.getKey().equals(key)) {
+        if (throwIfDuplicateKeys) {
+          checkNoConflict(/* safe= */ false, "key", keyBucketHead, key + "=" + newValue);
+        } else {
+          return keyBucketHead;
+        }
+      }
+      if (++bucketSize > MAX_HASH_BUCKET_LENGTH) {
+        throw new BucketOverflowException();
+      }
     }
-    return bucketSize;
+    return null;
   }
 
+  static class BucketOverflowException extends Exception {}
+
   @Override
   @CheckForNull
   public V get(@CheckForNull Object key) {
diff --git a/guava/src/com/google/common/collect/RegularImmutableSortedSet.java b/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
index fcb683f..572e0ac 100644
--- a/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
+++ b/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
@@ -29,6 +29,7 @@
 import java.util.Spliterator;
 import java.util.function.Consumer;
 import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An immutable sorted set with one or more elements. TODO(jlevy): Consider separate class for a
@@ -164,7 +165,7 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     return elements.copyIntoArray(dst, offset);
   }
 
diff --git a/guava/src/com/google/common/collect/RegularImmutableTable.java b/guava/src/com/google/common/collect/RegularImmutableTable.java
index 24434c5..337f123 100644
--- a/guava/src/com/google/common/collect/RegularImmutableTable.java
+++ b/guava/src/com/google/common/collect/RegularImmutableTable.java
@@ -98,8 +98,8 @@
 
   static <R, C, V> RegularImmutableTable<R, C, V> forCells(
       List<Cell<R, C, V>> cells,
-      @CheckForNull final Comparator<? super R> rowComparator,
-      @CheckForNull final Comparator<? super C> columnComparator) {
+      @CheckForNull Comparator<? super R> rowComparator,
+      @CheckForNull Comparator<? super C> columnComparator) {
     checkNotNull(cells);
     if (rowComparator != null || columnComparator != null) {
       /*
@@ -110,20 +110,17 @@
        * column, the rows in the second column, etc.
        */
       Comparator<Cell<R, C, V>> comparator =
-          new Comparator<Cell<R, C, V>>() {
-            @Override
-            public int compare(Cell<R, C, V> cell1, Cell<R, C, V> cell2) {
-              int rowCompare =
-                  (rowComparator == null)
-                      ? 0
-                      : rowComparator.compare(cell1.getRowKey(), cell2.getRowKey());
-              if (rowCompare != 0) {
-                return rowCompare;
-              }
-              return (columnComparator == null)
-                  ? 0
-                  : columnComparator.compare(cell1.getColumnKey(), cell2.getColumnKey());
+          (Cell<R, C, V> cell1, Cell<R, C, V> cell2) -> {
+            int rowCompare =
+                (rowComparator == null)
+                    ? 0
+                    : rowComparator.compare(cell1.getRowKey(), cell2.getRowKey());
+            if (rowCompare != 0) {
+              return rowCompare;
             }
+            return (columnComparator == null)
+                ? 0
+                : columnComparator.compare(cell1.getColumnKey(), cell2.getColumnKey());
           };
       Collections.sort(cells, comparator);
     }
diff --git a/guava/src/com/google/common/collect/Serialization.java b/guava/src/com/google/common/collect/Serialization.java
index 5e88067..4ab53f2 100644
--- a/guava/src/com/google/common/collect/Serialization.java
+++ b/guava/src/com/google/common/collect/Serialization.java
@@ -187,10 +187,10 @@
   }
 
   // Secret sauce for setting final fields; don't make it public.
-  static <T> FieldSetter<T> getFieldSetter(final Class<T> clazz, String fieldName) {
+  static <T> FieldSetter<T> getFieldSetter(Class<T> clazz, String fieldName) {
     try {
       Field field = clazz.getDeclaredField(fieldName);
-      return new FieldSetter<T>(field);
+      return new FieldSetter<>(field);
     } catch (NoSuchFieldException e) {
       throw new AssertionError(e); // programmer error
     }
diff --git a/guava/src/com/google/common/collect/SetMultimap.java b/guava/src/com/google/common/collect/SetMultimap.java
index 216533e..b7a5457 100644
--- a/guava/src/com/google/common/collect/SetMultimap.java
+++ b/guava/src/com/google/common/collect/SetMultimap.java
@@ -46,8 +46,7 @@
  * that affects its {@link Object#equals} behavior. Undefined behavior and bugs will result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/Sets.java b/guava/src/com/google/common/collect/Sets.java
index 5338bd2..c8cdc38 100644
--- a/guava/src/com/google/common/collect/Sets.java
+++ b/guava/src/com/google/common/collect/Sets.java
@@ -60,7 +60,7 @@
  * {@link Lists}, {@link Maps} and {@link Queues}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#sets"> {@code Sets}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#sets">{@code Sets}</a>.
  *
  * @author Kevin Bourrillion
  * @author Jared Levy
@@ -173,9 +173,9 @@
    * using a {@code LinkedHashSet} instead, at the cost of increased memory footprint, to get
    * deterministic iteration behavior.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code HashSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code HashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   public static <E extends @Nullable Object> HashSet<E> newHashSet() {
     return new HashSet<E>();
@@ -212,9 +212,9 @@
    * <p><b>Note:</b> if {@code E} is an {@link Enum} type, use {@link #newEnumSet(Iterable, Class)}
    * instead.
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Instead, use the {@code HashSet} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method.
+   * Instead, use the {@code HashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    */
@@ -299,9 +299,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableSet#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code LinkedHashSet} constructor directly, taking advantage of
-   * the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code LinkedHashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code LinkedHashSet}
    */
@@ -315,9 +315,9 @@
    * <p><b>Note:</b> if mutability is not required and the elements are non-null, use {@link
    * ImmutableSet#copyOf(Iterable)} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> if {@code elements} is a {@link Collection}, you don't
-   * need this method. Instead, use the {@code LinkedHashSet} constructor directly, taking advantage
-   * of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> if {@code elements} is a {@link Collection}, you don't need this method.
+   * Instead, use the {@code LinkedHashSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    *
@@ -359,9 +359,9 @@
    *
    * <p><b>Note:</b> if mutability is not required, use {@link ImmutableSortedSet#of()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * @return a new, empty {@code TreeSet}
    */
@@ -380,9 +380,9 @@
    * method has different behavior than {@link TreeSet#TreeSet(SortedSet)}, which returns a {@code
    * TreeSet} with that comparator.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    *
    * <p>This method is just a small convenience for creating an empty set and then calling {@link
    * Iterables#addAll}. This method is not very useful and will likely be deprecated in the future.
@@ -402,11 +402,11 @@
    * <p><b>Note:</b> if mutability is not required, use {@code
    * ImmutableSortedSet.orderedBy(comparator).build()} instead.
    *
-   * <p><b>Note for Java 7 and later:</b> this method is now unnecessary and should be treated as
-   * deprecated. Instead, use the {@code TreeSet} constructor directly, taking advantage of the new
-   * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>. One caveat to this is that the {@code
-   * TreeSet} constructor uses a null {@code Comparator} to mean "natural ordering," whereas this
-   * factory rejects null. Clean your code accordingly.
+   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated. Instead,
+   * use the {@code TreeSet} constructor directly, taking advantage of <a
+   * href="http://goo.gl/iz2Wi">"diamond" syntax</a>. One caveat to this is that the {@code TreeSet}
+   * constructor uses a null {@code Comparator} to mean "natural ordering," whereas this factory
+   * rejects null. Clean your code accordingly.
    *
    * @param comparator the comparator to use to sort the set
    * @return a new, empty {@code TreeSet}
diff --git a/guava/src/com/google/common/collect/SortedMultiset.java b/guava/src/com/google/common/collect/SortedMultiset.java
index 68932f5..7cc512d 100644
--- a/guava/src/com/google/common/collect/SortedMultiset.java
+++ b/guava/src/com/google/common/collect/SortedMultiset.java
@@ -37,8 +37,7 @@
  * Collection} contract, which is specified in terms of {@link Object#equals}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Louis Wasserman
  * @since 11.0
diff --git a/guava/src/com/google/common/collect/SortedMultisets.java b/guava/src/com/google/common/collect/SortedMultisets.java
index 1d1940c..f602a42 100644
--- a/guava/src/com/google/common/collect/SortedMultisets.java
+++ b/guava/src/com/google/common/collect/SortedMultisets.java
@@ -128,7 +128,7 @@
 
     @Override
     public NavigableSet<E> descendingSet() {
-      return new NavigableElementSet<E>(multiset().descendingMultiset());
+      return new NavigableElementSet<>(multiset().descendingMultiset());
     }
 
     @Override
@@ -154,7 +154,7 @@
         boolean fromInclusive,
         @ParametricNullness E toElement,
         boolean toInclusive) {
-      return new NavigableElementSet<E>(
+      return new NavigableElementSet<>(
           multiset()
               .subMultiset(
                   fromElement, BoundType.forBoolean(fromInclusive),
@@ -163,13 +163,13 @@
 
     @Override
     public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
-      return new NavigableElementSet<E>(
+      return new NavigableElementSet<>(
           multiset().headMultiset(toElement, BoundType.forBoolean(inclusive)));
     }
 
     @Override
     public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
-      return new NavigableElementSet<E>(
+      return new NavigableElementSet<>(
           multiset().tailMultiset(fromElement, BoundType.forBoolean(inclusive)));
     }
   }
diff --git a/guava/src/com/google/common/collect/SortedSetMultimap.java b/guava/src/com/google/common/collect/SortedSetMultimap.java
index 8449014..8454aec 100644
--- a/guava/src/com/google/common/collect/SortedSetMultimap.java
+++ b/guava/src/com/google/common/collect/SortedSetMultimap.java
@@ -43,8 +43,7 @@
  * position in the order of the values). Undefined behavior and bugs will result.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/SparseImmutableTable.java b/guava/src/com/google/common/collect/SparseImmutableTable.java
index b314f7b..44881fd 100644
--- a/guava/src/com/google/common/collect/SparseImmutableTable.java
+++ b/guava/src/com/google/common/collect/SparseImmutableTable.java
@@ -82,14 +82,14 @@
     for (Entry<R, Map<C, V>> row : rows.entrySet()) {
       rowBuilder.put(row.getKey(), ImmutableMap.copyOf(row.getValue()));
     }
-    this.rowMap = rowBuilder.build();
+    this.rowMap = rowBuilder.buildOrThrow();
 
     ImmutableMap.Builder<C, ImmutableMap<R, V>> columnBuilder =
         new ImmutableMap.Builder<>(columns.size());
     for (Entry<C, Map<R, V>> col : columns.entrySet()) {
       columnBuilder.put(col.getKey(), ImmutableMap.copyOf(col.getValue()));
     }
-    this.columnMap = columnBuilder.build();
+    this.columnMap = columnBuilder.buildOrThrow();
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/Streams.java b/guava/src/com/google/common/collect/Streams.java
index 3bf8382..cd7a07c 100644
--- a/guava/src/com/google/common/collect/Streams.java
+++ b/guava/src/com/google/common/collect/Streams.java
@@ -18,13 +18,13 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.lang.Math.min;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.math.LongMath;
 import com.google.errorprone.annotations.InlineMe;
-import com.google.errorprone.annotations.InlineMeValidationDisabled;
 import java.util.ArrayDeque;
 import java.util.Collection;
 import java.util.Deque;
@@ -107,7 +107,7 @@
    */
   @Beta
   @InlineMe(replacement = "optional.stream()")
-  @InlineMeValidationDisabled("Java 9+ API only")
+  @com.google.errorprone.annotations.InlineMeValidationDisabled("Java 9+ API only")
   public static <T> Stream<T> stream(java.util.Optional<T> optional) {
     return optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
   }
@@ -120,7 +120,7 @@
    */
   @Beta
   @InlineMe(replacement = "optional.stream()")
-  @InlineMeValidationDisabled("Java 9+ API only")
+  @com.google.errorprone.annotations.InlineMeValidationDisabled("Java 9+ API only")
   public static IntStream stream(OptionalInt optional) {
     return optional.isPresent() ? IntStream.of(optional.getAsInt()) : IntStream.empty();
   }
@@ -133,7 +133,7 @@
    */
   @Beta
   @InlineMe(replacement = "optional.stream()")
-  @InlineMeValidationDisabled("Java 9+ API only")
+  @com.google.errorprone.annotations.InlineMeValidationDisabled("Java 9+ API only")
   public static LongStream stream(OptionalLong optional) {
     return optional.isPresent() ? LongStream.of(optional.getAsLong()) : LongStream.empty();
   }
@@ -146,7 +146,7 @@
    */
   @Beta
   @InlineMe(replacement = "optional.stream()")
-  @InlineMeValidationDisabled("Java 9+ API only")
+  @com.google.errorprone.annotations.InlineMeValidationDisabled("Java 9+ API only")
   public static DoubleStream stream(OptionalDouble optional) {
     return optional.isPresent() ? DoubleStream.of(optional.getAsDouble()) : DoubleStream.empty();
   }
@@ -331,7 +331,7 @@
     Iterator<B> itrB = Spliterators.iterator(splitrB);
     return StreamSupport.stream(
             new AbstractSpliterator<R>(
-                Math.min(splitrA.estimateSize(), splitrB.estimateSize()), characteristics) {
+                min(splitrA.estimateSize(), splitrB.estimateSize()), characteristics) {
               @Override
               public boolean tryAdvance(Consumer<? super R> action) {
                 if (itrA.hasNext() && itrB.hasNext()) {
@@ -410,10 +410,10 @@
    * <pre>{@code
    * mapWithIndex(
    *     Stream.of("a", "b", "c"),
-   *     (str, index) -> str + ":" + index)
+   *     (e, index) -> index + ":" + e)
    * }</pre>
    *
-   * <p>would return {@code Stream.of("a:0", "b:1", "c:2")}.
+   * <p>would return {@code Stream.of("0:a", "1:b", "2:c")}.
    *
    * <p>The resulting stream is <a
    * href="http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html">efficiently splittable</a>
@@ -425,7 +425,6 @@
    * <p>The order of the resulting stream is defined if and only if the order of the original stream
    * was defined.
    */
-  @Beta
   public static <T extends @Nullable Object, R extends @Nullable Object> Stream<R> mapWithIndex(
       Stream<T> stream, FunctionWithIndex<? super T, ? extends R> function) {
     checkNotNull(stream);
@@ -493,11 +492,11 @@
    *
    * <pre>{@code
    * mapWithIndex(
-   *     IntStream.of(0, 1, 2),
-   *     (i, index) -> i + ":" + index)
+   *     IntStream.of(10, 11, 12),
+   *     (e, index) -> index + ":" + e)
    * }</pre>
    *
-   * <p>...would return {@code Stream.of("0:0", "1:1", "2:2")}.
+   * <p>...would return {@code Stream.of("0:10", "1:11", "2:12")}.
    *
    * <p>The resulting stream is <a
    * href="http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html">efficiently splittable</a>
@@ -509,7 +508,6 @@
    * <p>The order of the resulting stream is defined if and only if the order of the original stream
    * was defined.
    */
-  @Beta
   public static <R extends @Nullable Object> Stream<R> mapWithIndex(
       IntStream stream, IntFunctionWithIndex<R> function) {
     checkNotNull(stream);
@@ -573,11 +571,11 @@
    *
    * <pre>{@code
    * mapWithIndex(
-   *     LongStream.of(0, 1, 2),
-   *     (i, index) -> i + ":" + index)
+   *     LongStream.of(10, 11, 12),
+   *     (e, index) -> index + ":" + e)
    * }</pre>
    *
-   * <p>...would return {@code Stream.of("0:0", "1:1", "2:2")}.
+   * <p>...would return {@code Stream.of("0:10", "1:11", "2:12")}.
    *
    * <p>The resulting stream is <a
    * href="http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html">efficiently splittable</a>
@@ -589,7 +587,6 @@
    * <p>The order of the resulting stream is defined if and only if the order of the original stream
    * was defined.
    */
-  @Beta
   public static <R extends @Nullable Object> Stream<R> mapWithIndex(
       LongStream stream, LongFunctionWithIndex<R> function) {
     checkNotNull(stream);
@@ -653,11 +650,11 @@
    *
    * <pre>{@code
    * mapWithIndex(
-   *     DoubleStream.of(0, 1, 2),
-   *     (x, index) -> x + ":" + index)
+   *     DoubleStream.of(0.0, 1.0, 2.0)
+   *     (e, index) -> index + ":" + e)
    * }</pre>
    *
-   * <p>...would return {@code Stream.of("0.0:0", "1.0:1", "2.0:2")}.
+   * <p>...would return {@code Stream.of("0:0.0", "1:1.0", "2:2.0")}.
    *
    * <p>The resulting stream is <a
    * href="http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html">efficiently splittable</a>
@@ -669,7 +666,6 @@
    * <p>The order of the resulting stream is defined if and only if the order of the original stream
    * was defined.
    */
-  @Beta
   public static <R extends @Nullable Object> Stream<R> mapWithIndex(
       DoubleStream stream, DoubleFunctionWithIndex<R> function) {
     checkNotNull(stream);
@@ -735,7 +731,6 @@
    *
    * @since 21.0
    */
-  @Beta
   public interface FunctionWithIndex<T extends @Nullable Object, R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
     @ParametricNullness
@@ -791,7 +786,6 @@
    *
    * @since 21.0
    */
-  @Beta
   public interface IntFunctionWithIndex<R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
     @ParametricNullness
@@ -806,7 +800,6 @@
    *
    * @since 21.0
    */
-  @Beta
   public interface LongFunctionWithIndex<R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
     @ParametricNullness
@@ -821,7 +814,6 @@
    *
    * @since 21.0
    */
-  @Beta
   public interface DoubleFunctionWithIndex<R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
     @ParametricNullness
@@ -853,7 +845,6 @@
    * split has a last element of null, so throw NPE" from "the final split was empty, so look for an
    * element in the prior one.")
    */
-  @Beta
   public static <T> java.util.Optional<T> findLast(Stream<T> stream) {
     class OptionalState {
       boolean set = false;
@@ -932,7 +923,6 @@
    * @see IntStream#findFirst()
    * @throws NullPointerException if the last element of the stream is null
    */
-  @Beta
   public static OptionalInt findLast(IntStream stream) {
     // findLast(Stream) does some allocation, so we might as well box some more
     java.util.Optional<Integer> boxedLast = findLast(stream.boxed());
@@ -951,7 +941,6 @@
    * @see LongStream#findFirst()
    * @throws NullPointerException if the last element of the stream is null
    */
-  @Beta
   public static OptionalLong findLast(LongStream stream) {
     // findLast(Stream) does some allocation, so we might as well box some more
     java.util.Optional<Long> boxedLast = findLast(stream.boxed());
@@ -970,7 +959,6 @@
    * @see DoubleStream#findFirst()
    * @throws NullPointerException if the last element of the stream is null
    */
-  @Beta
   public static OptionalDouble findLast(DoubleStream stream) {
     // findLast(Stream) does some allocation, so we might as well box some more
     java.util.Optional<Double> boxedLast = findLast(stream.boxed());
diff --git a/guava/src/com/google/common/collect/Synchronized.java b/guava/src/com/google/common/collect/Synchronized.java
index 25e2870..29fe61a 100644
--- a/guava/src/com/google/common/collect/Synchronized.java
+++ b/guava/src/com/google/common/collect/Synchronized.java
@@ -1195,7 +1195,8 @@
     }
 
     @Override
-    public V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+    public V compute(
+        K key, BiFunction<? super K, ? super @Nullable V, ? extends V> remappingFunction) {
       synchronized (mutex) {
         return delegate().compute(key, remappingFunction);
       }
diff --git a/guava/src/com/google/common/collect/Table.java b/guava/src/com/google/common/collect/Table.java
index 97d3f70..3c9e7ec 100644
--- a/guava/src/com/google/common/collect/Table.java
+++ b/guava/src/com/google/common/collect/Table.java
@@ -46,7 +46,7 @@
  * UnsupportedOperationException}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @param <R> the type of the table row keys
diff --git a/guava/src/com/google/common/collect/TableCollectors.java b/guava/src/com/google/common/collect/TableCollectors.java
index 99ab810..16fcb16 100644
--- a/guava/src/com/google/common/collect/TableCollectors.java
+++ b/guava/src/com/google/common/collect/TableCollectors.java
@@ -68,8 +68,7 @@
      */
 
     return Collector.of(
-        () -> new ImmutableTableCollectorState<R, C, V>()
-        /* GWT isn't currently playing nicely with constructor references? */ ,
+        ImmutableTableCollectorState<R, C, V>::new,
         (state, input) ->
             state.put(
                 rowFunction.apply(input),
diff --git a/guava/src/com/google/common/collect/Tables.java b/guava/src/com/google/common/collect/Tables.java
index 2d743f0..9c58611 100644
--- a/guava/src/com/google/common/collect/Tables.java
+++ b/guava/src/com/google/common/collect/Tables.java
@@ -44,7 +44,7 @@
  * Provides static methods that involve a {@code Table}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#tables"> {@code Tables}</a>.
+ * "https://github.com/google/guava/wiki/CollectionUtilitiesExplained#tables">{@code Tables}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
diff --git a/guava/src/com/google/common/collect/TopKSelector.java b/guava/src/com/google/common/collect/TopKSelector.java
index 8411fcd..20b17fd 100644
--- a/guava/src/com/google/common/collect/TopKSelector.java
+++ b/guava/src/com/google/common/collect/TopKSelector.java
@@ -185,8 +185,10 @@
       }
       iterations++;
       if (iterations >= maxIterations) {
+        @SuppressWarnings("nullness") // safe because we pass sort() a range that contains real Ts
+        T[] castBuffer = (T[]) buffer;
         // We've already taken O(k log k), let's make sure we don't take longer than O(k log k).
-        Arrays.sort(buffer, left, right + 1, comparator);
+        Arrays.sort(castBuffer, left, right + 1, comparator);
         break;
       }
     }
@@ -271,7 +273,9 @@
    * this {@code TopKSelector}. This method returns in O(k log k) time.
    */
   public List<T> topK() {
-    Arrays.sort(buffer, 0, bufferSize, comparator);
+    @SuppressWarnings("nullness") // safe because we pass sort() a range that contains real Ts
+    T[] castBuffer = (T[]) buffer;
+    Arrays.sort(castBuffer, 0, bufferSize, comparator);
     if (bufferSize > k) {
       Arrays.fill(buffer, k, buffer.length, null);
       bufferSize = k;
diff --git a/guava/src/com/google/common/collect/TreeBasedTable.java b/guava/src/com/google/common/collect/TreeBasedTable.java
index 315404a..9ef210a 100644
--- a/guava/src/com/google/common/collect/TreeBasedTable.java
+++ b/guava/src/com/google/common/collect/TreeBasedTable.java
@@ -21,7 +21,6 @@
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
-import com.google.common.base.Function;
 import com.google.common.base.Supplier;
 import java.io.Serializable;
 import java.util.Comparator;
@@ -60,7 +59,7 @@
  * concurrently and one of the threads modifies the table, it must be synchronized externally.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table"> {@code Table}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">{@code Table}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -313,18 +312,12 @@
   /** Overridden column iterator to return columns values in globally sorted order. */
   @Override
   Iterator<C> createColumnKeyIterator() {
-    final Comparator<? super C> comparator = columnComparator();
+    Comparator<? super C> comparator = columnComparator();
 
-    final Iterator<C> merged =
+    Iterator<C> merged =
         Iterators.mergeSorted(
             Iterables.transform(
-                backingMap.values(),
-                new Function<Map<C, V>, Iterator<C>>() {
-                  @Override
-                  public Iterator<C> apply(Map<C, V> input) {
-                    return input.keySet().iterator();
-                  }
-                }),
+                backingMap.values(), (Map<C, V> input) -> input.keySet().iterator()),
             comparator);
 
     return new AbstractIterator<C>() {
diff --git a/guava/src/com/google/common/collect/TreeMultimap.java b/guava/src/com/google/common/collect/TreeMultimap.java
index 04ae207..dd0c2f8 100644
--- a/guava/src/com/google/common/collect/TreeMultimap.java
+++ b/guava/src/com/google/common/collect/TreeMultimap.java
@@ -64,8 +64,7 @@
  * with a call to {@link Multimaps#synchronizedSortedSetMultimap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
- * Multimap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap">{@code Multimap}</a>.
  *
  * @author Jared Levy
  * @author Louis Wasserman
@@ -136,7 +135,7 @@
    */
   @Override
   SortedSet<V> createCollection() {
-    return new TreeSet<V>(valueComparator);
+    return new TreeSet<>(valueComparator);
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/TreeMultiset.java b/guava/src/com/google/common/collect/TreeMultiset.java
index dcc3f68..23cbca8 100644
--- a/guava/src/com/google/common/collect/TreeMultiset.java
+++ b/guava/src/com/google/common/collect/TreeMultiset.java
@@ -51,8 +51,7 @@
  * java.util.Collection} contract, which is specified in terms of {@link Object#equals}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
- * Multiset}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset">{@code Multiset}</a>.
  *
  * @author Louis Wasserman
  * @author Jared Levy
diff --git a/guava/src/com/google/common/collect/TreeRangeMap.java b/guava/src/com/google/common/collect/TreeRangeMap.java
index a920089..60e7bf3 100644
--- a/guava/src/com/google/common/collect/TreeRangeMap.java
+++ b/guava/src/com/google/common/collect/TreeRangeMap.java
@@ -436,7 +436,8 @@
         public void merge(
             Range<Comparable<?>> range,
             @CheckForNull Object value,
-            BiFunction<? super Object, ? super Object, ? extends Object> remappingFunction) {
+            BiFunction<? super Object, ? super @Nullable Object, ? extends @Nullable Object>
+                remappingFunction) {
           checkNotNull(range);
           throw new IllegalArgumentException(
               "Cannot merge range " + range + " into an empty subRangeMap");
diff --git a/guava/src/com/google/common/collect/TreeRangeSet.java b/guava/src/com/google/common/collect/TreeRangeSet.java
index 8308880..7ba7113 100644
--- a/guava/src/com/google/common/collect/TreeRangeSet.java
+++ b/guava/src/com/google/common/collect/TreeRangeSet.java
@@ -48,7 +48,7 @@
 
   /** Creates an empty {@code TreeRangeSet} instance. */
   public static <C extends Comparable<?>> TreeRangeSet<C> create() {
-    return new TreeRangeSet<C>(new TreeMap<Cut<C>, Range<C>>());
+    return new TreeRangeSet<>(new TreeMap<Cut<C>, Range<C>>());
   }
 
   /** Returns a {@code TreeRangeSet} initialized with the ranges in the specified range set. */
@@ -306,7 +306,7 @@
 
     private NavigableMap<Cut<C>, Range<C>> subMap(Range<Cut<C>> window) {
       if (window.isConnected(upperBoundWindow)) {
-        return new RangesByUpperBound<C>(rangesByLowerBound, window.intersection(upperBoundWindow));
+        return new RangesByUpperBound<>(rangesByLowerBound, window.intersection(upperBoundWindow));
       } else {
         return ImmutableSortedMap.of();
       }
@@ -368,7 +368,7 @@
        * We want to start the iteration at the first range where the upper bound is in
        * upperBoundWindow.
        */
-      final Iterator<Range<C>> backingItr;
+      Iterator<Range<C>> backingItr;
       if (!upperBoundWindow.hasLowerBound()) {
         backingItr = rangesByLowerBound.values().iterator();
       } else {
@@ -415,7 +415,7 @@
       } else {
         candidates = rangesByLowerBound.descendingMap().values();
       }
-      final PeekingIterator<Range<C>> backingItr = Iterators.peekingIterator(candidates.iterator());
+      PeekingIterator<Range<C>> backingItr = Iterators.peekingIterator(candidates.iterator());
       if (backingItr.hasNext()
           && upperBoundWindow.upperBound.isLessThan(backingItr.peek().upperBound)) {
         backingItr.next();
@@ -470,7 +470,7 @@
     private ComplementRangesByLowerBound(
         NavigableMap<Cut<C>, Range<C>> positiveRangesByLowerBound, Range<Cut<C>> window) {
       this.positiveRangesByLowerBound = positiveRangesByLowerBound;
-      this.positiveRangesByUpperBound = new RangesByUpperBound<C>(positiveRangesByLowerBound);
+      this.positiveRangesByUpperBound = new RangesByUpperBound<>(positiveRangesByLowerBound);
       this.complementLowerBoundWindow = window;
     }
 
@@ -479,7 +479,7 @@
         return ImmutableSortedMap.of();
       } else {
         subWindow = subWindow.intersection(complementLowerBoundWindow);
-        return new ComplementRangesByLowerBound<C>(positiveRangesByLowerBound, subWindow);
+        return new ComplementRangesByLowerBound<>(positiveRangesByLowerBound, subWindow);
       }
     }
 
@@ -529,9 +529,8 @@
       } else {
         positiveRanges = positiveRangesByUpperBound.values();
       }
-      final PeekingIterator<Range<C>> positiveItr =
-          Iterators.peekingIterator(positiveRanges.iterator());
-      final Cut<C> firstComplementRangeLowerBound;
+      PeekingIterator<Range<C>> positiveItr = Iterators.peekingIterator(positiveRanges.iterator());
+      Cut<C> firstComplementRangeLowerBound;
       if (complementLowerBoundWindow.contains(Cut.<C>belowAll())
           && (!positiveItr.hasNext() || positiveItr.peek().lowerBound != Cut.<C>belowAll())) {
         firstComplementRangeLowerBound = Cut.belowAll();
@@ -581,7 +580,7 @@
       boolean inclusive =
           complementLowerBoundWindow.hasUpperBound()
               && complementLowerBoundWindow.upperBoundType() == BoundType.CLOSED;
-      final PeekingIterator<Range<C>> positiveItr =
+      PeekingIterator<Range<C>> positiveItr =
           Iterators.peekingIterator(
               positiveRangesByUpperBound
                   .headMap(startingPoint, inclusive)
@@ -600,8 +599,7 @@
       } else {
         cut = positiveRangesByLowerBound.higherKey(Cut.<C>belowAll());
       }
-      final Cut<C> firstComplementRangeUpperBound =
-          MoreObjects.firstNonNull(cut, Cut.<C>aboveAll());
+      Cut<C> firstComplementRangeUpperBound = MoreObjects.firstNonNull(cut, Cut.<C>aboveAll());
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         Cut<C> nextComplementRangeUpperBound = firstComplementRangeUpperBound;
 
@@ -708,14 +706,14 @@
       this.lowerBoundWindow = checkNotNull(lowerBoundWindow);
       this.restriction = checkNotNull(restriction);
       this.rangesByLowerBound = checkNotNull(rangesByLowerBound);
-      this.rangesByUpperBound = new RangesByUpperBound<C>(rangesByLowerBound);
+      this.rangesByUpperBound = new RangesByUpperBound<>(rangesByLowerBound);
     }
 
     private NavigableMap<Cut<C>, Range<C>> subMap(Range<Cut<C>> window) {
       if (!window.isConnected(lowerBoundWindow)) {
         return ImmutableSortedMap.of();
       } else {
-        return new SubRangeSetRangesByLowerBound<C>(
+        return new SubRangeSetRangesByLowerBound<>(
             lowerBoundWindow.intersection(window), restriction, rangesByLowerBound);
       }
     }
@@ -786,7 +784,7 @@
       if (restriction.isEmpty()) {
         return Iterators.emptyIterator();
       }
-      final Iterator<Range<C>> completeRangeItr;
+      Iterator<Range<C>> completeRangeItr;
       if (lowerBoundWindow.upperBound.isLessThan(restriction.lowerBound)) {
         return Iterators.emptyIterator();
       } else if (lowerBoundWindow.lowerBound.isLessThan(restriction.lowerBound)) {
@@ -803,7 +801,7 @@
                 .values()
                 .iterator();
       }
-      final Cut<Cut<C>> upperBoundOnLowerBounds =
+      Cut<Cut<C>> upperBoundOnLowerBounds =
           Ordering.natural()
               .min(lowerBoundWindow.upperBound, Cut.belowValue(restriction.upperBound));
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
@@ -832,7 +830,7 @@
       Cut<Cut<C>> upperBoundOnLowerBounds =
           Ordering.natural()
               .min(lowerBoundWindow.upperBound, Cut.belowValue(restriction.upperBound));
-      final Iterator<Range<C>> completeRangeItr =
+      Iterator<Range<C>> completeRangeItr =
           rangesByLowerBound
               .headMap(
                   upperBoundOnLowerBounds.endpoint(),
diff --git a/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java b/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
index 59bd2ce..31f3c71 100644
--- a/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
+++ b/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
@@ -64,7 +64,7 @@
   public SortedMultiset<E> descendingMultiset() {
     UnmodifiableSortedMultiset<E> result = descendingMultiset;
     if (result == null) {
-      result = new UnmodifiableSortedMultiset<E>(delegate().descendingMultiset());
+      result = new UnmodifiableSortedMultiset<>(delegate().descendingMultiset());
       result.descendingMultiset = this;
       return descendingMultiset = result;
     }
diff --git a/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java b/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
index 20e8563..dbe6e35 100644
--- a/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
+++ b/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
 import javax.annotation.CheckForNull;
@@ -41,7 +40,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedCharEscaper extends CharEscaper {
diff --git a/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java b/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
index a0883fe..efc77d0 100644
--- a/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
+++ b/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Collections;
@@ -36,7 +35,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class ArrayBasedEscaperMap {
diff --git a/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java b/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
index 5ea7807..355faaa 100644
--- a/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
+++ b/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
 import javax.annotation.CheckForNull;
@@ -41,7 +40,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedUnicodeEscaper extends UnicodeEscaper {
diff --git a/guava/src/com/google/common/escape/CharEscaper.java b/guava/src/com/google/common/escape/CharEscaper.java
index 55090f6..136240e 100644
--- a/guava/src/com/google/common/escape/CharEscaper.java
+++ b/guava/src/com/google/common/escape/CharEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import javax.annotation.CheckForNull;
 
@@ -40,7 +39,6 @@
  * @author Sven Mawson
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class CharEscaper extends Escaper {
diff --git a/guava/src/com/google/common/escape/CharEscaperBuilder.java b/guava/src/com/google/common/escape/CharEscaperBuilder.java
index cbe6958..97528cb 100644
--- a/guava/src/com/google/common/escape/CharEscaperBuilder.java
+++ b/guava/src/com/google/common/escape/CharEscaperBuilder.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashMap;
@@ -34,7 +33,6 @@
  * @author Sven Mawson
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class CharEscaperBuilder {
diff --git a/guava/src/com/google/common/escape/Escaper.java b/guava/src/com/google/common/escape/Escaper.java
index cdfe4e9..31b7df0 100644
--- a/guava/src/com/google/common/escape/Escaper.java
+++ b/guava/src/com/google/common/escape/Escaper.java
@@ -85,13 +85,7 @@
    */
   public abstract String escape(String string);
 
-  private final Function<String, String> asFunction =
-      new Function<String, String>() {
-        @Override
-        public String apply(String from) {
-          return escape(from);
-        }
-      };
+  private final Function<String, String> asFunction = this::escape;
 
   /** Returns a {@link Function} that invokes {@link #escape(String)} on this escaper. */
   public final Function<String, String> asFunction() {
diff --git a/guava/src/com/google/common/escape/Escapers.java b/guava/src/com/google/common/escape/Escapers.java
index 41af668..acfb82c 100644
--- a/guava/src/com/google/common/escape/Escapers.java
+++ b/guava/src/com/google/common/escape/Escapers.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashMap;
@@ -31,7 +30,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class Escapers {
@@ -93,7 +91,6 @@
    * @author David Beaumont
    * @since 15.0
    */
-  @Beta
   public static final class Builder {
     private final Map<Character, String> replacementMap = new HashMap<>();
     private char safeMin = Character.MIN_VALUE;
@@ -228,7 +225,7 @@
   }
 
   /** Private helper to wrap a CharEscaper as a UnicodeEscaper. */
-  private static UnicodeEscaper wrap(final CharEscaper escaper) {
+  private static UnicodeEscaper wrap(CharEscaper escaper) {
     return new UnicodeEscaper() {
       @Override
       @CheckForNull
diff --git a/guava/src/com/google/common/escape/ParametricNullness.java b/guava/src/com/google/common/escape/ParametricNullness.java
index 2f03d59..d941206 100644
--- a/guava/src/com/google/common/escape/ParametricNullness.java
+++ b/guava/src/com/google/common/escape/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/escape/UnicodeEscaper.java b/guava/src/com/google/common/escape/UnicodeEscaper.java
index c10ae34..280915c 100644
--- a/guava/src/com/google/common/escape/UnicodeEscaper.java
+++ b/guava/src/com/google/common/escape/UnicodeEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import javax.annotation.CheckForNull;
 
@@ -50,7 +49,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public abstract class UnicodeEscaper extends Escaper {
diff --git a/guava/src/com/google/common/eventbus/ParametricNullness.java b/guava/src/com/google/common/eventbus/ParametricNullness.java
index fc5bb17..ac91392 100644
--- a/guava/src/com/google/common/eventbus/ParametricNullness.java
+++ b/guava/src/com/google/common/eventbus/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/eventbus/Subscriber.java b/guava/src/com/google/common/eventbus/Subscriber.java
index 73e7f42..71ee197 100644
--- a/guava/src/com/google/common/eventbus/Subscriber.java
+++ b/guava/src/com/google/common/eventbus/Subscriber.java
@@ -64,16 +64,13 @@
   }
 
   /** Dispatches {@code event} to this subscriber using the proper executor. */
-  final void dispatchEvent(final Object event) {
+  final void dispatchEvent(Object event) {
     executor.execute(
-        new Runnable() {
-          @Override
-          public void run() {
-            try {
-              invokeSubscriberMethod(event);
-            } catch (InvocationTargetException e) {
-              bus.handleSubscriberException(e.getCause(), context(event));
-            }
+        () -> {
+          try {
+            invokeSubscriberMethod(event);
+          } catch (InvocationTargetException e) {
+            bus.handleSubscriberException(e.getCause(), context(event));
           }
         });
   }
diff --git a/guava/src/com/google/common/graph/AbstractBaseGraph.java b/guava/src/com/google/common/graph/AbstractBaseGraph.java
index c4be6b6..797468b 100644
--- a/guava/src/com/google/common/graph/AbstractBaseGraph.java
+++ b/guava/src/com/google/common/graph/AbstractBaseGraph.java
@@ -21,7 +21,6 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Sets;
@@ -115,31 +114,16 @@
               Iterators.concat(
                   Iterators.transform(
                       graph.predecessors(node).iterator(),
-                      new Function<N, EndpointPair<N>>() {
-                        @Override
-                        public EndpointPair<N> apply(N predecessor) {
-                          return EndpointPair.ordered(predecessor, node);
-                        }
-                      }),
+                      (N predecessor) -> EndpointPair.ordered(predecessor, node)),
                   Iterators.transform(
                       // filter out 'node' from successors (already covered by predecessors, above)
                       Sets.difference(graph.successors(node), ImmutableSet.of(node)).iterator(),
-                      new Function<N, EndpointPair<N>>() {
-                        @Override
-                        public EndpointPair<N> apply(N successor) {
-                          return EndpointPair.ordered(node, successor);
-                        }
-                      })));
+                      (N successor) -> EndpointPair.ordered(node, successor))));
         } else {
           return Iterators.unmodifiableIterator(
               Iterators.transform(
                   graph.adjacentNodes(node).iterator(),
-                  new Function<N, EndpointPair<N>>() {
-                    @Override
-                    public EndpointPair<N> apply(N adjacentNode) {
-                      return EndpointPair.unordered(node, adjacentNode);
-                    }
-                  }));
+                  (N adjacentNode) -> EndpointPair.unordered(node, adjacentNode)));
         }
       }
     };
diff --git a/guava/src/com/google/common/graph/DirectedGraphConnections.java b/guava/src/com/google/common/graph/DirectedGraphConnections.java
index 23083da..0feb973 100644
--- a/guava/src/com/google/common/graph/DirectedGraphConnections.java
+++ b/guava/src/com/google/common/graph/DirectedGraphConnections.java
@@ -163,13 +163,13 @@
         orderedNodeConnections = null;
         break;
       case STABLE:
-        orderedNodeConnections = new ArrayList<NodeConnection<N>>();
+        orderedNodeConnections = new ArrayList<>();
         break;
       default:
         throw new AssertionError(incidentEdgeOrder.type());
     }
 
-    return new DirectedGraphConnections<N, V>(
+    return new DirectedGraphConnections<>(
         /* adjacentNodeValues = */ new HashMap<N, Object>(initialCapacity, INNER_LOAD_FACTOR),
         orderedNodeConnections,
         /* predecessorCount = */ 0,
@@ -239,8 +239,8 @@
       return new AbstractSet<N>() {
         @Override
         public UnmodifiableIterator<N> iterator() {
-          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
-          final Set<N> seenNodes = new HashSet<>();
+          Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          Set<N> seenNodes = new HashSet<>();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -276,7 +276,7 @@
       @Override
       public UnmodifiableIterator<N> iterator() {
         if (orderedNodeConnections == null) {
-          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -291,7 +291,7 @@
             }
           };
         } else {
-          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -326,7 +326,7 @@
       @Override
       public UnmodifiableIterator<N> iterator() {
         if (orderedNodeConnections == null) {
-          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -341,7 +341,7 @@
             }
           };
         } else {
-          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
             @CheckForNull
@@ -371,46 +371,33 @@
   }
 
   @Override
-  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(N thisNode) {
     checkNotNull(thisNode);
 
-    final Iterator<EndpointPair<N>> resultWithDoubleSelfLoop;
+    Iterator<EndpointPair<N>> resultWithDoubleSelfLoop;
     if (orderedNodeConnections == null) {
       resultWithDoubleSelfLoop =
           Iterators.concat(
               Iterators.transform(
                   predecessors().iterator(),
-                  new Function<N, EndpointPair<N>>() {
-                    @Override
-                    public EndpointPair<N> apply(N predecessor) {
-                      return EndpointPair.ordered(predecessor, thisNode);
-                    }
-                  }),
+                  (N predecessor) -> EndpointPair.ordered(predecessor, thisNode)),
               Iterators.transform(
                   successors().iterator(),
-                  new Function<N, EndpointPair<N>>() {
-                    @Override
-                    public EndpointPair<N> apply(N successor) {
-                      return EndpointPair.ordered(thisNode, successor);
-                    }
-                  }));
+                  (N successor) -> EndpointPair.ordered(thisNode, successor)));
     } else {
       resultWithDoubleSelfLoop =
           Iterators.transform(
               orderedNodeConnections.iterator(),
-              new Function<NodeConnection<N>, EndpointPair<N>>() {
-                @Override
-                public EndpointPair<N> apply(NodeConnection<N> connection) {
-                  if (connection instanceof NodeConnection.Succ) {
-                    return EndpointPair.ordered(thisNode, connection.node);
-                  } else {
-                    return EndpointPair.ordered(connection.node, thisNode);
-                  }
+              (NodeConnection<N> connection) -> {
+                if (connection instanceof NodeConnection.Succ) {
+                  return EndpointPair.ordered(thisNode, connection.node);
+                } else {
+                  return EndpointPair.ordered(connection.node, thisNode);
                 }
               });
     }
 
-    final AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
+    AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
     return new AbstractIterator<EndpointPair<N>>() {
       @Override
       @CheckForNull
diff --git a/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java b/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
index 05f40c2..bd0e546 100644
--- a/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
+++ b/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
@@ -93,7 +93,7 @@
   }
 
   @Override
-  public Set<E> edgesConnecting(final N node) {
+  public Set<E> edgesConnecting(N node) {
     return new MultiEdgesConnecting<E>(outEdgeMap, node) {
       @Override
       public int size() {
diff --git a/guava/src/com/google/common/graph/DirectedNetworkConnections.java b/guava/src/com/google/common/graph/DirectedNetworkConnections.java
index c2a25a5..e1db657 100644
--- a/guava/src/com/google/common/graph/DirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/DirectedNetworkConnections.java
@@ -62,6 +62,6 @@
 
   @Override
   public Set<E> edgesConnecting(N node) {
-    return new EdgesConnecting<E>(((BiMap<E, N>) outEdgeMap).inverse(), node);
+    return new EdgesConnecting<>(((BiMap<E, N>) outEdgeMap).inverse(), node);
   }
 }
diff --git a/guava/src/com/google/common/graph/ElementOrder.java b/guava/src/com/google/common/graph/ElementOrder.java
index ea13674..b5985a2 100644
--- a/guava/src/com/google/common/graph/ElementOrder.java
+++ b/guava/src/com/google/common/graph/ElementOrder.java
@@ -80,7 +80,7 @@
 
   /** Returns an instance which specifies that no ordering is guaranteed. */
   public static <S> ElementOrder<S> unordered() {
-    return new ElementOrder<S>(Type.UNORDERED, null);
+    return new ElementOrder<>(Type.UNORDERED, null);
   }
 
   /**
@@ -120,19 +120,19 @@
    * @since 29.0
    */
   public static <S> ElementOrder<S> stable() {
-    return new ElementOrder<S>(Type.STABLE, null);
+    return new ElementOrder<>(Type.STABLE, null);
   }
 
   /** Returns an instance which specifies that insertion ordering is guaranteed. */
   public static <S> ElementOrder<S> insertion() {
-    return new ElementOrder<S>(Type.INSERTION, null);
+    return new ElementOrder<>(Type.INSERTION, null);
   }
 
   /**
    * Returns an instance which specifies that the natural ordering of the elements is guaranteed.
    */
   public static <S extends Comparable<? super S>> ElementOrder<S> natural() {
-    return new ElementOrder<S>(Type.SORTED, Ordering.<S>natural());
+    return new ElementOrder<>(Type.SORTED, Ordering.<S>natural());
   }
 
   /**
@@ -140,7 +140,7 @@
    * determined by {@code comparator}.
    */
   public static <S> ElementOrder<S> sorted(Comparator<S> comparator) {
-    return new ElementOrder<S>(Type.SORTED, checkNotNull(comparator));
+    return new ElementOrder<>(Type.SORTED, checkNotNull(comparator));
   }
 
   /** Returns the type of ordering used. */
diff --git a/guava/src/com/google/common/graph/EndpointPair.java b/guava/src/com/google/common/graph/EndpointPair.java
index 7aa3860..fe2397c 100644
--- a/guava/src/com/google/common/graph/EndpointPair.java
+++ b/guava/src/com/google/common/graph/EndpointPair.java
@@ -51,13 +51,13 @@
 
   /** Returns an {@link EndpointPair} representing the endpoints of a directed edge. */
   public static <N> EndpointPair<N> ordered(N source, N target) {
-    return new Ordered<N>(source, target);
+    return new Ordered<>(source, target);
   }
 
   /** Returns an {@link EndpointPair} representing the endpoints of an undirected edge. */
   public static <N> EndpointPair<N> unordered(N nodeU, N nodeV) {
     // Swap nodes on purpose to prevent callers from relying on the "ordering" of an unordered pair.
-    return new Unordered<N>(nodeV, nodeU);
+    return new Unordered<>(nodeV, nodeU);
   }
 
   /** Returns an {@link EndpointPair} representing the endpoints of an edge in {@code graph}. */
diff --git a/guava/src/com/google/common/graph/GraphBuilder.java b/guava/src/com/google/common/graph/GraphBuilder.java
index d57ed37..8c0871b 100644
--- a/guava/src/com/google/common/graph/GraphBuilder.java
+++ b/guava/src/com/google/common/graph/GraphBuilder.java
@@ -171,7 +171,7 @@
 
   /** Returns an empty {@link MutableGraph} with the properties of this {@link GraphBuilder}. */
   public <N1 extends N> MutableGraph<N1> build() {
-    return new StandardMutableGraph<N1>(this);
+    return new StandardMutableGraph<>(this);
   }
 
   GraphBuilder<N> copy() {
diff --git a/guava/src/com/google/common/graph/ImmutableGraph.java b/guava/src/com/google/common/graph/ImmutableGraph.java
index afad211..f829e96 100644
--- a/guava/src/com/google/common/graph/ImmutableGraph.java
+++ b/guava/src/com/google/common/graph/ImmutableGraph.java
@@ -87,7 +87,7 @@
     for (N node : graph.nodes()) {
       nodeConnections.put(node, connectionsOf(graph, node));
     }
-    return nodeConnections.build();
+    return nodeConnections.buildOrThrow();
   }
 
   @SuppressWarnings("unchecked")
diff --git a/guava/src/com/google/common/graph/ImmutableNetwork.java b/guava/src/com/google/common/graph/ImmutableNetwork.java
index cb636aa..c29f8a3 100644
--- a/guava/src/com/google/common/graph/ImmutableNetwork.java
+++ b/guava/src/com/google/common/graph/ImmutableNetwork.java
@@ -73,7 +73,7 @@
 
   @Override
   public ImmutableGraph<N> asGraph() {
-    return new ImmutableGraph<N>(super.asGraph()); // safe because the view is effectively immutable
+    return new ImmutableGraph<>(super.asGraph()); // safe because the view is effectively immutable
   }
 
   private static <N, E> Map<N, NetworkConnections<N, E>> getNodeConnections(Network<N, E> network) {
@@ -84,7 +84,7 @@
     for (N node : network.nodes()) {
       nodeConnections.put(node, connectionsOf(network, node));
     }
-    return nodeConnections.build();
+    return nodeConnections.buildOrThrow();
   }
 
   private static <N, E> Map<E, N> getEdgeToReferenceNode(Network<N, E> network) {
@@ -95,7 +95,7 @@
     for (E edge : network.edges()) {
       edgeToReferenceNode.put(edge, network.incidentNodes(edge).nodeU());
     }
-    return edgeToReferenceNode.build();
+    return edgeToReferenceNode.buildOrThrow();
   }
 
   private static <N, E> NetworkConnections<N, E> connectionsOf(Network<N, E> network, N node) {
@@ -115,31 +115,16 @@
     }
   }
 
-  private static <N, E> Function<E, N> sourceNodeFn(final Network<N, E> network) {
-    return new Function<E, N>() {
-      @Override
-      public N apply(E edge) {
-        return network.incidentNodes(edge).source();
-      }
-    };
+  private static <N, E> Function<E, N> sourceNodeFn(Network<N, E> network) {
+    return (E edge) -> network.incidentNodes(edge).source();
   }
 
-  private static <N, E> Function<E, N> targetNodeFn(final Network<N, E> network) {
-    return new Function<E, N>() {
-      @Override
-      public N apply(E edge) {
-        return network.incidentNodes(edge).target();
-      }
-    };
+  private static <N, E> Function<E, N> targetNodeFn(Network<N, E> network) {
+    return (E edge) -> network.incidentNodes(edge).target();
   }
 
-  private static <N, E> Function<E, N> adjacentNodeFn(final Network<N, E> network, final N node) {
-    return new Function<E, N>() {
-      @Override
-      public N apply(E edge) {
-        return network.incidentNodes(edge).adjacentNode(node);
-      }
-    };
+  private static <N, E> Function<E, N> adjacentNodeFn(Network<N, E> network, N node) {
+    return (E edge) -> network.incidentNodes(edge).adjacentNode(node);
   }
 
   /**
diff --git a/guava/src/com/google/common/graph/ImmutableValueGraph.java b/guava/src/com/google/common/graph/ImmutableValueGraph.java
index a1567da..eb17067 100644
--- a/guava/src/com/google/common/graph/ImmutableValueGraph.java
+++ b/guava/src/com/google/common/graph/ImmutableValueGraph.java
@@ -75,7 +75,7 @@
 
   @Override
   public ImmutableGraph<N> asGraph() {
-    return new ImmutableGraph<N>(this); // safe because the view is effectively immutable
+    return new ImmutableGraph<>(this); // safe because the view is effectively immutable
   }
 
   private static <N, V> ImmutableMap<N, GraphConnections<N, V>> getNodeConnections(
@@ -87,19 +87,14 @@
     for (N node : graph.nodes()) {
       nodeConnections.put(node, connectionsOf(graph, node));
     }
-    return nodeConnections.build();
+    return nodeConnections.buildOrThrow();
   }
 
-  private static <N, V> GraphConnections<N, V> connectionsOf(
-      final ValueGraph<N, V> graph, final N node) {
+  private static <N, V> GraphConnections<N, V> connectionsOf(ValueGraph<N, V> graph, N node) {
     Function<N, V> successorNodeToValueFn =
-        new Function<N, V>() {
-          @Override
-          public V apply(N successorNode) {
+        (N successorNode) ->
             // requireNonNull is safe because the endpoint pair comes from the graph.
-            return requireNonNull(graph.edgeValueOrDefault(node, successorNode, null));
-          }
-        };
+            requireNonNull(graph.edgeValueOrDefault(node, successorNode, null));
     return graph.isDirected()
         ? DirectedGraphConnections.ofImmutable(
             node, graph.incidentEdges(node), successorNodeToValueFn)
diff --git a/guava/src/com/google/common/graph/MapIteratorCache.java b/guava/src/com/google/common/graph/MapIteratorCache.java
index aae9187..05cdde8 100644
--- a/guava/src/com/google/common/graph/MapIteratorCache.java
+++ b/guava/src/com/google/common/graph/MapIteratorCache.java
@@ -108,7 +108,7 @@
     return new AbstractSet<K>() {
       @Override
       public UnmodifiableIterator<K> iterator() {
-        final Iterator<Entry<K, V>> entryIterator = backingMap.entrySet().iterator();
+        Iterator<Entry<K, V>> entryIterator = backingMap.entrySet().iterator();
 
         return new UnmodifiableIterator<K>() {
           @Override
diff --git a/guava/src/com/google/common/graph/MultiEdgesConnecting.java b/guava/src/com/google/common/graph/MultiEdgesConnecting.java
index 8a4250e..620f986 100644
--- a/guava/src/com/google/common/graph/MultiEdgesConnecting.java
+++ b/guava/src/com/google/common/graph/MultiEdgesConnecting.java
@@ -48,7 +48,7 @@
 
   @Override
   public UnmodifiableIterator<E> iterator() {
-    final Iterator<? extends Entry<E, ?>> entries = outEdgeToNode.entrySet().iterator();
+    Iterator<? extends Entry<E, ?>> entries = outEdgeToNode.entrySet().iterator();
     return new AbstractIterator<E>() {
       @Override
       @CheckForNull
diff --git a/guava/src/com/google/common/graph/ParametricNullness.java b/guava/src/com/google/common/graph/ParametricNullness.java
index 62534eb..87ff930 100644
--- a/guava/src/com/google/common/graph/ParametricNullness.java
+++ b/guava/src/com/google/common/graph/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/graph/StandardValueGraph.java b/guava/src/com/google/common/graph/StandardValueGraph.java
index f2c71bc..ab3ae58 100644
--- a/guava/src/com/google/common/graph/StandardValueGraph.java
+++ b/guava/src/com/google/common/graph/StandardValueGraph.java
@@ -118,7 +118,7 @@
 
   @Override
   public Set<EndpointPair<N>> incidentEdges(N node) {
-    final GraphConnections<N, V> connections = checkedConnections(node);
+    GraphConnections<N, V> connections = checkedConnections(node);
 
     return new IncidentEdgeSet<N>(this, node) {
       @Override
diff --git a/guava/src/com/google/common/graph/Traverser.java b/guava/src/com/google/common/graph/Traverser.java
index 5a36f9f..fb594b4 100644
--- a/guava/src/com/google/common/graph/Traverser.java
+++ b/guava/src/com/google/common/graph/Traverser.java
@@ -96,7 +96,7 @@
    *
    * @param graph {@link SuccessorsFunction} representing a general graph that may have cycles.
    */
-  public static <N> Traverser<N> forGraph(final SuccessorsFunction<N> graph) {
+  public static <N> Traverser<N> forGraph(SuccessorsFunction<N> graph) {
     return new Traverser<N>(graph) {
       @Override
       Traversal<N> newTraversal() {
@@ -178,7 +178,7 @@
    * @param tree {@link SuccessorsFunction} representing a directed acyclic graph that has at most
    *     one path between any two nodes
    */
-  public static <N> Traverser<N> forTree(final SuccessorsFunction<N> tree) {
+  public static <N> Traverser<N> forTree(SuccessorsFunction<N> tree) {
     if (tree instanceof BaseGraph) {
       checkArgument(((BaseGraph<?>) tree).isDirected(), "Undirected graphs can never be trees.");
     }
@@ -239,7 +239,7 @@
    * @since 24.1
    */
   public final Iterable<N> breadthFirst(Iterable<? extends N> startNodes) {
-    final ImmutableSet<N> validated = validate(startNodes);
+    ImmutableSet<N> validated = validate(startNodes);
     return new Iterable<N>() {
       @Override
       public Iterator<N> iterator() {
@@ -294,7 +294,7 @@
    * @since 24.1
    */
   public final Iterable<N> depthFirstPreOrder(Iterable<? extends N> startNodes) {
-    final ImmutableSet<N> validated = validate(startNodes);
+    ImmutableSet<N> validated = validate(startNodes);
     return new Iterable<N>() {
       @Override
       public Iterator<N> iterator() {
@@ -349,7 +349,7 @@
    * @since 24.1
    */
   public final Iterable<N> depthFirstPostOrder(Iterable<? extends N> startNodes) {
-    final ImmutableSet<N> validated = validate(startNodes);
+    ImmutableSet<N> validated = validate(startNodes);
     return new Iterable<N>() {
       @Override
       public Iterator<N> iterator() {
@@ -382,7 +382,7 @@
     }
 
     static <N> Traversal<N> inGraph(SuccessorsFunction<N> graph) {
-      final Set<N> visited = new HashSet<>();
+      Set<N> visited = new HashSet<>();
       return new Traversal<N>(graph) {
         @Override
         @CheckForNull
@@ -438,8 +438,8 @@
      * determined by the {@code InsertionOrder} parameter: nieces are placed at the FRONT before
      * aunts for pre-order; while in BFS they are placed at the BACK after aunts.
      */
-    private Iterator<N> topDown(Iterator<? extends N> startNodes, final InsertionOrder order) {
-      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+    private Iterator<N> topDown(Iterator<? extends N> startNodes, InsertionOrder order) {
+      Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
@@ -463,8 +463,8 @@
     }
 
     final Iterator<N> postOrder(Iterator<? extends N> startNodes) {
-      final Deque<N> ancestorStack = new ArrayDeque<>();
-      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+      Deque<N> ancestorStack = new ArrayDeque<>();
+      Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
diff --git a/guava/src/com/google/common/graph/UndirectedGraphConnections.java b/guava/src/com/google/common/graph/UndirectedGraphConnections.java
index 085e3a7..4eeb232 100644
--- a/guava/src/com/google/common/graph/UndirectedGraphConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedGraphConnections.java
@@ -20,7 +20,6 @@
 import static com.google.common.graph.GraphConstants.INNER_CAPACITY;
 import static com.google.common.graph.GraphConstants.INNER_LOAD_FACTOR;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterators;
 import java.util.Collections;
@@ -79,15 +78,10 @@
   }
 
   @Override
-  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(N thisNode) {
     return Iterators.transform(
         adjacentNodeValues.keySet().iterator(),
-        new Function<N, EndpointPair<N>>() {
-          @Override
-          public EndpointPair<N> apply(N incidentNode) {
-            return EndpointPair.unordered(thisNode, incidentNode);
-          }
-        });
+        (N incidentNode) -> EndpointPair.unordered(thisNode, incidentNode));
   }
 
   @Override
diff --git a/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java b/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
index a5c45ca..6caac3b 100644
--- a/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
@@ -73,7 +73,7 @@
   }
 
   @Override
-  public Set<E> edgesConnecting(final N node) {
+  public Set<E> edgesConnecting(N node) {
     return new MultiEdgesConnecting<E>(incidentEdgeMap, node) {
       @Override
       public int size() {
diff --git a/guava/src/com/google/common/graph/UndirectedNetworkConnections.java b/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
index 38cb763..190897f 100644
--- a/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
@@ -54,6 +54,6 @@
 
   @Override
   public Set<E> edgesConnecting(N node) {
-    return new EdgesConnecting<E>(((BiMap<E, N>) incidentEdgeMap).inverse(), node);
+    return new EdgesConnecting<>(((BiMap<E, N>) incidentEdgeMap).inverse(), node);
   }
 }
diff --git a/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
index 4b69bb7..820fe96 100644
--- a/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
+++ b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
@@ -70,7 +70,7 @@
     return fromHashers(hashers);
   }
 
-  private Hasher fromHashers(final Hasher[] hashers) {
+  private Hasher fromHashers(Hasher[] hashers) {
     return new Hasher() {
       @Override
       public Hasher putByte(byte b) {
diff --git a/guava/src/com/google/common/hash/BloomFilter.java b/guava/src/com/google/common/hash/BloomFilter.java
index e0affaa..889ab50 100644
--- a/guava/src/com/google/common/hash/BloomFilter.java
+++ b/guava/src/com/google/common/hash/BloomFilter.java
@@ -23,6 +23,7 @@
 import com.google.common.base.Predicate;
 import com.google.common.hash.BloomFilterStrategies.LockFreeBitArray;
 import com.google.common.math.DoubleMath;
+import com.google.common.math.LongMath;
 import com.google.common.primitives.SignedBytes;
 import com.google.common.primitives.UnsignedBytes;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -607,11 +608,13 @@
       dataLength = din.readInt();
 
       Strategy strategy = BloomFilterStrategies.values()[strategyOrdinal];
-      long[] data = new long[dataLength];
-      for (int i = 0; i < data.length; i++) {
-        data[i] = din.readLong();
+
+      LockFreeBitArray dataArray = new LockFreeBitArray(LongMath.checkedMultiply(dataLength, 64L));
+      for (int i = 0; i < dataLength; i++) {
+        dataArray.putData(i, din.readLong());
       }
-      return new BloomFilter<T>(new LockFreeBitArray(data), numHashFunctions, funnel, strategy);
+
+      return new BloomFilter<T>(dataArray, numHashFunctions, funnel, strategy);
     } catch (RuntimeException e) {
       String message =
           "Unable to deserialize BloomFilter from InputStream."
diff --git a/guava/src/com/google/common/hash/BloomFilterStrategies.java b/guava/src/com/google/common/hash/BloomFilterStrategies.java
index 3a012f3..876269e 100644
--- a/guava/src/com/google/common/hash/BloomFilterStrategies.java
+++ b/guava/src/com/google/common/hash/BloomFilterStrategies.java
@@ -263,27 +263,38 @@
           data.length(),
           other.data.length());
       for (int i = 0; i < data.length(); i++) {
-        long otherLong = other.data.get(i);
-
-        long ourLongOld;
-        long ourLongNew;
-        boolean changedAnyBits = true;
-        do {
-          ourLongOld = data.get(i);
-          ourLongNew = ourLongOld | otherLong;
-          if (ourLongOld == ourLongNew) {
-            changedAnyBits = false;
-            break;
-          }
-        } while (!data.compareAndSet(i, ourLongOld, ourLongNew));
-
-        if (changedAnyBits) {
-          int bitsAdded = Long.bitCount(ourLongNew) - Long.bitCount(ourLongOld);
-          bitCount.add(bitsAdded);
-        }
+        putData(i, other.data.get(i));
       }
     }
 
+    /**
+     * ORs the bits encoded in the {@code i}th {@code long} in the underlying {@link
+     * AtomicLongArray} with the given value.
+     */
+    void putData(int i, long longValue) {
+      long ourLongOld;
+      long ourLongNew;
+      boolean changedAnyBits = true;
+      do {
+        ourLongOld = data.get(i);
+        ourLongNew = ourLongOld | longValue;
+        if (ourLongOld == ourLongNew) {
+          changedAnyBits = false;
+          break;
+        }
+      } while (!data.compareAndSet(i, ourLongOld, ourLongNew));
+
+      if (changedAnyBits) {
+        int bitsAdded = Long.bitCount(ourLongNew) - Long.bitCount(ourLongOld);
+        bitCount.add(bitsAdded);
+      }
+    }
+
+    /** Returns the number of {@code long}s in the underlying {@link AtomicLongArray}. */
+    int dataLength() {
+      return data.length();
+    }
+
     @Override
     public boolean equals(@CheckForNull Object o) {
       if (o instanceof LockFreeBitArray) {
diff --git a/guava/src/com/google/common/hash/FarmHashFingerprint64.java b/guava/src/com/google/common/hash/FarmHashFingerprint64.java
index 7d6a398..3437b00 100644
--- a/guava/src/com/google/common/hash/FarmHashFingerprint64.java
+++ b/guava/src/com/google/common/hash/FarmHashFingerprint64.java
@@ -170,7 +170,7 @@
    * Compute an 8-byte hash of a byte array of length greater than 64 bytes.
    */
   private static long hashLength65Plus(byte[] bytes, int offset, int length) {
-    final int seed = 81;
+    int seed = 81;
     // For strings over 64 bytes we loop. Internal state consists of 56 bytes: v, w, x, y, and z.
     long x = seed;
     @SuppressWarnings("ConstantOverflow")
diff --git a/guava/src/com/google/common/hash/Fingerprint2011.java b/guava/src/com/google/common/hash/Fingerprint2011.java
new file mode 100644
index 0000000..1b01e00
--- /dev/null
+++ b/guava/src/com/google/common/hash/Fingerprint2011.java
@@ -0,0 +1,198 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package com.google.common.hash;
+
+import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static com.google.common.hash.LittleEndianByteArray.load64;
+import static com.google.common.hash.LittleEndianByteArray.load64Safely;
+import static java.lang.Long.rotateRight;
+
+import com.google.common.annotations.VisibleForTesting;
+
+/**
+ * Implementation of Geoff Pike's fingerprint2011 hash function. See {@link Hashing#fingerprint2011}
+ * for information on the behaviour of the algorithm.
+ *
+ * <p>On Intel Core2 2.66, on 1000 bytes, fingerprint2011 takes 0.9 microseconds compared to
+ * fingerprint at 4.0 microseconds and md5 at 4.5 microseconds.
+ *
+ * <p>Note to maintainers: This implementation relies on signed arithmetic being bit-wise equivalent
+ * to unsigned arithmetic in all cases except:
+ *
+ * <ul>
+ *   <li>comparisons (signed values can be negative)
+ *   <li>division (avoided here)
+ *   <li>shifting (right shift must be unsigned)
+ * </ul>
+ *
+ * @author kylemaddison@google.com (Kyle Maddison)
+ * @author gpike@google.com (Geoff Pike)
+ */
+@ElementTypesAreNonnullByDefault
+final class Fingerprint2011 extends AbstractNonStreamingHashFunction {
+  static final HashFunction FINGERPRINT_2011 = new Fingerprint2011();
+
+  // Some primes between 2^63 and 2^64 for various uses.
+  private static final long K0 = 0xa5b85c5e198ed849L;
+  private static final long K1 = 0x8d58ac26afe12e47L;
+  private static final long K2 = 0xc47b6e9e3a970ed3L;
+  private static final long K3 = 0xc6a4a7935bd1e995L;
+
+  @Override
+  public HashCode hashBytes(byte[] input, int off, int len) {
+    checkPositionIndexes(off, off + len, input.length);
+    return HashCode.fromLong(fingerprint(input, off, len));
+  }
+
+  @Override
+  public int bits() {
+    return 64;
+  }
+
+  @Override
+  public String toString() {
+    return "Hashing.fingerprint2011()";
+  }
+
+  // End of public functions.
+
+  @VisibleForTesting
+  static long fingerprint(byte[] bytes, int offset, int length) {
+    long result;
+
+    if (length <= 32) {
+      result = murmurHash64WithSeed(bytes, offset, length, K0 ^ K1 ^ K2);
+    } else if (length <= 64) {
+      result = hashLength33To64(bytes, offset, length);
+    } else {
+      result = fullFingerprint(bytes, offset, length);
+    }
+
+    long u = length >= 8 ? load64(bytes, offset) : K0;
+    long v = length >= 9 ? load64(bytes, offset + length - 8) : K0;
+    result = hash128to64(result + v, u);
+    return result == 0 || result == 1 ? result + ~1 : result;
+  }
+
+  private static long shiftMix(long val) {
+    return val ^ (val >>> 47);
+  }
+
+  /** Implementation of Hash128to64 from util/hash/hash128to64.h */
+  @VisibleForTesting
+  static long hash128to64(long high, long low) {
+    long a = (low ^ high) * K3;
+    a ^= (a >>> 47);
+    long b = (high ^ a) * K3;
+    b ^= (b >>> 47);
+    b *= K3;
+    return b;
+  }
+
+  /**
+   * Computes intermediate hash of 32 bytes of byte array from the given offset. Results are
+   * returned in the output array - this is 12% faster than allocating new arrays every time.
+   */
+  private static void weakHashLength32WithSeeds(
+      byte[] bytes, int offset, long seedA, long seedB, long[] output) {
+    long part1 = load64(bytes, offset);
+    long part2 = load64(bytes, offset + 8);
+    long part3 = load64(bytes, offset + 16);
+    long part4 = load64(bytes, offset + 24);
+
+    seedA += part1;
+    seedB = rotateRight(seedB + seedA + part4, 51);
+    long c = seedA;
+    seedA += part2;
+    seedA += part3;
+    seedB += rotateRight(seedA, 23);
+    output[0] = seedA + part4;
+    output[1] = seedB + c;
+  }
+
+  /*
+   * Compute an 8-byte hash of a byte array of length greater than 64 bytes.
+   */
+  private static long fullFingerprint(byte[] bytes, int offset, int length) {
+    // For lengths over 64 bytes we hash the end first, and then as we
+    // loop we keep 56 bytes of state: v, w, x, y, and z.
+    long x = load64(bytes, offset);
+    long y = load64(bytes, offset + length - 16) ^ K1;
+    long z = load64(bytes, offset + length - 56) ^ K0;
+    long[] v = new long[2];
+    long[] w = new long[2];
+    weakHashLength32WithSeeds(bytes, offset + length - 64, length, y, v);
+    weakHashLength32WithSeeds(bytes, offset + length - 32, length * K1, K0, w);
+    z += shiftMix(v[1]) * K1;
+    x = rotateRight(z + x, 39) * K1;
+    y = rotateRight(y, 33) * K1;
+
+    // Decrease length to the nearest multiple of 64, and operate on 64-byte chunks.
+    length = (length - 1) & ~63;
+    do {
+      x = rotateRight(x + y + v[0] + load64(bytes, offset + 16), 37) * K1;
+      y = rotateRight(y + v[1] + load64(bytes, offset + 48), 42) * K1;
+      x ^= w[1];
+      y ^= v[0];
+      z = rotateRight(z ^ w[0], 33);
+      weakHashLength32WithSeeds(bytes, offset, v[1] * K1, x + w[0], v);
+      weakHashLength32WithSeeds(bytes, offset + 32, z + w[1], y, w);
+      long tmp = z;
+      z = x;
+      x = tmp;
+      offset += 64;
+      length -= 64;
+    } while (length != 0);
+    return hash128to64(hash128to64(v[0], w[0]) + shiftMix(y) * K1 + z, hash128to64(v[1], w[1]) + x);
+  }
+
+  private static long hashLength33To64(byte[] bytes, int offset, int length) {
+    long z = load64(bytes, offset + 24);
+    long a = load64(bytes, offset) + (length + load64(bytes, offset + length - 16)) * K0;
+    long b = rotateRight(a + z, 52);
+    long c = rotateRight(a, 37);
+    a += load64(bytes, offset + 8);
+    c += rotateRight(a, 7);
+    a += load64(bytes, offset + 16);
+    long vf = a + z;
+    long vs = b + rotateRight(a, 31) + c;
+    a = load64(bytes, offset + 16) + load64(bytes, offset + length - 32);
+    z = load64(bytes, offset + length - 8);
+    b = rotateRight(a + z, 52);
+    c = rotateRight(a, 37);
+    a += load64(bytes, offset + length - 24);
+    c += rotateRight(a, 7);
+    a += load64(bytes, offset + length - 16);
+    long wf = a + z;
+    long ws = b + rotateRight(a, 31) + c;
+    long r = shiftMix((vf + ws) * K2 + (wf + vs) * K0);
+    return shiftMix(r * K0 + vs) * K2;
+  }
+
+  @VisibleForTesting
+  static long murmurHash64WithSeed(byte[] bytes, int offset, int length, long seed) {
+    long mul = K3;
+    int topBit = 0x7;
+
+    int lengthAligned = length & ~topBit;
+    int lengthRemainder = length & topBit;
+    long hash = seed ^ (length * mul);
+
+    for (int i = 0; i < lengthAligned; i += 8) {
+      long loaded = load64(bytes, offset + i);
+      long data = shiftMix(loaded * mul) * mul;
+      hash ^= data;
+      hash *= mul;
+    }
+
+    if (lengthRemainder != 0) {
+      long data = load64Safely(bytes, offset + lengthAligned, lengthRemainder);
+      hash ^= data;
+      hash *= mul;
+    }
+
+    hash = shiftMix(hash) * mul;
+    hash = shiftMix(hash);
+    return hash;
+  }
+}
diff --git a/guava/src/com/google/common/hash/Funnels.java b/guava/src/com/google/common/hash/Funnels.java
index 6673836..b8e63d5 100644
--- a/guava/src/com/google/common/hash/Funnels.java
+++ b/guava/src/com/google/common/hash/Funnels.java
@@ -168,7 +168,7 @@
    */
   public static <E extends @Nullable Object> Funnel<Iterable<? extends E>> sequentialFunnel(
       Funnel<E> elementFunnel) {
-    return new SequentialFunnel<E>(elementFunnel);
+    return new SequentialFunnel<>(elementFunnel);
   }
 
   private static class SequentialFunnel<E extends @Nullable Object>
diff --git a/guava/src/com/google/common/hash/Hashing.java b/guava/src/com/google/common/hash/Hashing.java
index dd65367..afff20c 100644
--- a/guava/src/com/google/common/hash/Hashing.java
+++ b/guava/src/com/google/common/hash/Hashing.java
@@ -17,11 +17,11 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.Immutable;
 import java.security.Key;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.zip.Adler32;
@@ -42,7 +42,6 @@
  * @author Kurt Alfred Kluever
  * @since 11.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class Hashing {
   /**
@@ -470,6 +469,30 @@
   }
 
   /**
+   * Returns a hash function implementing the Fingerprint2011 hashing function (64 hash bits).
+   *
+   * <p>This is designed for generating persistent fingerprints of strings. It isn't
+   * cryptographically secure, but it produces a high-quality hash with few collisions. Fingerprints
+   * generated using this are byte-wise identical to those created using the C++ version, but note
+   * that this uses unsigned integers (see {@link com.google.common.primitives.UnsignedInts}).
+   * Comparisons between the two should take this into account.
+   *
+   * <p>Fingerprint2011() is a form of Murmur2 on strings up to 32 bytes and a form of CityHash for
+   * longer strings. It could have been one or the other throughout. The main advantage of the
+   * combination is that CityHash has a bunch of special cases for short strings that don't need to
+   * be replicated here. The result will never be 0 or 1.
+   *
+   * <p>This function is best understood as a <a
+   * href="https://en.wikipedia.org/wiki/Fingerprint_(computing)">fingerprint</a> rather than a true
+   * <a href="https://en.wikipedia.org/wiki/Hash_function">hash function</a>.
+   *
+   * @since 31.1
+   */
+  public static HashFunction fingerprint2011() {
+    return Fingerprint2011.FINGERPRINT_2011;
+  }
+
+  /**
    * Assigns to {@code hashCode} a "bucket" in the range {@code [0, buckets)}, in a uniform manner
    * that minimizes the need for remapping as {@code buckets} grows. That is, {@code
    * consistentHash(h, n)} equals:
@@ -621,7 +644,7 @@
     List<HashFunction> list = new ArrayList<>();
     list.add(first);
     list.add(second);
-    list.addAll(Arrays.asList(rest));
+    Collections.addAll(list, rest);
     return new ConcatenatedHashFunction(list.toArray(new HashFunction[0]));
   }
 
@@ -642,7 +665,7 @@
     for (HashFunction hashFunction : hashFunctions) {
       list.add(hashFunction);
     }
-    checkArgument(list.size() > 0, "number of hash functions (%s) must be > 0", list.size());
+    checkArgument(!list.isEmpty(), "number of hash functions (%s) must be > 0", list.size());
     return new ConcatenatedHashFunction(list.toArray(new HashFunction[0]));
   }
 
diff --git a/guava/src/com/google/common/hash/LittleEndianByteArray.java b/guava/src/com/google/common/hash/LittleEndianByteArray.java
index 15d8b2c..6252015 100644
--- a/guava/src/com/google/common/hash/LittleEndianByteArray.java
+++ b/guava/src/com/google/common/hash/LittleEndianByteArray.java
@@ -243,7 +243,7 @@
        * which will have an efficient native implementation in JDK 9.
        *
        */
-      final String arch = System.getProperty("os.arch");
+      String arch = System.getProperty("os.arch");
       if ("amd64".equals(arch)) {
         theGetter =
             ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)
diff --git a/guava/src/com/google/common/hash/LongAddables.java b/guava/src/com/google/common/hash/LongAddables.java
index 370030d..7c371ec 100644
--- a/guava/src/com/google/common/hash/LongAddables.java
+++ b/guava/src/com/google/common/hash/LongAddables.java
@@ -29,7 +29,8 @@
   static {
     Supplier<LongAddable> supplier;
     try {
-      new LongAdder(); // trigger static initialization of the LongAdder class, which may fail
+      // trigger static initialization of the LongAdder class, which may fail
+      LongAdder unused = new LongAdder();
       supplier =
           new Supplier<LongAddable>() {
             @Override
diff --git a/guava/src/com/google/common/hash/MacHashFunction.java b/guava/src/com/google/common/hash/MacHashFunction.java
index 031b1c0..6d53a54 100644
--- a/guava/src/com/google/common/hash/MacHashFunction.java
+++ b/guava/src/com/google/common/hash/MacHashFunction.java
@@ -58,7 +58,7 @@
 
   private static boolean supportsClone(Mac mac) {
     try {
-      mac.clone();
+      Object unused = mac.clone();
       return true;
     } catch (CloneNotSupportedException e) {
       return false;
diff --git a/guava/src/com/google/common/hash/MessageDigestHashFunction.java b/guava/src/com/google/common/hash/MessageDigestHashFunction.java
index 48b47b0..43fc087 100644
--- a/guava/src/com/google/common/hash/MessageDigestHashFunction.java
+++ b/guava/src/com/google/common/hash/MessageDigestHashFunction.java
@@ -61,7 +61,7 @@
 
   private static boolean supportsClone(MessageDigest digest) {
     try {
-      digest.clone();
+      Object unused = digest.clone();
       return true;
     } catch (CloneNotSupportedException e) {
       return false;
diff --git a/guava/src/com/google/common/hash/ParametricNullness.java b/guava/src/com/google/common/hash/ParametricNullness.java
index 2ae8d42..460106c 100644
--- a/guava/src/com/google/common/hash/ParametricNullness.java
+++ b/guava/src/com/google/common/hash/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/html/ParametricNullness.java b/guava/src/com/google/common/html/ParametricNullness.java
index 9a62c35..61b4461 100644
--- a/guava/src/com/google/common/html/ParametricNullness.java
+++ b/guava/src/com/google/common/html/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/io/BaseEncoding.java b/guava/src/com/google/common/io/BaseEncoding.java
index f42857c..0d6f2e0 100644
--- a/guava/src/com/google/common/io/BaseEncoding.java
+++ b/guava/src/com/google/common/io/BaseEncoding.java
@@ -176,7 +176,7 @@
    * Returns a {@code ByteSink} that writes base-encoded bytes to the specified {@code CharSink}.
    */
   @GwtIncompatible // ByteSink,CharSink
-  public final ByteSink encodingSink(final CharSink encodedSink) {
+  public final ByteSink encodingSink(CharSink encodedSink) {
     checkNotNull(encodedSink);
     return new ByteSink() {
       @Override
@@ -247,7 +247,7 @@
    * CharSource}.
    */
   @GwtIncompatible // ByteSource,CharSource
-  public final ByteSource decodingSource(final CharSource encodedSource) {
+  public final ByteSource decodingSource(CharSource encodedSource) {
     checkNotNull(encodedSource);
     return new ByteSource() {
       @Override
@@ -588,7 +588,7 @@
 
     @GwtIncompatible // Writer,OutputStream
     @Override
-    public OutputStream encodingStream(final Writer out) {
+    public OutputStream encodingStream(Writer out) {
       checkNotNull(out);
       return new OutputStream() {
         int bitBuffer = 0;
@@ -650,7 +650,7 @@
         bitBuffer <<= 8; // Add additional zero byte in the end.
       }
       // Position of first character is length of bitBuffer minus bitsPerChar.
-      final int bitOffset = (len + 1) * 8 - alphabet.bitsPerChar;
+      int bitOffset = (len + 1) * 8 - alphabet.bitsPerChar;
       int bitsProcessed = 0;
       while (bitsProcessed < len * 8) {
         int charIndex = (int) (bitBuffer >>> (bitOffset - bitsProcessed)) & alphabet.mask;
@@ -718,7 +718,7 @@
             chunk |= alphabet.decode(chars.charAt(charIdx + charsProcessed++));
           }
         }
-        final int minOffset = alphabet.bytesPerChunk * 8 - charsProcessed * alphabet.bitsPerChar;
+        int minOffset = alphabet.bytesPerChunk * 8 - charsProcessed * alphabet.bitsPerChar;
         for (int offset = (alphabet.bytesPerChunk - 1) * 8; offset >= minOffset; offset -= 8) {
           target[bytesWritten++] = (byte) ((chunk >>> offset) & 0xFF);
         }
@@ -728,7 +728,7 @@
 
     @Override
     @GwtIncompatible // Reader,InputStream
-    public InputStream decodingStream(final Reader reader) {
+    public InputStream decodingStream(Reader reader) {
       checkNotNull(reader);
       return new InputStream() {
         int bitBuffer = 0;
@@ -992,7 +992,7 @@
   }
 
   @GwtIncompatible
-  static Reader ignoringReader(final Reader delegate, final String toIgnore) {
+  static Reader ignoringReader(Reader delegate, String toIgnore) {
     checkNotNull(delegate);
     checkNotNull(toIgnore);
     return new Reader() {
@@ -1018,7 +1018,7 @@
   }
 
   static Appendable separatingAppendable(
-      final Appendable delegate, final String separator, final int afterEveryChars) {
+      Appendable delegate, String separator, int afterEveryChars) {
     checkNotNull(delegate);
     checkNotNull(separator);
     checkArgument(afterEveryChars > 0);
@@ -1049,10 +1049,8 @@
   }
 
   @GwtIncompatible // Writer
-  static Writer separatingWriter(
-      final Writer delegate, final String separator, final int afterEveryChars) {
-    final Appendable separatingAppendable =
-        separatingAppendable(delegate, separator, afterEveryChars);
+  static Writer separatingWriter(Writer delegate, String separator, int afterEveryChars) {
+    Appendable separatingAppendable = separatingAppendable(delegate, separator, afterEveryChars);
     return new Writer() {
       @Override
       public void write(int c) throws IOException {
@@ -1103,7 +1101,7 @@
 
     @GwtIncompatible // Writer,OutputStream
     @Override
-    public OutputStream encodingStream(final Writer output) {
+    public OutputStream encodingStream(Writer output) {
       return delegate.encodingStream(separatingWriter(output, separator, afterEveryChars));
     }
 
@@ -1143,7 +1141,7 @@
 
     @Override
     @GwtIncompatible // Reader,InputStream
-    public InputStream decodingStream(final Reader reader) {
+    public InputStream decodingStream(Reader reader) {
       return delegate.decodingStream(ignoringReader(reader, separator));
     }
 
diff --git a/guava/src/com/google/common/io/ByteStreams.java b/guava/src/com/google/common/io/ByteStreams.java
index 2f1f669..99213bf 100644
--- a/guava/src/com/google/common/io/ByteStreams.java
+++ b/guava/src/com/google/common/io/ByteStreams.java
@@ -18,6 +18,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static java.lang.Math.max;
+import static java.lang.Math.min;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -170,13 +172,18 @@
    */
   private static byte[] toByteArrayInternal(InputStream in, Queue<byte[]> bufs, int totalLen)
       throws IOException {
-    // Starting with an 8k buffer, double the size of each successive buffer. Buffers are retained
-    // in a deque so that there's no copying between buffers while reading and so all of the bytes
-    // in each new allocated buffer are available for reading from the stream.
-    for (int bufSize = BUFFER_SIZE;
+    // Roughly size to match what has been read already. Some file systems, such as procfs, return 0
+    // as their length. These files are very small, so it's wasteful to allocate an 8KB buffer.
+    int initialBufferSize = min(BUFFER_SIZE, max(128, Integer.highestOneBit(totalLen) * 2));
+    // Starting with an 8k buffer, double the size of each successive buffer. Smaller buffers
+    // quadruple in size until they reach 8k, to minimize the number of small reads for longer
+    // streams. Buffers are retained in a deque so that there's no copying between buffers while
+    // reading and so all of the bytes in each new allocated buffer are available for reading from
+    // the stream.
+    for (int bufSize = initialBufferSize;
         totalLen < MAX_ARRAY_LEN;
-        bufSize = IntMath.saturatedMultiply(bufSize, 2)) {
-      byte[] buf = new byte[Math.min(bufSize, MAX_ARRAY_LEN - totalLen)];
+        bufSize = IntMath.saturatedMultiply(bufSize, bufSize < 4096 ? 4 : 2)) {
+      byte[] buf = new byte[min(bufSize, MAX_ARRAY_LEN - totalLen)];
       bufs.add(buf);
       int off = 0;
       while (off < buf.length) {
@@ -200,11 +207,18 @@
   }
 
   private static byte[] combineBuffers(Queue<byte[]> bufs, int totalLen) {
-    byte[] result = new byte[totalLen];
-    int remaining = totalLen;
+    if (bufs.isEmpty()) {
+      return new byte[0];
+    }
+    byte[] result = bufs.remove();
+    if (result.length == totalLen) {
+      return result;
+    }
+    int remaining = totalLen - result.length;
+    result = Arrays.copyOf(result, totalLen);
     while (remaining > 0) {
       byte[] buf = bufs.remove();
-      int bytesToCopy = Math.min(remaining, buf.length);
+      int bytesToCopy = min(remaining, buf.length);
       int resultOffset = totalLen - remaining;
       System.arraycopy(buf, 0, result, resultOffset, bytesToCopy);
       remaining -= bytesToCopy;
@@ -256,7 +270,7 @@
     }
 
     // the stream was longer, so read the rest normally
-    Queue<byte[]> bufs = new ArrayDeque<byte[]>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
+    Queue<byte[]> bufs = new ArrayDeque<>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
     bufs.add(bytes);
     bufs.add(new byte[] {(byte) b});
     return toByteArrayInternal(in, bufs, bytes.length + 1);
@@ -657,6 +671,7 @@
         @Override
         public void write(byte[] b, int off, int len) {
           checkNotNull(b);
+          checkPositionIndexes(off, off + len, b.length);
         }
 
         @Override
@@ -819,7 +834,7 @@
    * either the full amount has been skipped or until the end of the stream is reached, whichever
    * happens first. Returns the total number of bytes skipped.
    */
-  static long skipUpTo(InputStream in, final long n) throws IOException {
+  static long skipUpTo(InputStream in, long n) throws IOException {
     long totalSkipped = 0;
     // A buffer is allocated if skipSafely does not skip any bytes.
     byte[] buf = null;
diff --git a/guava/src/com/google/common/io/CharStreams.java b/guava/src/com/google/common/io/CharStreams.java
index c414194..d36f9a3 100644
--- a/guava/src/com/google/common/io/CharStreams.java
+++ b/guava/src/com/google/common/io/CharStreams.java
@@ -34,8 +34,6 @@
 /**
  * Provides utility methods for working with character streams.
  *
- * <p>All method parameters must be non-null unless documented otherwise.
- *
  * <p>Some of the methods in this class take arguments with a generic type of {@code Readable &
  * Closeable}. A {@link java.io.Reader} implements both of those interfaces. Similarly for {@code
  * Appendable & Closeable} and {@link java.io.Writer}.
diff --git a/guava/src/com/google/common/io/Files.java b/guava/src/com/google/common/io/Files.java
index bf6289e..ba5528f 100644
--- a/guava/src/com/google/common/io/Files.java
+++ b/guava/src/com/google/common/io/Files.java
@@ -32,6 +32,7 @@
 import com.google.common.hash.HashCode;
 import com.google.common.hash.HashFunction;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.InlineMe;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -85,7 +86,6 @@
    *     helpful predefined constants
    * @return the buffered reader
    */
-  @Beta
   public static BufferedReader newReader(File file, Charset charset) throws FileNotFoundException {
     checkNotNull(file);
     checkNotNull(charset);
@@ -104,7 +104,6 @@
    *     helpful predefined constants
    * @return the buffered writer
    */
-  @Beta
   public static BufferedWriter newWriter(File file, Charset charset) throws FileNotFoundException {
     checkNotNull(file);
     checkNotNull(charset);
@@ -235,7 +234,6 @@
    *     (2^31 - 1)
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static byte[] toByteArray(File file) throws IOException {
     return asByteSource(file).read();
   }
@@ -248,11 +246,12 @@
    *     helpful predefined constants
    * @return a string containing all the characters from the file
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(file, charset).read()}. This method is scheduled to be
-   *     removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(file, charset).read()}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(file, charset).read()",
+      imports = "com.google.common.io.Files")
   public static String toString(File file, Charset charset) throws IOException {
     return asCharSource(file, charset).read();
   }
@@ -267,7 +266,6 @@
    * @param to the destination file
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static void write(byte[] from, File to) throws IOException {
     asByteSink(to).write(from);
   }
@@ -280,11 +278,12 @@
    * @param charset the charset used to encode the output stream; see {@link StandardCharsets} for
    *     helpful predefined constants
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSink(to, charset).write(from)}. This method is scheduled to be
-   *     removed in October 2019.
+   * @deprecated Prefer {@code asCharSink(to, charset).write(from)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSink(to, charset).write(from)",
+      imports = "com.google.common.io.Files")
   public static void write(CharSequence from, File to, Charset charset) throws IOException {
     asCharSink(to, charset).write(from);
   }
@@ -299,7 +298,6 @@
    * @param to the output stream
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static void copy(File from, OutputStream to) throws IOException {
     asByteSource(from).copyTo(to);
   }
@@ -323,7 +321,6 @@
    * @throws IOException if an I/O error occurs
    * @throws IllegalArgumentException if {@code from.equals(to)}
    */
-  @Beta
   public static void copy(File from, File to) throws IOException {
     checkArgument(!from.equals(to), "Source %s and destination %s must be different", from, to);
     asByteSource(from).copyTo(asByteSink(to));
@@ -337,11 +334,12 @@
    *     helpful predefined constants
    * @param to the appendable object
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(from, charset).copyTo(to)}. This method is scheduled to
-   *     be removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(from, charset).copyTo(to)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(from, charset).copyTo(to)",
+      imports = "com.google.common.io.Files")
   public
   static void copy(File from, Charset charset, Appendable to) throws IOException {
     asCharSource(from, charset).copyTo(to);
@@ -358,8 +356,10 @@
    * @deprecated Prefer {@code asCharSink(to, charset, FileWriteMode.APPEND).write(from)}. This
    *     method is scheduled to be removed in October 2019.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSink(to, charset, FileWriteMode.APPEND).write(from)",
+      imports = {"com.google.common.io.FileWriteMode", "com.google.common.io.Files"})
   public
   static void append(CharSequence from, File to, Charset charset) throws IOException {
     asCharSink(to, charset, FileWriteMode.APPEND).write(from);
@@ -370,7 +370,6 @@
    *
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static boolean equal(File file1, File file2) throws IOException {
     checkNotNull(file1);
     checkNotNull(file2);
@@ -452,7 +451,6 @@
    * @param file the file to create or update
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   @SuppressWarnings("GoodTime") // reading system time without TimeSource
   public static void touch(File file) throws IOException {
     checkNotNull(file);
@@ -470,7 +468,6 @@
    *     directories of the specified file could not be created.
    * @since 4.0
    */
-  @Beta
   public static void createParentDirs(File file) throws IOException {
     checkNotNull(file);
     File parent = file.getCanonicalFile().getParentFile();
@@ -501,7 +498,6 @@
    * @throws IOException if an I/O error occurs
    * @throws IllegalArgumentException if {@code from.equals(to)}
    */
-  @Beta
   public static void move(File from, File to) throws IOException {
     checkNotNull(from);
     checkNotNull(to);
@@ -527,11 +523,12 @@
    *     helpful predefined constants
    * @return the first line, or null if the file is empty
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(file, charset).readFirstLine()}. This method is
-   *     scheduled to be removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(file, charset).readFirstLine()}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(file, charset).readFirstLine()",
+      imports = "com.google.common.io.Files")
   @CheckForNull
   public
   static String readFirstLine(File file, Charset charset) throws IOException {
@@ -554,7 +551,6 @@
    * @return a mutable {@link List} containing all the lines
    * @throws IOException if an I/O error occurs
    */
-  @Beta
   public static List<String> readLines(File file, Charset charset) throws IOException {
     // don't use asCharSource(file, charset).readLines() because that returns
     // an immutable list, which would change the behavior of this method
@@ -586,11 +582,12 @@
    * @param callback the {@link LineProcessor} to use to handle the lines
    * @return the output of processing the lines
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asCharSource(file, charset).readLines(callback)}. This method is
-   *     scheduled to be removed in October 2019.
+   * @deprecated Prefer {@code asCharSource(file, charset).readLines(callback)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asCharSource(file, charset).readLines(callback)",
+      imports = "com.google.common.io.Files")
   @CanIgnoreReturnValue // some processors won't return a useful result
   @ParametricNullness
   public
@@ -608,11 +605,12 @@
    * @param processor the object to which the bytes of the file are passed.
    * @return the result of the byte processor
    * @throws IOException if an I/O error occurs
-   * @deprecated Prefer {@code asByteSource(file).read(processor)}. This method is scheduled to be
-   *     removed in October 2019.
+   * @deprecated Prefer {@code asByteSource(file).read(processor)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asByteSource(file).read(processor)",
+      imports = "com.google.common.io.Files")
   @CanIgnoreReturnValue // some processors won't return a useful result
   @ParametricNullness
   public
@@ -629,11 +627,12 @@
    * @return the {@link HashCode} of all of the bytes in the file
    * @throws IOException if an I/O error occurs
    * @since 12.0
-   * @deprecated Prefer {@code asByteSource(file).hash(hashFunction)}. This method is scheduled to
-   *     be removed in October 2019.
+   * @deprecated Prefer {@code asByteSource(file).hash(hashFunction)}.
    */
-  @Beta
   @Deprecated
+  @InlineMe(
+      replacement = "Files.asByteSource(file).hash(hashFunction)",
+      imports = "com.google.common.io.Files")
   public
   static HashCode hash(File file, HashFunction hashFunction) throws IOException {
     return asByteSource(file).hash(hashFunction);
@@ -654,7 +653,6 @@
    * @see FileChannel#map(MapMode, long, long)
    * @since 2.0
    */
-  @Beta
   public static MappedByteBuffer map(File file) throws IOException {
     checkNotNull(file);
     return map(file, MapMode.READ_ONLY);
@@ -677,7 +675,6 @@
    * @see FileChannel#map(MapMode, long, long)
    * @since 2.0
    */
-  @Beta
   public static MappedByteBuffer map(File file, MapMode mode) throws IOException {
     return mapInternal(file, mode, -1);
   }
@@ -701,7 +698,6 @@
    * @see FileChannel#map(MapMode, long, long)
    * @since 2.0
    */
-  @Beta
   public static MappedByteBuffer map(File file, MapMode mode, long size) throws IOException {
     checkArgument(size >= 0, "size (%s) may not be negative", size);
     return mapInternal(file, mode, size);
@@ -745,7 +741,6 @@
    *
    * @since 11.0
    */
-  @Beta
   public static String simplifyPath(String pathname) {
     checkNotNull(pathname);
     if (pathname.length() == 0) {
@@ -806,7 +801,6 @@
    *
    * @since 11.0
    */
-  @Beta
   public static String getFileExtension(String fullName) {
     checkNotNull(fullName);
     String fileName = new File(fullName).getName();
@@ -824,7 +818,6 @@
    * @return The file name without its path or extension.
    * @since 14.0
    */
-  @Beta
   public static String getNameWithoutExtension(String file) {
     checkNotNull(file);
     String fileName = new File(file).getName();
@@ -880,7 +873,6 @@
    *
    * @since 15.0
    */
-  @Beta
   public static Predicate<File> isDirectory() {
     return FilePredicate.IS_DIRECTORY;
   }
@@ -890,7 +882,6 @@
    *
    * @since 15.0
    */
-  @Beta
   public static Predicate<File> isFile() {
     return FilePredicate.IS_FILE;
   }
diff --git a/guava/src/com/google/common/io/ParametricNullness.java b/guava/src/com/google/common/io/ParametricNullness.java
index afa0db1..98da765 100644
--- a/guava/src/com/google/common/io/ParametricNullness.java
+++ b/guava/src/com/google/common/io/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/io/Resources.java b/guava/src/com/google/common/io/Resources.java
index cc595fc..d1e3707 100644
--- a/guava/src/com/google/common/io/Resources.java
+++ b/guava/src/com/google/common/io/Resources.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Charsets;
 import com.google.common.base.MoreObjects;
@@ -36,14 +35,11 @@
  * methods use {@link URL} parameters, they are usually not appropriate for HTTP or other
  * non-classpath resources.
  *
- * <p>All method parameters must be non-null unless documented otherwise.
- *
  * @author Chris Nokleberg
  * @author Ben Yu
  * @author Colin Decker
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 @ElementTypesAreNonnullByDefault
 public final class Resources {
diff --git a/guava/src/com/google/common/math/LongMath.java b/guava/src/com/google/common/math/LongMath.java
index 1e67812..dd5ff06 100644
--- a/guava/src/com/google/common/math/LongMath.java
+++ b/guava/src/com/google/common/math/LongMath.java
@@ -425,7 +425,7 @@
         // subtracting two nonnegative longs can't overflow
         // cmpRemToHalfDivisor has the same sign as compare(abs(rem), abs(q) / 2).
         if (cmpRemToHalfDivisor == 0) { // exactly on the half mark
-          increment = (mode == HALF_UP | (mode == HALF_EVEN & (div & 1) != 0));
+          increment = (mode == HALF_UP || (mode == HALF_EVEN && (div & 1) != 0));
         } else {
           increment = cmpRemToHalfDivisor > 0; // closer to the UP value
         }
diff --git a/guava/src/com/google/common/math/ParametricNullness.java b/guava/src/com/google/common/math/ParametricNullness.java
index c079b97..8e57826 100644
--- a/guava/src/com/google/common/math/ParametricNullness.java
+++ b/guava/src/com/google/common/math/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/net/HostAndPort.java b/guava/src/com/google/common/net/HostAndPort.java
index 19e6b67..a27eb65 100644
--- a/guava/src/com/google/common/net/HostAndPort.java
+++ b/guava/src/com/google/common/net/HostAndPort.java
@@ -18,11 +18,11 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
 import javax.annotation.CheckForNull;
@@ -60,7 +60,6 @@
  * @author Paul Marks
  * @since 10.0
  */
-@Beta
 @Immutable
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
@@ -164,6 +163,7 @@
    * @return if parsing was successful, a populated HostAndPort object.
    * @throws IllegalArgumentException if nothing meaningful could be parsed.
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static HostAndPort fromString(String hostPortString) {
     checkNotNull(hostPortString);
     String host;
@@ -274,6 +274,7 @@
    * @return {@code this}, to enable chaining of calls.
    * @throws IllegalArgumentException if bracketless IPv6 is detected.
    */
+  @CanIgnoreReturnValue
   public HostAndPort requireBracketsForIPv6() {
     checkArgument(!hasBracketlessColons, "Possible bracketless IPv6 literal: %s", host);
     return this;
diff --git a/guava/src/com/google/common/net/HostSpecifier.java b/guava/src/com/google/common/net/HostSpecifier.java
index 7448944..c57f3d9 100644
--- a/guava/src/com/google/common/net/HostSpecifier.java
+++ b/guava/src/com/google/common/net/HostSpecifier.java
@@ -14,9 +14,9 @@
 
 package com.google.common.net;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.net.InetAddress;
 import java.text.ParseException;
 import javax.annotation.CheckForNull;
@@ -41,7 +41,6 @@
  * @author Craig Berry
  * @since 5.0
  */
-@Beta
 @GwtIncompatible
 @ElementTypesAreNonnullByDefault
 public final class HostSpecifier {
@@ -71,9 +70,9 @@
   public static HostSpecifier fromValid(String specifier) {
     // Verify that no port was specified, and strip optional brackets from
     // IPv6 literals.
-    final HostAndPort parsedHost = HostAndPort.fromString(specifier);
+    HostAndPort parsedHost = HostAndPort.fromString(specifier);
     Preconditions.checkArgument(!parsedHost.hasPort());
-    final String host = parsedHost.getHost();
+    String host = parsedHost.getHost();
 
     // Try to interpret the specifier as an IP address. Note we build
     // the address rather than using the .is* methods because we want to
@@ -93,7 +92,7 @@
     // It is not any kind of IP address; must be a domain name or invalid.
 
     // TODO(user): different versions of this for different factories?
-    final InternetDomainName domain = InternetDomainName.from(host);
+    InternetDomainName domain = InternetDomainName.from(host);
 
     if (domain.hasPublicSuffix()) {
       return new HostSpecifier(domain.toString());
@@ -110,6 +109,7 @@
    *
    * @throws ParseException if the specifier is not valid.
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static HostSpecifier from(String specifier) throws ParseException {
     try {
       return fromValid(specifier);
@@ -130,7 +130,7 @@
    */
   public static boolean isValid(String specifier) {
     try {
-      fromValid(specifier);
+      HostSpecifier unused = fromValid(specifier);
       return true;
     } catch (IllegalArgumentException e) {
       return false;
@@ -144,7 +144,7 @@
     }
 
     if (other instanceof HostSpecifier) {
-      final HostSpecifier that = (HostSpecifier) other;
+      HostSpecifier that = (HostSpecifier) other;
       return this.canonicalForm.equals(that.canonicalForm);
     }
 
diff --git a/guava/src/com/google/common/net/HttpHeaders.java b/guava/src/com/google/common/net/HttpHeaders.java
index f318da1..2ecbfaa 100644
--- a/guava/src/com/google/common/net/HttpHeaders.java
+++ b/guava/src/com/google/common/net/HttpHeaders.java
@@ -14,7 +14,6 @@
 
 package com.google.common.net;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 
 /**
@@ -102,7 +101,6 @@
    *
    * @since 17.0
    */
-  @Beta
   public static final String FOLLOW_ONLY_WHEN_PRERENDER_SHOWN = "Follow-Only-When-Prerender-Shown";
   /** The HTTP {@code Host} header field name. */
   public static final String HOST = "Host";
@@ -201,6 +199,14 @@
   public static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
   /** The HTTP {@code Access-Control-Allow-Origin} header field name. */
   public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
+  /**
+   * The HTTP <a href="https://wicg.github.io/private-network-access/#headers">{@code
+   * Access-Control-Allow-Private-Network}</a> header field name.
+   *
+   * @since 31.1
+   */
+  public static final String ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK =
+      "Access-Control-Allow-Private-Network";
   /** The HTTP {@code Access-Control-Allow-Credentials} header field name. */
   public static final String ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials";
   /** The HTTP {@code Access-Control-Expose-Headers} header field name. */
@@ -357,7 +363,7 @@
    *
    * @since 27.1
    */
-  @Beta public static final String SOURCE_MAP = "SourceMap";
+  public static final String SOURCE_MAP = "SourceMap";
 
   /**
    * The HTTP <a href="http://tools.ietf.org/html/rfc6797#section-6.1">{@code
@@ -455,14 +461,14 @@
    *
    * @since 15.0
    */
-  @Beta public static final String PUBLIC_KEY_PINS = "Public-Key-Pins";
+  public static final String PUBLIC_KEY_PINS = "Public-Key-Pins";
   /**
    * The HTTP <a href="http://tools.ietf.org/html/draft-evans-palmer-key-pinning">{@code
    * Public-Key-Pins-Report-Only}</a> header field name.
    *
    * @since 15.0
    */
-  @Beta public static final String PUBLIC_KEY_PINS_REPORT_ONLY = "Public-Key-Pins-Report-Only";
+  public static final String PUBLIC_KEY_PINS_REPORT_ONLY = "Public-Key-Pins-Report-Only";
   /**
    * The HTTP {@code X-Request-ID} header field name.
    *
@@ -482,7 +488,7 @@
    *
    * @since 24.1
    */
-  @Beta public static final String X_DOWNLOAD_OPTIONS = "X-Download-Options";
+  public static final String X_DOWNLOAD_OPTIONS = "X-Download-Options";
   /** The HTTP {@code X-XSS-Protection} header field name. */
   public static final String X_XSS_PROTECTION = "X-XSS-Protection";
   /**
@@ -665,9 +671,17 @@
    * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-full-version">{@code
    * Sec-CH-UA-Full-Version}</a> header field name.
    *
+   * @deprecated Prefer {@link SEC_CH_UA_FULL_VERSION_LIST}.
    * @since 30.0
    */
-  public static final String SEC_CH_UA_FULL_VERSION = "Sec-CH-UA-Full-Version";
+  @Deprecated public static final String SEC_CH_UA_FULL_VERSION = "Sec-CH-UA-Full-Version";
+  /**
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-full-version-list">{@code
+   * Sec-CH-UA-Full-Version}</a> header field name.
+   *
+   * @since 31.1
+   */
+  public static final String SEC_CH_UA_FULL_VERSION_LIST = "Sec-CH-UA-Full-Version-List";
   /**
    * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-mobile">{@code
    * Sec-CH-UA-Mobile}</a> header field name.
diff --git a/guava/src/com/google/common/net/InetAddresses.java b/guava/src/com/google/common/net/InetAddresses.java
index 4e2aa69..d3e68db 100644
--- a/guava/src/com/google/common/net/InetAddresses.java
+++ b/guava/src/com/google/common/net/InetAddresses.java
@@ -17,13 +17,13 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.MoreObjects;
 import com.google.common.hash.Hashing;
 import com.google.common.io.ByteStreams;
 import com.google.common.primitives.Ints;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
@@ -95,7 +95,6 @@
  * @author Erik Kline
  * @since 5.0
  */
-@Beta
 @GwtIncompatible
 @ElementTypesAreNonnullByDefault
 public final class InetAddresses {
@@ -144,6 +143,7 @@
    * @return {@link InetAddress} representing the argument
    * @throws IllegalArgumentException if the argument is not a valid IP string literal
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static InetAddress forString(String ipString) {
     byte[] addr = ipStringToBytes(ipString);
 
@@ -667,7 +667,6 @@
    *
    * @since 5.0
    */
-  @Beta
   public static final class TeredoInfo {
     private final Inet4Address server;
     private final Inet4Address client;
diff --git a/guava/src/com/google/common/net/InternetDomainName.java b/guava/src/com/google/common/net/InternetDomainName.java
index 5873449..d71a9d5 100644
--- a/guava/src/com/google/common/net/InternetDomainName.java
+++ b/guava/src/com/google/common/net/InternetDomainName.java
@@ -18,7 +18,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Ascii;
 import com.google.common.base.CharMatcher;
@@ -26,6 +25,7 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import com.google.thirdparty.publicsuffix.PublicSuffixPatterns;
 import com.google.thirdparty.publicsuffix.PublicSuffixType;
@@ -71,7 +71,6 @@
  * @author Catherine Berry
  * @since 5.0
  */
-@Beta
 @GwtCompatible(emulated = true)
 @Immutable
 @ElementTypesAreNonnullByDefault
@@ -163,7 +162,7 @@
    * Otherwise, it finds the first suffix of any type.
    */
   private int findSuffixOfType(Optional<PublicSuffixType> desiredType) {
-    final int partsSize = parts.size();
+    int partsSize = parts.size();
 
     for (int i = 0; i < partsSize; i++) {
       String ancestorName = DOT_JOINER.join(parts.subList(i, partsSize));
@@ -206,6 +205,7 @@
    *     {@link #isValid}
    * @since 10.0 (previously named {@code fromLenient})
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static InternetDomainName from(String domain) {
     return new InternetDomainName(checkNotNull(domain));
   }
@@ -217,7 +217,7 @@
    * @return Is the domain name syntactically valid?
    */
   private static boolean validateSyntax(List<String> parts) {
-    final int lastIndex = parts.size() - 1;
+    int lastIndex = parts.size() - 1;
 
     // Validate the last part specially, as it has different syntax rules.
 
@@ -584,7 +584,7 @@
    */
   public static boolean isValid(String name) {
     try {
-      from(name);
+      InternetDomainName unused = from(name);
       return true;
     } catch (IllegalArgumentException e) {
       return false;
diff --git a/guava/src/com/google/common/net/MediaType.java b/guava/src/com/google/common/net/MediaType.java
index ca47161..a713d0b 100644
--- a/guava/src/com/google/common/net/MediaType.java
+++ b/guava/src/com/google/common/net/MediaType.java
@@ -21,11 +21,9 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Ascii;
 import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Joiner.MapJoiner;
 import com.google.common.base.MoreObjects;
@@ -37,12 +35,12 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.nio.charset.Charset;
 import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
-import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
 import javax.annotation.CheckForNull;
@@ -72,7 +70,6 @@
  * @since 12.0
  * @author Gregory Kick
  */
-@Beta
 @GwtCompatible
 @Immutable
 @ElementTypesAreNonnullByDefault
@@ -792,14 +789,7 @@
   }
 
   private Map<String, ImmutableMultiset<String>> parametersAsMap() {
-    return Maps.transformValues(
-        parameters.asMap(),
-        new Function<Collection<String>, ImmutableMultiset<String>>() {
-          @Override
-          public ImmutableMultiset<String> apply(Collection<String> input) {
-            return ImmutableMultiset.copyOf(input);
-          }
-        });
+    return Maps.transformValues(parameters.asMap(), ImmutableMultiset::copyOf);
   }
 
   /**
@@ -1049,6 +1039,7 @@
    *
    * @throws IllegalArgumentException if the input is not parsable
    */
+  @CanIgnoreReturnValue // TODO(b/219820829): consider removing
   public static MediaType parse(String input) {
     checkNotNull(input);
     Tokenizer tokenizer = new Tokenizer(input);
@@ -1063,7 +1054,7 @@
         tokenizer.consumeTokenIfPresent(LINEAR_WHITE_SPACE);
         String attribute = tokenizer.consumeToken(TOKEN_MATCHER);
         tokenizer.consumeCharacter('=');
-        final String value;
+        String value;
         if ('"' == tokenizer.previewChar()) {
           tokenizer.consumeCharacter('"');
           StringBuilder valueBuilder = new StringBuilder();
@@ -1096,6 +1087,7 @@
       this.input = input;
     }
 
+    @CanIgnoreReturnValue
     String consumeTokenIfPresent(CharMatcher matcher) {
       checkState(hasMore());
       int startPosition = position;
@@ -1118,6 +1110,7 @@
       return c;
     }
 
+    @CanIgnoreReturnValue
     char consumeCharacter(char c) {
       checkState(hasMore());
       checkState(previewChar() == c);
@@ -1185,14 +1178,10 @@
       Multimap<String, String> quotedParameters =
           Multimaps.transformValues(
               parameters,
-              new Function<String, String>() {
-                @Override
-                public String apply(String value) {
-                  return (TOKEN_MATCHER.matchesAllOf(value) && !value.isEmpty())
+              (String value) ->
+                  (TOKEN_MATCHER.matchesAllOf(value) && !value.isEmpty())
                       ? value
-                      : escapeAndQuote(value);
-                }
-              });
+                      : escapeAndQuote(value));
       PARAMETER_JOINER.appendTo(builder, quotedParameters.entries());
     }
     return builder.toString();
diff --git a/guava/src/com/google/common/net/ParametricNullness.java b/guava/src/com/google/common/net/ParametricNullness.java
index acc3eab..1ad2e27 100644
--- a/guava/src/com/google/common/net/ParametricNullness.java
+++ b/guava/src/com/google/common/net/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/net/PercentEscaper.java b/guava/src/com/google/common/net/PercentEscaper.java
index 7c7de9b..9290147 100644
--- a/guava/src/com/google/common/net/PercentEscaper.java
+++ b/guava/src/com/google/common/net/PercentEscaper.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.UnicodeEscaper;
 import javax.annotation.CheckForNull;
@@ -50,7 +49,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public final class PercentEscaper extends UnicodeEscaper {
diff --git a/guava/src/com/google/common/net/package-info.java b/guava/src/com/google/common/net/package-info.java
index d9db266..d55642d 100644
--- a/guava/src/com/google/common/net/package-info.java
+++ b/guava/src/com/google/common/net/package-info.java
@@ -21,7 +21,9 @@
  *
  * @author Craig Berry
  */
+@CheckReturnValue
 @ParametersAreNonnullByDefault
 package com.google.common.net;
 
+import com.google.errorprone.annotations.CheckReturnValue;
 import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/guava/src/com/google/common/primitives/ParametricNullness.java b/guava/src/com/google/common/primitives/ParametricNullness.java
index 17d606c..4289b9b 100644
--- a/guava/src/com/google/common/primitives/ParametricNullness.java
+++ b/guava/src/com/google/common/primitives/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/primitives/UnsignedBytes.java b/guava/src/com/google/common/primitives/UnsignedBytes.java
index bf9a306..db4f489 100644
--- a/guava/src/com/google/common/primitives/UnsignedBytes.java
+++ b/guava/src/com/google/common/primitives/UnsignedBytes.java
@@ -365,7 +365,7 @@
 
       @Override
       public int compare(byte[] left, byte[] right) {
-        final int stride = 8;
+        int stride = 8;
         int minLength = Math.min(left.length, right.length);
         int strideLimit = minLength & ~(stride - 1);
         int i;
diff --git a/guava/src/com/google/common/reflect/AbstractInvocationHandler.java b/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
index 4666f99..ff92195 100644
--- a/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
+++ b/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
@@ -14,7 +14,6 @@
 
 package com.google.common.reflect;
 
-import com.google.common.annotations.Beta;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
@@ -39,7 +38,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public abstract class AbstractInvocationHandler implements InvocationHandler {
 
diff --git a/guava/src/com/google/common/reflect/ClassPath.java b/guava/src/com/google/common/reflect/ClassPath.java
index de693da..d15bb50 100644
--- a/guava/src/com/google/common/reflect/ClassPath.java
+++ b/guava/src/com/google/common/reflect/ClassPath.java
@@ -20,10 +20,8 @@
 import static com.google.common.base.StandardSystemProperty.PATH_SEPARATOR;
 import static java.util.logging.Level.WARNING;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.CharMatcher;
-import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
@@ -92,7 +90,6 @@
  * @author Ben Yu
  * @since 14.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class ClassPath {
   private static final Logger logger = Logger.getLogger(ClassPath.class.getName());
@@ -167,13 +164,7 @@
   public ImmutableSet<ClassInfo> getTopLevelClasses() {
     return FluentIterable.from(resources)
         .filter(ClassInfo.class)
-        .filter(
-            new Predicate<ClassInfo>() {
-              @Override
-              public boolean apply(ClassInfo info) {
-                return info.isTopLevel();
-              }
-            })
+        .filter(ClassInfo::isTopLevel)
         .toSet();
   }
 
@@ -211,7 +202,6 @@
    *
    * @since 14.0
    */
-  @Beta
   public static class ResourceInfo {
     private final File file;
     private final String resourceName;
@@ -307,7 +297,6 @@
    *
    * @since 14.0
    */
-  @Beta
   public static final class ClassInfo extends ResourceInfo {
     private final String className;
 
diff --git a/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java b/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
index 7fad5de..6273704 100644
--- a/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
+++ b/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
@@ -14,12 +14,12 @@
 
 package com.google.common.reflect;
 
-import com.google.common.annotations.Beta;
 import com.google.common.collect.ForwardingMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotCall;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 
 /**
  * A type-to-instance map backed by an {@link ImmutableMap}. See also {@link
@@ -28,18 +28,18 @@
  * @author Ben Yu
  * @since 13.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public final class ImmutableTypeToInstanceMap<B> extends ForwardingMap<TypeToken<? extends B>, B>
     implements TypeToInstanceMap<B> {
 
   /** Returns an empty type to instance map. */
   public static <B> ImmutableTypeToInstanceMap<B> of() {
-    return new ImmutableTypeToInstanceMap<B>(ImmutableMap.<TypeToken<? extends B>, B>of());
+    return new ImmutableTypeToInstanceMap<>(ImmutableMap.<TypeToken<? extends B>, B>of());
   }
 
   /** Returns a new builder. */
   public static <B> Builder<B> builder() {
-    return new Builder<B>();
+    return new Builder<>();
   }
 
   /**
@@ -58,7 +58,6 @@
    *
    * @since 13.0
    */
-  @Beta
   public static final class Builder<B> {
     private final ImmutableMap.Builder<TypeToken<? extends B>, B> mapBuilder =
         ImmutableMap.builder();
@@ -91,7 +90,7 @@
      * @throws IllegalArgumentException if duplicate keys were added
      */
     public ImmutableTypeToInstanceMap<B> build() {
-      return new ImmutableTypeToInstanceMap<B>(mapBuilder.build());
+      return new ImmutableTypeToInstanceMap<>(mapBuilder.buildOrThrow());
     }
   }
 
@@ -102,11 +101,13 @@
   }
 
   @Override
+  @CheckForNull
   public <T extends B> T getInstance(TypeToken<T> type) {
     return trustedGet(type.rejectTypeVariables());
   }
 
   @Override
+  @CheckForNull
   public <T extends B> T getInstance(Class<T> type) {
     return trustedGet(TypeToken.of(type));
   }
@@ -121,6 +122,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public <T extends B> T putInstance(TypeToken<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -135,6 +137,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public <T extends B> T putInstance(Class<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -149,6 +152,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException();
   }
@@ -172,6 +176,7 @@
   }
 
   @SuppressWarnings("unchecked") // value could not get in if not a T
+  @CheckForNull
   private <T extends B> T trustedGet(TypeToken<T> type) {
     return (T) delegate.get(type);
   }
diff --git a/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java b/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
index 2d21dbb..9542e0a 100644
--- a/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
+++ b/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
@@ -16,8 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
 import com.google.common.collect.ForwardingMap;
 import com.google.common.collect.ForwardingMapEntry;
 import com.google.common.collect.ForwardingSet;
@@ -28,39 +26,47 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A mutable type-to-instance map. See also {@link ImmutableTypeToInstanceMap}.
  *
+ * <p>This implementation <i>does</i> support null values, despite how it is annotated; see
+ * discussion at {@link TypeToInstanceMap}.
+ *
  * @author Ben Yu
  * @since 13.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public final class MutableTypeToInstanceMap<B> extends ForwardingMap<TypeToken<? extends B>, B>
     implements TypeToInstanceMap<B> {
 
   private final Map<TypeToken<? extends B>, B> backingMap = Maps.newHashMap();
 
   @Override
-  public <T extends B> @Nullable T getInstance(Class<T> type) {
+  @CheckForNull
+  public <T extends B> T getInstance(Class<T> type) {
     return trustedGet(TypeToken.of(type));
   }
 
   @Override
-  public <T extends B> @Nullable T getInstance(TypeToken<T> type) {
+  @CheckForNull
+  public <T extends B> T getInstance(TypeToken<T> type) {
     return trustedGet(type.rejectTypeVariables());
   }
 
   @Override
   @CanIgnoreReturnValue
-  public <T extends B> @Nullable T putInstance(Class<T> type, @Nullable T value) {
+  @CheckForNull
+  public <T extends B> T putInstance(Class<T> type, T value) {
     return trustedPut(TypeToken.of(type), value);
   }
 
   @Override
   @CanIgnoreReturnValue
-  public <T extends B> @Nullable T putInstance(TypeToken<T> type, @Nullable T value) {
+  @CheckForNull
+  public <T extends B> T putInstance(TypeToken<T> type, T value) {
     return trustedPut(type.rejectTypeVariables(), value);
   }
 
@@ -74,6 +80,7 @@
   @Deprecated
   @Override
   @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException("Please use putInstance() instead.");
   }
@@ -102,12 +109,14 @@
   }
 
   @SuppressWarnings("unchecked") // value could not get in if not a T
-  private <T extends B> @Nullable T trustedPut(TypeToken<T> type, @Nullable T value) {
+  @CheckForNull
+  private <T extends B> T trustedPut(TypeToken<T> type, T value) {
     return (T) backingMap.put(type, value);
   }
 
   @SuppressWarnings("unchecked") // value could not get in if not a T
-  private <T extends B> @Nullable T trustedGet(TypeToken<T> type) {
+  @CheckForNull
+  private <T extends B> T trustedGet(TypeToken<T> type) {
     return (T) backingMap.get(type);
   }
 
@@ -115,7 +124,7 @@
 
     private final Entry<K, V> delegate;
 
-    static <K, V> Set<Entry<K, V>> transformEntries(final Set<Entry<K, V>> entries) {
+    static <K, V> Set<Entry<K, V>> transformEntries(Set<Entry<K, V>> entries) {
       return new ForwardingSet<Map.Entry<K, V>>() {
         @Override
         protected Set<Entry<K, V>> delegate() {
@@ -129,25 +138,27 @@
 
         @Override
         public Object[] toArray() {
-          return standardToArray();
+          /*
+           * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it
+           * can be used with collections that may contain null. This collection is a collection of
+           * non-null Entry objects (Entry objects that might contain null values but are not
+           * themselves null), so we can treat it as a plain `Object[]`.
+           */
+          @SuppressWarnings("nullness")
+          Object[] result = standardToArray();
+          return result;
         }
 
         @Override
-        public <T> T[] toArray(T[] array) {
+        @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+        public <T extends @Nullable Object> T[] toArray(T[] array) {
           return standardToArray(array);
         }
       };
     }
 
     private static <K, V> Iterator<Entry<K, V>> transformEntries(Iterator<Entry<K, V>> entries) {
-      return Iterators.transform(
-          entries,
-          new Function<Entry<K, V>, Entry<K, V>>() {
-            @Override
-            public Entry<K, V> apply(Entry<K, V> entry) {
-              return new UnmodifiableEntry<>(entry);
-            }
-          });
+      return Iterators.transform(entries, UnmodifiableEntry::new);
     }
 
     private UnmodifiableEntry(java.util.Map.Entry<K, V> delegate) {
diff --git a/guava/src/com/google/common/reflect/Parameter.java b/guava/src/com/google/common/reflect/Parameter.java
index 61ab85a..c3c46ec 100644
--- a/guava/src/com/google/common/reflect/Parameter.java
+++ b/guava/src/com/google/common/reflect/Parameter.java
@@ -28,6 +28,10 @@
 /**
  * Represents a method or constructor parameter.
  *
+ * <p><b>Note:</b> Since Java 8 introduced {@link java.lang.reflect.Parameter} to represent method
+ * and constructor parameters, this class is no longer necessary. We intend to deprecate it in a
+ * future version.
+ *
  * @author Ben Yu
  * @since 14.0
  */
diff --git a/guava/src/com/google/common/reflect/ParametricNullness.java b/guava/src/com/google/common/reflect/ParametricNullness.java
index 588aa5f..b6331ac 100644
--- a/guava/src/com/google/common/reflect/ParametricNullness.java
+++ b/guava/src/com/google/common/reflect/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/reflect/Reflection.java b/guava/src/com/google/common/reflect/Reflection.java
index fa35f7f..9544963 100644
--- a/guava/src/com/google/common/reflect/Reflection.java
+++ b/guava/src/com/google/common/reflect/Reflection.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
 
@@ -26,7 +25,6 @@
  *
  * @since 12.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class Reflection {
 
diff --git a/guava/src/com/google/common/reflect/TypeParameter.java b/guava/src/com/google/common/reflect/TypeParameter.java
index 9c64abb..69cd829 100644
--- a/guava/src/com/google/common/reflect/TypeParameter.java
+++ b/guava/src/com/google/common/reflect/TypeParameter.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.annotations.Beta;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import javax.annotation.CheckForNull;
@@ -34,7 +33,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 /*
  * A nullable bound would let users create a TypeParameter instance for a parameter with a nullable
diff --git a/guava/src/com/google/common/reflect/TypeResolver.java b/guava/src/com/google/common/reflect/TypeResolver.java
index fbe48c1..32517eb 100644
--- a/guava/src/com/google/common/reflect/TypeResolver.java
+++ b/guava/src/com/google/common/reflect/TypeResolver.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Arrays.asList;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableMap;
@@ -51,7 +50,6 @@
  * @author Ben Yu
  * @since 15.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class TypeResolver {
 
@@ -123,7 +121,7 @@
   }
 
   private static void populateTypeMappings(
-      final Map<TypeVariableKey, Type> mappings, final Type from, final Type to) {
+      Map<TypeVariableKey, Type> mappings, Type from, Type to) {
     if (from.equals(to)) {
       return;
     }
@@ -296,11 +294,11 @@
         checkArgument(!variable.equalsType(type), "Type variable %s bound to itself", variable);
         builder.put(variable, type);
       }
-      return new TypeTable(builder.build());
+      return new TypeTable(builder.buildOrThrow());
     }
 
-    final Type resolve(final TypeVariable<?> var) {
-      final TypeTable unguarded = this;
+    final Type resolve(TypeVariable<?> var) {
+      TypeTable unguarded = this;
       TypeTable guarded =
           new TypeTable() {
             @Override
@@ -414,7 +412,7 @@
       visit(t.getUpperBounds());
     }
 
-    private void map(final TypeVariableKey var, final Type arg) {
+    private void map(TypeVariableKey var, Type arg) {
       if (mappings.containsKey(var)) {
         // Mapping already established
         // This is possible when following both superClass -> enclosingClass
@@ -504,7 +502,7 @@
       return Types.newArtificialTypeVariable(WildcardCapturer.class, name, upperBounds);
     }
 
-    private WildcardCapturer forTypeVariable(final TypeVariable<?> typeParam) {
+    private WildcardCapturer forTypeVariable(TypeVariable<?> typeParam) {
       return new WildcardCapturer(id) {
         @Override
         TypeVariable<?> captureAsTypeVariable(Type[] upperBounds) {
diff --git a/guava/src/com/google/common/reflect/TypeToInstanceMap.java b/guava/src/com/google/common/reflect/TypeToInstanceMap.java
index 443b258..8a418df 100644
--- a/guava/src/com/google/common/reflect/TypeToInstanceMap.java
+++ b/guava/src/com/google/common/reflect/TypeToInstanceMap.java
@@ -14,11 +14,10 @@
 
 package com.google.common.reflect;
 
-import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A map, each entry of which maps a {@link TypeToken} to an instance of that type. In addition to
@@ -35,12 +34,15 @@
  * <p>Like any other {@code Map<Class, Object>}, this map may contain entries for primitive types,
  * and a primitive type and its corresponding wrapper type may map to different values.
  *
+ * <p>This class's support for {@code null} requires some explanation. For details, see {@link
+ * ClassToInstanceMap}. Its explanation applies equally well to {@code TypeToInstanceMap}.
+ *
  * @param <B> the common supertype that all entries must share; often this is simply {@link Object}
  * @author Ben Yu
  * @since 13.0
  */
-@Beta
 @DoNotMock("Use ImmutableTypeToInstanceMap or MutableTypeToInstanceMap")
+@ElementTypesAreNonnullByDefault
 public interface TypeToInstanceMap<B> extends Map<TypeToken<? extends B>, B> {
 
   /**
@@ -51,14 +53,16 @@
    * <p>{@code getInstance(Foo.class)} is equivalent to {@code
    * getInstance(TypeToken.of(Foo.class))}.
    */
-  <T extends B> @Nullable T getInstance(Class<T> type);
+  @CheckForNull
+  <T extends B> T getInstance(Class<T> type);
 
   /**
    * Returns the value the specified type is mapped to, or {@code null} if no entry for this type is
    * present. This will only return a value that was bound to this specific type, not a value that
    * may have been bound to a subtype.
    */
-  <T extends B> @Nullable T getInstance(TypeToken<T> type);
+  @CheckForNull
+  <T extends B> T getInstance(TypeToken<T> type);
 
   /**
    * Maps the specified class to the specified value. Does <i>not</i> associate this value with any
@@ -71,7 +75,8 @@
    *     null} if there was no previous entry.
    */
   @CanIgnoreReturnValue
-  <T extends B> @Nullable T putInstance(Class<T> type, @Nullable T value);
+  @CheckForNull
+  <T extends B> T putInstance(Class<T> type, T value);
 
   /**
    * Maps the specified type to the specified value. Does <i>not</i> associate this value with any
@@ -81,5 +86,6 @@
    *     if there was no previous entry.
    */
   @CanIgnoreReturnValue
-  <T extends B> @Nullable T putInstance(TypeToken<T> type, @Nullable T value);
+  @CheckForNull
+  <T extends B> T putInstance(TypeToken<T> type, T value);
 }
diff --git a/guava/src/com/google/common/reflect/TypeToken.java b/guava/src/com/google/common/reflect/TypeToken.java
index f107b70..fea1d53 100644
--- a/guava/src/com/google/common/reflect/TypeToken.java
+++ b/guava/src/com/google/common/reflect/TypeToken.java
@@ -97,7 +97,6 @@
  * @author Ben Yu
  * @since 12.0
  */
-@Beta
 @SuppressWarnings("serial") // SimpleTypeToken is the serialized form.
 @ElementTypesAreNonnullByDefault
 public abstract class TypeToken<T> extends TypeCapture<T> implements Serializable {
@@ -168,7 +167,7 @@
 
   /** Returns an instance of type token that wraps {@code type}. */
   public static <T> TypeToken<T> of(Class<T> type) {
-    return new SimpleTypeToken<T>(type);
+    return new SimpleTypeToken<>(type);
   }
 
   /** Returns an instance of type token that wraps {@code type}. */
@@ -240,7 +239,7 @@
                 ImmutableMap.of(
                     new TypeResolver.TypeVariableKey(typeParam.typeVariable), typeArg.runtimeType));
     // If there's any type error, we'd report now rather than later.
-    return new SimpleTypeToken<T>(resolver.resolveType(runtimeType));
+    return new SimpleTypeToken<>(resolver.resolveType(runtimeType));
   }
 
   /**
@@ -591,6 +590,7 @@
    *
    * @since 14.0
    */
+  @Beta
   public final Invokable<T, Object> method(Method method) {
     checkArgument(
         this.someRawTypeIsSubclassOf(method.getDeclaringClass()),
@@ -630,6 +630,7 @@
    *
    * @since 14.0
    */
+  @Beta
   public final Invokable<T, T> constructor(Constructor<?> constructor) {
     checkArgument(
         constructor.getDeclaringClass() == getRawType(),
@@ -746,15 +747,7 @@
       @SuppressWarnings({"unchecked", "rawtypes"})
       ImmutableList<Class<? super T>> collectedTypes =
           (ImmutableList) TypeCollector.FOR_RAW_TYPE.collectTypes(getRawTypes());
-      return FluentIterable.from(collectedTypes)
-          .filter(
-              new Predicate<Class<?>>() {
-                @Override
-                public boolean apply(Class<?> type) {
-                  return type.isInterface();
-                }
-              })
-          .toSet();
+      return FluentIterable.from(collectedTypes).filter(Class::isInterface).toSet();
     }
 
     @Override
@@ -1103,7 +1096,7 @@
   }
 
   private ImmutableSet<Class<? super T>> getRawTypes() {
-    final ImmutableSet.Builder<Class<?>> builder = ImmutableSet.builder();
+    ImmutableSet.Builder<Class<?>> builder = ImmutableSet.builder();
     new TypeVisitor() {
       @Override
       void visitTypeVariable(TypeVariable<?> t) {
@@ -1428,7 +1421,7 @@
     }
 
     private static <K, V> ImmutableList<K> sortKeysByValue(
-        final Map<K, V> map, final Comparator<? super V> valueComparator) {
+        Map<K, V> map, Comparator<? super V> valueComparator) {
       Ordering<K> keyOrdering =
           new Ordering<K>() {
             @Override
diff --git a/guava/src/com/google/common/reflect/Types.java b/guava/src/com/google/common/reflect/Types.java
index 0dc327d..e69b42a 100644
--- a/guava/src/com/google/common/reflect/Types.java
+++ b/guava/src/com/google/common/reflect/Types.java
@@ -20,7 +20,6 @@
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.base.Predicates;
@@ -57,14 +56,6 @@
 final class Types {
 
   /** Class#toString without the "class " and "interface " prefixes */
-  private static final Function<Type, String> TYPE_NAME =
-      new Function<Type, String>() {
-        @Override
-        public String apply(Type from) {
-          return JavaVersion.CURRENT.typeName(from);
-        }
-      };
-
   private static final Joiner COMMA_JOINER = Joiner.on(", ").useForNull("null");
 
   /** Returns the array type of {@code componentType}. */
@@ -180,7 +171,7 @@
   @CheckForNull
   static Type getComponentType(Type type) {
     checkNotNull(type);
-    final AtomicReference<@Nullable Type> result = new AtomicReference<>();
+    AtomicReference<@Nullable Type> result = new AtomicReference<>();
     new TypeVisitor() {
       @Override
       void visitTypeVariable(TypeVariable<?> t) {
@@ -303,7 +294,7 @@
       return builder
           .append(rawType.getName())
           .append('<')
-          .append(COMMA_JOINER.join(transform(argumentsList, TYPE_NAME)))
+          .append(COMMA_JOINER.join(transform(argumentsList, JavaVersion.CURRENT::typeName)))
           .append('>')
           .toString();
     }
@@ -331,8 +322,7 @@
 
   private static <D extends GenericDeclaration> TypeVariable<D> newTypeVariableImpl(
       D genericDeclaration, String name, Type[] bounds) {
-    TypeVariableImpl<D> typeVariableImpl =
-        new TypeVariableImpl<D>(genericDeclaration, name, bounds);
+    TypeVariableImpl<D> typeVariableImpl = new TypeVariableImpl<>(genericDeclaration, name, bounds);
     @SuppressWarnings("unchecked")
     TypeVariable<D> typeVariable =
         Reflection.newProxy(
@@ -382,7 +372,7 @@
           builder.put(method.getName(), method);
         }
       }
-      typeVariableMethods = builder.build();
+      typeVariableMethods = builder.buildKeepingLast();
     }
 
     private final TypeVariableImpl<?> typeVariableImpl;
diff --git a/guava/src/com/google/common/util/concurrent/AbstractFuture.java b/guava/src/com/google/common/util/concurrent/AbstractFuture.java
index e61c6ff..fc408a9 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractFuture.java
@@ -78,7 +78,7 @@
     implements ListenableFuture<V> {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
-  private static final boolean GENERATE_CANCELLATION_CAUSES;
+  static final boolean GENERATE_CANCELLATION_CAUSES;
 
   static {
     // System.getProperty may throw if the security policy does not permit access.
@@ -1084,7 +1084,6 @@
    * method returns @Nullable, too. However, we're not sure if we want to make any changes to that
    * class, since it's in a separate artifact that we planned to release only a single version of.
    */
-  @SuppressWarnings("nullness")
   @CheckForNull
   protected final Throwable tryInternalFastPathGetFailure() {
     if (this instanceof Trusted) {
@@ -1108,10 +1107,7 @@
 
   /** Releases all threads in the {@link #waiters} list, and clears the list. */
   private void releaseWaiters() {
-    Waiter head;
-    do {
-      head = waiters;
-    } while (!ATOMIC_HELPER.casWaiters(this, head, Waiter.TOMBSTONE));
+    Waiter head = ATOMIC_HELPER.gasWaiters(this, Waiter.TOMBSTONE);
     for (Waiter currentWaiter = head; currentWaiter != null; currentWaiter = currentWaiter.next) {
       currentWaiter.unpark();
     }
@@ -1129,10 +1125,7 @@
     // 2. reverse the linked list, because despite our rather clear contract, people depend on us
     //    executing listeners in the order they were added
     // 3. push all the items onto 'onto' and return the new head of the stack
-    Listener head;
-    do {
-      head = listeners;
-    } while (!ATOMIC_HELPER.casListeners(this, head, Listener.TOMBSTONE));
+    Listener head = ATOMIC_HELPER.gasListeners(this, Listener.TOMBSTONE);
     Listener reversedList = onto;
     while (head != null) {
       Listener tmp = head;
@@ -1301,6 +1294,12 @@
     abstract boolean casListeners(
         AbstractFuture<?> future, @CheckForNull Listener expect, Listener update);
 
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    abstract Waiter gasWaiters(AbstractFuture<?> future, Waiter update);
+
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    abstract Listener gasListeners(AbstractFuture<?> future, Listener update);
+
     /** Performs a CAS operation on the {@link #value} field. */
     abstract boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update);
   }
@@ -1383,6 +1382,18 @@
       return UNSAFE.compareAndSwapObject(future, LISTENERS_OFFSET, expect, update);
     }
 
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    @Override
+    Listener gasListeners(AbstractFuture<?> future, Listener update) {
+      return (Listener) UNSAFE.getAndSetObject(future, LISTENERS_OFFSET, update);
+    }
+
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    @Override
+    Waiter gasWaiters(AbstractFuture<?> future, Waiter update) {
+      return (Waiter) UNSAFE.getAndSetObject(future, WAITERS_OFFSET, update);
+    }
+
     /** Performs a CAS operation on the {@link #value} field. */
     @Override
     boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
@@ -1433,6 +1444,18 @@
       return listenersUpdater.compareAndSet(future, expect, update);
     }
 
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    @Override
+    Listener gasListeners(AbstractFuture<?> future, Listener update) {
+      return listenersUpdater.getAndSet(future, update);
+    }
+
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    @Override
+    Waiter gasWaiters(AbstractFuture<?> future, Waiter update) {
+      return waitersUpdater.getAndSet(future, update);
+    }
+
     @Override
     boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       return valueUpdater.compareAndSet(future, expect, update);
@@ -1479,6 +1502,30 @@
       }
     }
 
+    /** Performs a GAS operation on the {@link #listeners} field. */
+    @Override
+    Listener gasListeners(AbstractFuture<?> future, Listener update) {
+      synchronized (future) {
+        Listener old = future.listeners;
+        if (old != update) {
+          future.listeners = update;
+        }
+        return old;
+      }
+    }
+
+    /** Performs a GAS operation on the {@link #waiters} field. */
+    @Override
+    Waiter gasWaiters(AbstractFuture<?> future, Waiter update) {
+      synchronized (future) {
+        Waiter old = future.waiters;
+        if (old != update) {
+          future.waiters = update;
+        }
+        return old;
+      }
+    }
+
     @Override
     boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       synchronized (future) {
diff --git a/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java b/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
index 87fb6df..db5bf29 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
@@ -20,6 +20,7 @@
 import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static java.util.Objects.requireNonNull;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
@@ -128,7 +129,7 @@
      */
     public static Scheduler newFixedDelaySchedule(Duration initialDelay, Duration delay) {
       return newFixedDelaySchedule(
-          toNanosSaturated(initialDelay), toNanosSaturated(delay), TimeUnit.NANOSECONDS);
+          toNanosSaturated(initialDelay), toNanosSaturated(delay), NANOSECONDS);
     }
 
     /**
@@ -165,7 +166,7 @@
      */
     public static Scheduler newFixedRateSchedule(Duration initialDelay, Duration period) {
       return newFixedRateSchedule(
-          toNanosSaturated(initialDelay), toNanosSaturated(period), TimeUnit.NANOSECONDS);
+          toNanosSaturated(initialDelay), toNanosSaturated(period), NANOSECONDS);
     }
 
     /**
@@ -722,6 +723,14 @@
         this.delay = delay;
         this.unit = checkNotNull(unit);
       }
+
+      /**
+       * @param delay the time from now to delay execution
+       * @since 31.1
+       */
+      public Schedule(Duration delay) {
+        this(toNanosSaturated(delay), NANOSECONDS);
+      }
     }
 
     /**
diff --git a/guava/src/com/google/common/util/concurrent/AggregateFuture.java b/guava/src/com/google/common/util/concurrent/AggregateFuture.java
index a32e76c..6d2ed9c 100644
--- a/guava/src/com/google/common/util/concurrent/AggregateFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AggregateFuture.java
@@ -135,29 +135,26 @@
       // This is not actually a problem, since the foreach only needs this.futures to be non-null
       // at the beginning of the loop.
       int i = 0;
-      for (final ListenableFuture<? extends InputT> future : futures) {
-        final int index = i++;
+      for (ListenableFuture<? extends InputT> future : futures) {
+        int index = i++;
         future.addListener(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  if (future.isCancelled()) {
-                    // Clear futures prior to cancelling children. This sets our own state but lets
-                    // the input futures keep running, as some of them may be used elsewhere.
-                    futures = null;
-                    cancel(false);
-                  } else {
-                    collectValueFromNonCancelledFuture(index, future);
-                  }
-                } finally {
-                  /*
-                   * "null" means: There is no need to access `futures` again during
-                   * `processCompleted` because we're reading each value during a call to
-                   * handleOneInputDone.
-                   */
-                  decrementCountAndMaybeComplete(null);
+            () -> {
+              try {
+                if (future.isCancelled()) {
+                  // Clear futures prior to cancelling children. This sets our own state but lets
+                  // the input futures keep running, as some of them may be used elsewhere.
+                  futures = null;
+                  cancel(false);
+                } else {
+                  collectValueFromNonCancelledFuture(index, future);
                 }
+              } finally {
+                /*
+                 * "null" means: There is no need to access `futures` again during
+                 * `processCompleted` because we're reading each value during a call to
+                 * handleOneInputDone.
+                 */
+                decrementCountAndMaybeComplete(null);
               }
             },
             directExecutor());
@@ -179,15 +176,9 @@
        * could actually hurt in some cases, as it forces us to keep all inputs in memory until the
        * final input completes.
        */
-      final ImmutableCollection<? extends Future<? extends InputT>> localFutures =
+      ImmutableCollection<? extends Future<? extends InputT>> localFutures =
           collectsValues ? futures : null;
-      Runnable listener =
-          new Runnable() {
-            @Override
-            public void run() {
-              decrementCountAndMaybeComplete(localFutures);
-            }
-          };
+      Runnable listener = () -> decrementCountAndMaybeComplete(localFutures);
       for (ListenableFuture<? extends InputT> future : futures) {
         future.addListener(listener, directExecutor());
       }
@@ -247,8 +238,18 @@
     checkNotNull(seen);
     if (!isCancelled()) {
       /*
-       * requireNonNull is safe because this is a TrustedFuture, and we're calling this method only
-       * if it has failed.
+       * requireNonNull is safe because:
+       *
+       * - This is a TrustedFuture, so tryInternalFastPathGetFailure will in fact return the failure
+       *   cause if this Future has failed.
+       *
+       * - And this future *has* failed: This method is called only from handleException (through
+       *   getOrInitSeenExceptions). handleException tried to call setException and failed, so
+       *   either this Future was cancelled (which we ruled out with the isCancelled check above),
+       *   or it had already failed. (It couldn't have completed *successfully* or even had
+       *   setFuture called on it: Neither of those can happen until we've finished processing all
+       *   the completed inputs. And we're still processing at least one input, the one that
+       *   triggered handleException.)
        *
        * TODO(cpovirk): Think about whether we could/should use Verify to check the return value of
        * addCausalChain.
diff --git a/guava/src/com/google/common/util/concurrent/AsyncCallable.java b/guava/src/com/google/common/util/concurrent/AsyncCallable.java
index 826f3c2..c3cbb78 100644
--- a/guava/src/com/google/common/util/concurrent/AsyncCallable.java
+++ b/guava/src/com/google/common/util/concurrent/AsyncCallable.java
@@ -14,7 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.Future;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -28,7 +27,6 @@
  *
  * @since 20.0
  */
-@Beta
 @FunctionalInterface
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
diff --git a/guava/src/com/google/common/util/concurrent/AtomicDouble.java b/guava/src/com/google/common/util/concurrent/AtomicDouble.java
index 81da695..56360a8 100644
--- a/guava/src/com/google/common/util/concurrent/AtomicDouble.java
+++ b/guava/src/com/google/common/util/concurrent/AtomicDouble.java
@@ -14,6 +14,7 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static java.lang.Double.doubleToRawLongBits;
 import static java.lang.Double.longBitsToDouble;
 
@@ -21,6 +22,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.j2objc.annotations.ReflectionSupport;
 import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import java.util.function.DoubleBinaryOperator;
+import java.util.function.DoubleUnaryOperator;
 
 /**
  * A {@code double} value that may be updated atomically. See the {@link
@@ -155,15 +158,7 @@
    */
   @CanIgnoreReturnValue
   public final double getAndAdd(double delta) {
-    while (true) {
-      long current = value;
-      double currentVal = longBitsToDouble(current);
-      double nextVal = currentVal + delta;
-      long next = doubleToRawLongBits(nextVal);
-      if (updater.compareAndSet(this, current, next)) {
-        return currentVal;
-      }
-    }
+    return getAndAccumulate(delta, Double::sum);
   }
 
   /**
@@ -174,10 +169,72 @@
    */
   @CanIgnoreReturnValue
   public final double addAndGet(double delta) {
+    return accumulateAndGet(delta, Double::sum);
+  }
+
+  /**
+   * Atomically updates the current value with the results of applying the given function to the
+   * current and given values.
+   *
+   * @param x the update value
+   * @param accumulatorFunction the accumulator function
+   * @return the previous value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double getAndAccumulate(double x, DoubleBinaryOperator accumulatorFunction) {
+    checkNotNull(accumulatorFunction);
+    return getAndUpdate(oldValue -> accumulatorFunction.applyAsDouble(oldValue, x));
+  }
+
+  /**
+   * Atomically updates the current value with the results of applying the given function to the
+   * current and given values.
+   *
+   * @param x the update value
+   * @param accumulatorFunction the accumulator function
+   * @return the updated value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double accumulateAndGet(double x, DoubleBinaryOperator accumulatorFunction) {
+    checkNotNull(accumulatorFunction);
+    return updateAndGet(oldValue -> accumulatorFunction.applyAsDouble(oldValue, x));
+  }
+
+  /**
+   * Atomically updates the current value with the results of applying the given function.
+   *
+   * @param updateFunction the update function
+   * @return the previous value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double getAndUpdate(DoubleUnaryOperator updateFunction) {
     while (true) {
       long current = value;
       double currentVal = longBitsToDouble(current);
-      double nextVal = currentVal + delta;
+      double nextVal = updateFunction.applyAsDouble(currentVal);
+      long next = doubleToRawLongBits(nextVal);
+      if (updater.compareAndSet(this, current, next)) {
+        return currentVal;
+      }
+    }
+  }
+
+  /**
+   * Atomically updates the current value with the results of applying the given function.
+   *
+   * @param updateFunction the update function
+   * @return the updated value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double updateAndGet(DoubleUnaryOperator updateFunction) {
+    while (true) {
+      long current = value;
+      double currentVal = longBitsToDouble(current);
+      double nextVal = updateFunction.applyAsDouble(currentVal);
       long next = doubleToRawLongBits(nextVal);
       if (updater.compareAndSet(this, current, next)) {
         return nextVal;
diff --git a/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java b/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
index 58407f5..6cc28aa 100644
--- a/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
+++ b/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
@@ -13,6 +13,7 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static java.lang.Double.doubleToRawLongBits;
 import static java.lang.Double.longBitsToDouble;
 
@@ -20,6 +21,8 @@
 import com.google.common.primitives.ImmutableLongArray;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.atomic.AtomicLongArray;
+import java.util.function.DoubleBinaryOperator;
+import java.util.function.DoubleUnaryOperator;
 
 /**
  * A {@code double} array in which elements may be updated atomically. See the {@link
@@ -69,7 +72,7 @@
    * @throws NullPointerException if array is null
    */
   public AtomicDoubleArray(double[] array) {
-    final int len = array.length;
+    int len = array.length;
     long[] longArray = new long[len];
     for (int i = 0; i < len; i++) {
       longArray[i] = doubleToRawLongBits(array[i]);
@@ -171,15 +174,7 @@
    */
   @CanIgnoreReturnValue
   public final double getAndAdd(int i, double delta) {
-    while (true) {
-      long current = longs.get(i);
-      double currentVal = longBitsToDouble(current);
-      double nextVal = currentVal + delta;
-      long next = doubleToRawLongBits(nextVal);
-      if (longs.compareAndSet(i, current, next)) {
-        return currentVal;
-      }
-    }
+    return getAndAccumulate(i, delta, Double::sum);
   }
 
   /**
@@ -191,10 +186,78 @@
    */
   @CanIgnoreReturnValue
   public double addAndGet(int i, double delta) {
+    return accumulateAndGet(i, delta, Double::sum);
+  }
+
+  /**
+   * Atomically updates the element at index {@code i} with the results of applying the given
+   * function to the curernt and given values.
+   *
+   * @param i the index to update
+   * @param x the update value
+   * @param accumulatorFunction the accumulator function
+   * @return the previous value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double getAndAccumulate(int i, double x, DoubleBinaryOperator accumulatorFunction) {
+    checkNotNull(accumulatorFunction);
+    return getAndUpdate(i, oldValue -> accumulatorFunction.applyAsDouble(oldValue, x));
+  }
+
+  /**
+   * Atomically updates the element at index {@code i} with the results of applying the given
+   * function to the curernt and given values.
+   *
+   * @param i the index to update
+   * @param x the update value
+   * @param accumulatorFunction the accumulator function
+   * @return the updated value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double accumulateAndGet(int i, double x, DoubleBinaryOperator accumulatorFunction) {
+    checkNotNull(accumulatorFunction);
+    return updateAndGet(i, oldValue -> accumulatorFunction.applyAsDouble(oldValue, x));
+  }
+
+  /**
+   * Atomically updates the element at index {@code i} with the results of applying the given
+   * function to the curernt value.
+   *
+   * @param i the index to update
+   * @param updaterFunction the update function
+   * @return the previous value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double getAndUpdate(int i, DoubleUnaryOperator updaterFunction) {
     while (true) {
       long current = longs.get(i);
       double currentVal = longBitsToDouble(current);
-      double nextVal = currentVal + delta;
+      double nextVal = updaterFunction.applyAsDouble(currentVal);
+      long next = doubleToRawLongBits(nextVal);
+      if (longs.compareAndSet(i, current, next)) {
+        return currentVal;
+      }
+    }
+  }
+
+  /**
+   * Atomically updates the element at index {@code i} with the results of applying the given
+   * function to the curernt value.
+   *
+   * @param i the index to update
+   * @param updaterFunction the update function
+   * @return the updated value
+   * @since 31.1
+   */
+  @CanIgnoreReturnValue
+  public final double updateAndGet(int i, DoubleUnaryOperator updaterFunction) {
+    while (true) {
+      long current = longs.get(i);
+      double currentVal = longBitsToDouble(current);
+      double nextVal = updaterFunction.applyAsDouble(currentVal);
       long next = doubleToRawLongBits(nextVal);
       if (longs.compareAndSet(i, current, next)) {
         return nextVal;
diff --git a/guava/src/com/google/common/util/concurrent/Callables.java b/guava/src/com/google/common/util/concurrent/Callables.java
index 47b5264..3b52c2e 100644
--- a/guava/src/com/google/common/util/concurrent/Callables.java
+++ b/guava/src/com/google/common/util/concurrent/Callables.java
@@ -35,15 +35,8 @@
   private Callables() {}
 
   /** Creates a {@code Callable} which immediately returns a preset value each time it is called. */
-  public static <T extends @Nullable Object> Callable<T> returning(
-      @ParametricNullness final T value) {
-    return new Callable<T>() {
-      @Override
-      @ParametricNullness
-      public T call() {
-        return value;
-      }
-    };
+  public static <T extends @Nullable Object> Callable<T> returning(@ParametricNullness T value) {
+    return () -> value;
   }
 
   /**
@@ -57,15 +50,10 @@
   @Beta
   @GwtIncompatible
   public static <T extends @Nullable Object> AsyncCallable<T> asAsyncCallable(
-      final Callable<T> callable, final ListeningExecutorService listeningExecutorService) {
+      Callable<T> callable, ListeningExecutorService listeningExecutorService) {
     checkNotNull(callable);
     checkNotNull(listeningExecutorService);
-    return new AsyncCallable<T>() {
-      @Override
-      public ListenableFuture<T> call() throws Exception {
-        return listeningExecutorService.submit(callable);
-      }
-    };
+    return () -> listeningExecutorService.submit(callable);
   }
 
   /**
@@ -78,22 +66,18 @@
    */
   @GwtIncompatible // threads
   static <T extends @Nullable Object> Callable<T> threadRenaming(
-      final Callable<T> callable, final Supplier<String> nameSupplier) {
+      Callable<T> callable, Supplier<String> nameSupplier) {
     checkNotNull(nameSupplier);
     checkNotNull(callable);
-    return new Callable<T>() {
-      @Override
-      @ParametricNullness
-      public T call() throws Exception {
-        Thread currentThread = Thread.currentThread();
-        String oldName = currentThread.getName();
-        boolean restoreName = trySetName(nameSupplier.get(), currentThread);
-        try {
-          return callable.call();
-        } finally {
-          if (restoreName) {
-            boolean unused = trySetName(oldName, currentThread);
-          }
+    return () -> {
+      Thread currentThread = Thread.currentThread();
+      String oldName = currentThread.getName();
+      boolean restoreName = trySetName(nameSupplier.get(), currentThread);
+      try {
+        return callable.call();
+      } finally {
+        if (restoreName) {
+          boolean unused = trySetName(oldName, currentThread);
         }
       }
     };
@@ -108,21 +92,18 @@
    *     for each invocation of the wrapped callable.
    */
   @GwtIncompatible // threads
-  static Runnable threadRenaming(final Runnable task, final Supplier<String> nameSupplier) {
+  static Runnable threadRenaming(Runnable task, Supplier<String> nameSupplier) {
     checkNotNull(nameSupplier);
     checkNotNull(task);
-    return new Runnable() {
-      @Override
-      public void run() {
-        Thread currentThread = Thread.currentThread();
-        String oldName = currentThread.getName();
-        boolean restoreName = trySetName(nameSupplier.get(), currentThread);
-        try {
-          task.run();
-        } finally {
-          if (restoreName) {
-            boolean unused = trySetName(oldName, currentThread);
-          }
+    return () -> {
+      Thread currentThread = Thread.currentThread();
+      String oldName = currentThread.getName();
+      boolean restoreName = trySetName(nameSupplier.get(), currentThread);
+      try {
+        task.run();
+      } finally {
+        if (restoreName) {
+          boolean unused = trySetName(oldName, currentThread);
         }
       }
     };
@@ -130,7 +111,7 @@
 
   /** Tries to set name of the given {@link Thread}, returns true if successful. */
   @GwtIncompatible // threads
-  private static boolean trySetName(final String threadName, Thread currentThread) {
+  private static boolean trySetName(String threadName, Thread currentThread) {
     /*
      * setName should usually succeed, but the security manager can prohibit it. Is there a way to
      * see if we have the modifyThread permission without catching an exception?
diff --git a/guava/src/com/google/common/util/concurrent/ClosingFuture.java b/guava/src/com/google/common/util/concurrent/ClosingFuture.java
index 8859fbc..fbd604c 100644
--- a/guava/src/com/google/common/util/concurrent/ClosingFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ClosingFuture.java
@@ -36,7 +36,6 @@
 import static java.util.logging.Level.SEVERE;
 import static java.util.logging.Level.WARNING;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.collect.FluentIterable;
@@ -190,7 +189,6 @@
  * @since 30.0
  */
 // TODO(dpb): Consider reusing one CloseableList for the entire pipeline, modulo combinations.
-@Beta // @Beta for one release.
 @DoNotMock("Use ClosingFuture.from(Futures.immediate*Future)")
 @ElementTypesAreNonnullByDefault
 // TODO(dpb): GWT compatibility.
diff --git a/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java b/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
index b6b161d..decb5f1 100644
--- a/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
+++ b/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
@@ -283,7 +283,7 @@
     checkNotNull(policy);
     @SuppressWarnings("unchecked")
     Map<E, LockGraphNode> lockGraphNodes = (Map<E, LockGraphNode>) getOrCreateNodes(enumClass);
-    return new WithExplicitOrdering<E>(policy, lockGraphNodes);
+    return new WithExplicitOrdering<>(policy, lockGraphNodes);
   }
 
   @SuppressWarnings("unchecked")
@@ -308,7 +308,7 @@
   static <E extends Enum<E>> Map<E, LockGraphNode> createNodes(Class<E> clazz) {
     EnumMap<E, LockGraphNode> map = Maps.newEnumMap(clazz);
     E[] keys = clazz.getEnumConstants();
-    final int numKeys = keys.length;
+    int numKeys = keys.length;
     ArrayList<LockGraphNode> nodes = Lists.newArrayListWithCapacity(numKeys);
     // Create a LockGraphNode for each enum value.
     for (E key : keys) {
diff --git a/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java b/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
index 148f50b..80c7779 100644
--- a/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
+++ b/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
@@ -25,7 +25,6 @@
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicReference;
@@ -39,7 +38,14 @@
  * until the {@code Future} it returned is {@linkplain Future#isDone done} (successful, failed, or
  * cancelled).
  *
- * <p>This class has limited support for cancellation and other "early completion":
+ * <p>This class serializes execution of <i>submitted</i> tasks but not any <i>listeners</i> of
+ * those tasks.
+ *
+ * <p>Submitted tasks have a happens-before order as defined in the Java Language Specification.
+ * Tasks execute with the same happens-before order that the function calls to {@link #submit} and
+ * {@link #submitAsync} that submitted those tasks had.
+ *
+ * <p>This class has limited support for cancellation and other "early completions":
  *
  * <ul>
  *   <li>While calls to {@code submit} and {@code submitAsync} return a {@code Future} that can be
@@ -60,9 +66,6 @@
  *       safe for the next task to start.</i>
  * </ul>
  *
- * <p>An additional limitation: this class serializes execution of <i>tasks</i> but not any
- * <i>listeners</i> of those tasks.
- *
  * <p>This class is similar to {@link MoreExecutors#newSequentialExecutor}. This class is different
  * in a few ways:
  *
@@ -80,7 +83,6 @@
  *
  * @since 26.0
  */
-@Beta
 @ElementTypesAreNonnullByDefault
 public final class ExecutionSequencer {
 
@@ -141,7 +143,7 @@
    * {@link Callable#call()} will not be invoked.
    */
   public <T extends @Nullable Object> ListenableFuture<T> submit(
-      final Callable<T> callable, Executor executor) {
+      Callable<T> callable, Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
     return submitAsync(
@@ -167,11 +169,11 @@
    * {@link AsyncCallable#call()} is invoked, {@link AsyncCallable#call()} will not be invoked.
    */
   public <T extends @Nullable Object> ListenableFuture<T> submitAsync(
-      final AsyncCallable<T> callable, final Executor executor) {
+      AsyncCallable<T> callable, Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
-    final TaskNonReentrantExecutor taskExecutor = new TaskNonReentrantExecutor(executor, this);
-    final AsyncCallable<T> task =
+    TaskNonReentrantExecutor taskExecutor = new TaskNonReentrantExecutor(executor, this);
+    AsyncCallable<T> task =
         new AsyncCallable<T>() {
           @Override
           public ListenableFuture<T> call() throws Exception {
@@ -197,58 +199,55 @@
      * have completed - namely after oldFuture is done, and taskFuture has either completed or been
      * cancelled before the callable started execution.
      */
-    final SettableFuture<@Nullable Void> newFuture = SettableFuture.create();
+    SettableFuture<@Nullable Void> newFuture = SettableFuture.create();
 
-    final ListenableFuture<@Nullable Void> oldFuture = ref.getAndSet(newFuture);
+    ListenableFuture<@Nullable Void> oldFuture = ref.getAndSet(newFuture);
 
     // Invoke our task once the previous future completes.
-    final TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
+    TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
     oldFuture.addListener(taskFuture, taskExecutor);
 
-    final ListenableFuture<T> outputFuture = Futures.nonCancellationPropagating(taskFuture);
+    ListenableFuture<T> outputFuture = Futures.nonCancellationPropagating(taskFuture);
 
     // newFuture's lifetime is determined by taskFuture, which can't complete before oldFuture
     // unless taskFuture is cancelled, in which case it falls back to oldFuture. This ensures that
     // if the future we return is cancelled, we don't begin execution of the next task until after
     // oldFuture completes.
     Runnable listener =
-        new Runnable() {
-          @Override
-          public void run() {
-            if (taskFuture.isDone()) {
-              // Since the value of oldFuture can only ever be immediateFuture(null) or setFuture of
-              // a future that eventually came from immediateFuture(null), this doesn't leak
-              // throwables or completion values.
-              newFuture.setFuture(oldFuture);
-            } else if (outputFuture.isCancelled() && taskExecutor.trySetCancelled()) {
-              // If this CAS succeeds, we know that the provided callable will never be invoked,
-              // so when oldFuture completes it is safe to allow the next submitted task to
-              // proceed. Doing this immediately here lets the next task run without waiting for
-              // the cancelled task's executor to run the noop AsyncCallable.
-              //
-              // ---
-              //
-              // If the CAS fails, the provided callable already started running (or it is about
-              // to). Our contract promises:
-              //
-              // 1. not to execute a new callable until the old one has returned
-              //
-              // If we were to cancel taskFuture, that would let the next task start while the old
-              // one is still running.
-              //
-              // Now, maybe we could tweak our implementation to not start the next task until the
-              // callable actually completes. (We could detect completion in our wrapper
-              // `AsyncCallable task`.) However, our contract also promises:
-              //
-              // 2. not to cancel any Future the user returned from an AsyncCallable
-              //
-              // We promise this because, once we cancel that Future, we would no longer be able to
-              // tell when any underlying work it is doing is done. Thus, we might start a new task
-              // while that underlying work is still running.
-              //
-              // So that is why we cancel only in the case of CAS success.
-              taskFuture.cancel(false);
-            }
+        () -> {
+          if (taskFuture.isDone()) {
+            // Since the value of oldFuture can only ever be immediateFuture(null) or setFuture of
+            // a future that eventually came from immediateFuture(null), this doesn't leak
+            // throwables or completion values.
+            newFuture.setFuture(oldFuture);
+          } else if (outputFuture.isCancelled() && taskExecutor.trySetCancelled()) {
+            // If this CAS succeeds, we know that the provided callable will never be invoked,
+            // so when oldFuture completes it is safe to allow the next submitted task to
+            // proceed. Doing this immediately here lets the next task run without waiting for
+            // the cancelled task's executor to run the noop AsyncCallable.
+            //
+            // ---
+            //
+            // If the CAS fails, the provided callable already started running (or it is about
+            // to). Our contract promises:
+            //
+            // 1. not to execute a new callable until the old one has returned
+            //
+            // If we were to cancel taskFuture, that would let the next task start while the old
+            // one is still running.
+            //
+            // Now, maybe we could tweak our implementation to not start the next task until the
+            // callable actually completes. (We could detect completion in our wrapper
+            // `AsyncCallable task`.) However, our contract also promises:
+            //
+            // 2. not to cancel any Future the user returned from an AsyncCallable
+            //
+            // We promise this because, once we cancel that Future, we would no longer be able to
+            // tell when any underlying work it is doing is done. Thus, we might start a new task
+            // while that underlying work is still running.
+            //
+            // So that is why we cancel only in the case of CAS success.
+            taskFuture.cancel(false);
           }
         };
     // Adding the listener to both futures guarantees that newFuture will aways be set. Adding to
@@ -422,7 +421,7 @@
         Executor queuedExecutor;
         // Intentionally using non-short-circuit operator
         while ((queuedTask = executingTaskQueue.nextTask) != null
-            & (queuedExecutor = executingTaskQueue.nextExecutor) != null) {
+            && (queuedExecutor = executingTaskQueue.nextExecutor) != null) {
           executingTaskQueue.nextTask = null;
           executingTaskQueue.nextExecutor = null;
           queuedExecutor.execute(queuedTask);
diff --git a/guava/src/com/google/common/util/concurrent/FluentFuture.java b/guava/src/com/google/common/util/concurrent/FluentFuture.java
index 4320b78..b47e679 100644
--- a/guava/src/com/google/common/util/concurrent/FluentFuture.java
+++ b/guava/src/com/google/common/util/concurrent/FluentFuture.java
@@ -72,7 +72,6 @@
  *
  * @since 23.0
  */
-@Beta
 @DoNotMock("Use FluentFuture.from(Futures.immediate*Future) or SettableFuture")
 @GwtCompatible(emulated = true)
 @ElementTypesAreNonnullByDefault
@@ -186,6 +185,7 @@
    * @param executor the executor that runs {@code fallback} if the input fails
    */
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
+  @Beta
   public final <X extends Throwable> FluentFuture<V> catching(
       Class<X> exceptionType, Function<? super X, ? extends V> fallback, Executor executor) {
     return (FluentFuture<V>) Futures.catching(this, exceptionType, fallback, executor);
@@ -250,6 +250,7 @@
    * @param executor the executor that runs {@code fallback} if the input fails
    */
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
+  @Beta
   public final <X extends Throwable> FluentFuture<V> catchingAsync(
       Class<X> exceptionType, AsyncFunction<? super X, ? extends V> fallback, Executor executor) {
     return (FluentFuture<V>) Futures.catchingAsync(this, exceptionType, fallback, executor);
@@ -266,6 +267,7 @@
    * @since 28.0
    */
   @GwtIncompatible // ScheduledExecutorService
+  @Beta
   public final FluentFuture<V> withTimeout(
       Duration timeout, ScheduledExecutorService scheduledExecutor) {
     return withTimeout(toNanosSaturated(timeout), TimeUnit.NANOSECONDS, scheduledExecutor);
@@ -283,6 +285,7 @@
    */
   @GwtIncompatible // ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
+  @Beta
   public final FluentFuture<V> withTimeout(
       long timeout, TimeUnit unit, ScheduledExecutorService scheduledExecutor) {
     return (FluentFuture<V>) Futures.withTimeout(this, timeout, unit, scheduledExecutor);
@@ -327,6 +330,7 @@
    * @return A future that holds result of the function (if the input succeeded) or the original
    *     input's failure (if not)
    */
+  @Beta
   public final <T extends @Nullable Object> FluentFuture<T> transformAsync(
       AsyncFunction<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transformAsync(this, function, executor);
@@ -364,6 +368,7 @@
    * @param executor Executor to run the function in.
    * @return A future that holds result of the transformation.
    */
+  @Beta
   public final <T extends @Nullable Object> FluentFuture<T> transform(
       Function<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transform(this, function, executor);
diff --git a/guava/src/com/google/common/util/concurrent/Futures.java b/guava/src/com/google/common/util/concurrent/Futures.java
index 43205b8..09b5c3c 100644
--- a/guava/src/com/google/common/util/concurrent/Futures.java
+++ b/guava/src/com/google/common/util/concurrent/Futures.java
@@ -172,7 +172,11 @@
    * @since 14.0
    */
   public static <V extends @Nullable Object> ListenableFuture<V> immediateCancelledFuture() {
-    return new ImmediateCancelledFuture<V>();
+    ListenableFuture<Object> instance = ImmediateCancelledFuture.INSTANCE;
+    if (instance != null) {
+      return (ListenableFuture<V>) instance;
+    }
+    return new ImmediateCancelledFuture<>();
   }
 
   /**
@@ -181,7 +185,6 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 28.2
    */
-  @Beta
   public static <O extends @Nullable Object> ListenableFuture<O> submit(
       Callable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
@@ -196,7 +199,6 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 28.2
    */
-  @Beta
   public static ListenableFuture<@Nullable Void> submit(Runnable runnable, Executor executor) {
     TrustedListenableFutureTask<@Nullable Void> task =
         TrustedListenableFutureTask.create(runnable, null);
@@ -210,7 +212,6 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 23.0
    */
-  @Beta
   public static <O extends @Nullable Object> ListenableFuture<O> submitAsync(
       AsyncCallable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
@@ -224,8 +225,8 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 28.0
    */
-  @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
+  // TODO(cpovirk): Return ListenableScheduledFuture?
   public static <O extends @Nullable Object> ListenableFuture<O> scheduleAsync(
       AsyncCallable<O> callable, Duration delay, ScheduledExecutorService executorService) {
     return scheduleAsync(callable, toNanosSaturated(delay), TimeUnit.NANOSECONDS, executorService);
@@ -237,9 +238,9 @@
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 23.0
    */
-  @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
+  // TODO(cpovirk): Return ListenableScheduledFuture?
   public static <O extends @Nullable Object> ListenableFuture<O> scheduleAsync(
       AsyncCallable<O> callable,
       long delay,
@@ -776,7 +777,6 @@
    *
    * @since 15.0
    */
-  @Beta
   public static <V extends @Nullable Object> ListenableFuture<V> nonCancellationPropagating(
       ListenableFuture<V> future) {
     if (future.isDone()) {
@@ -840,22 +840,22 @@
    * @return a future that provides a list of the results of the component futures
    * @since 10.0
    */
-  /*
-   * Another way to express this signature would be to bound <V> by @NonNull and accept LF<? extends
-   * @Nullable V>. That might be better: There's currently no difference between the outputs users
-   * get when calling this with <Foo> and calling it with <@Nullable Foo>. The only difference is
-   * that calling it with <Foo> won't work when an input Future has a @Nullable type. So why even
-   * make that error possible by giving callers the choice?
-   *
-   * On the other hand, the current signature is consistent with the similar allAsList method. And
-   * eventually this method may go away entirely in favor of an API like
-   * whenAllComplete().collectSuccesses(). That API would have a signature more like the current
-   * one.
-   */
   @Beta
   @SafeVarargs
   public static <V extends @Nullable Object> ListenableFuture<List<@Nullable V>> successfulAsList(
       ListenableFuture<? extends V>... futures) {
+    /*
+     * Another way to express this signature would be to bound <V> by @NonNull and accept
+     * LF<? extends @Nullable V>. That might be better: There's currently no difference between the
+     * outputs users get when calling this with <Foo> and calling it with <@Nullable Foo>. The only
+     * difference is that calling it with <Foo> won't work when an input Future has a @Nullable
+     * type. So why even make that error possible by giving callers the choice?
+     *
+     * On the other hand, the current signature is consistent with the similar allAsList method. And
+     * eventually this method may go away entirely in favor of an API like
+     * whenAllComplete().collectSuccesses(). That API would have a signature more like the current
+     * one.
+     */
     return new ListFuture<V>(ImmutableList.copyOf(futures), false);
   }
 
@@ -904,7 +904,6 @@
    *
    * @since 17.0
    */
-  @Beta
   public static <T extends @Nullable Object> ImmutableList<ListenableFuture<T>> inCompletionOrder(
       Iterable<? extends ListenableFuture<? extends T>> futures) {
     ListenableFuture<? extends T>[] copy = gwtCompatibleToArray(futures);
diff --git a/guava/src/com/google/common/util/concurrent/ImmediateFuture.java b/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
index 81912f5..8b1c17a 100644
--- a/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
@@ -98,6 +98,9 @@
   }
 
   static final class ImmediateCancelledFuture<V extends @Nullable Object> extends TrustedFuture<V> {
+    static final @Nullable ImmediateCancelledFuture<Object> INSTANCE =
+        AbstractFuture.GENERATE_CANCELLATION_CAUSES ? null : new ImmediateCancelledFuture<>();
+
     ImmediateCancelledFuture() {
       cancel(false);
     }
diff --git a/guava/src/com/google/common/util/concurrent/InterruptibleTask.java b/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
index 168adf2..bcec007 100644
--- a/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
+++ b/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
@@ -240,7 +240,7 @@
   @Override
   public final String toString() {
     Runnable state = get();
-    final String result;
+    String result;
     if (state == DONE) {
       result = "running=[DONE]";
     } else if (state instanceof Blocker) {
diff --git a/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java b/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
index 82f8d95..0b0db45 100644
--- a/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
+++ b/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
@@ -56,7 +56,7 @@
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
     }
-    return new ListenableFutureAdapter<V>(future);
+    return new ListenableFutureAdapter<>(future);
   }
 
   /**
@@ -85,7 +85,7 @@
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
     }
-    return new ListenableFutureAdapter<V>(future, executor);
+    return new ListenableFutureAdapter<>(future, executor);
   }
 
   /**
@@ -150,22 +150,19 @@
 
         // TODO(lukes): handle RejectedExecutionException
         adapterExecutor.execute(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  /*
-                   * Threads from our private pool are never interrupted. Threads from a
-                   * user-supplied executor might be, but... what can we do? This is another reason
-                   * to return a proper ListenableFuture instead of using listenInPoolThread.
-                   */
-                  getUninterruptibly(delegate);
-                } catch (Throwable e) {
-                  // ExecutionException / CancellationException / RuntimeException / Error
-                  // The task is presumably done, run the listeners.
-                }
-                executionList.execute();
+            () -> {
+              try {
+                /*
+                 * Threads from our private pool are never interrupted. Threads from a
+                 * user-supplied executor might be, but... what can we do? This is another reason
+                 * to return a proper ListenableFuture instead of using listenInPoolThread.
+                 */
+                getUninterruptibly(delegate);
+              } catch (Throwable e) {
+                // ExecutionException / CancellationException / RuntimeException / Error
+                // The task is presumably done, run the listeners.
               }
+              executionList.execute();
             });
       }
     }
diff --git a/guava/src/com/google/common/util/concurrent/ListenableFuture.java b/guava/src/com/google/common/util/concurrent/ListenableFuture.java
index cf0199a..a8d9dd4 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -116,15 +116,7 @@
  * put in a special hack for us: https://issuetracker.google.com/issues/131431257)
  */
 @DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
-/*
- * It would make sense to also annotate this class with @ElementTypesAreNonnullByDefault. However,
- * it makes no difference because this class is already covered by the package-level
- * @ParametersAreNonnullByDefault, and this class declares only parameters, not return types or
- * fields. (Not to mention that we'll be removing all @*AreNonnullByDefault annotations after tools
- * understand .) And it's fortunate that the annotation makes no difference, because
- * we're seeing a breakage internally when we add that annotation :)
- *
- */
+@ElementTypesAreNonnullByDefault
 public interface ListenableFuture<V extends @Nullable Object> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
diff --git a/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java b/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
index 9fdcc53..678a6c6 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
@@ -59,7 +59,7 @@
    * @since 10.0
    */
   public static <V extends @Nullable Object> ListenableFutureTask<V> create(Callable<V> callable) {
-    return new ListenableFutureTask<V>(callable);
+    return new ListenableFutureTask<>(callable);
   }
 
   /**
@@ -74,7 +74,7 @@
    */
   public static <V extends @Nullable Object> ListenableFutureTask<V> create(
       Runnable runnable, @ParametricNullness V result) {
-    return new ListenableFutureTask<V>(runnable, result);
+    return new ListenableFutureTask<>(runnable, result);
   }
 
   ListenableFutureTask(Callable<V> callable) {
diff --git a/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java b/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
index e5aa5e3..f6e5d9f 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
@@ -14,7 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.ScheduledFuture;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -25,7 +24,6 @@
  * @author Anthony Zana
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public interface ListenableScheduledFuture<V extends @Nullable Object>
diff --git a/guava/src/com/google/common/util/concurrent/Monitor.java b/guava/src/com/google/common/util/concurrent/Monitor.java
index 6696b97..d01c6fa 100644
--- a/guava/src/com/google/common/util/concurrent/Monitor.java
+++ b/guava/src/com/google/common/util/concurrent/Monitor.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.primitives.Longs;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
@@ -200,7 +199,6 @@
  * @author Martin Buchholz
  * @since 10.0
  */
-@Beta
 @GwtIncompatible
 @SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
 @ElementTypesAreNonnullByDefault
@@ -304,7 +302,6 @@
    *
    * @since 10.0
    */
-  @Beta
   public abstract static class Guard {
 
     @Weak final Monitor monitor;
@@ -822,7 +819,7 @@
    * @throws InterruptedException if interrupted while waiting
    */
   public void waitFor(Guard guard) throws InterruptedException {
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (!guard.isSatisfied()) {
@@ -852,7 +849,7 @@
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean waitFor(Guard guard, long time, TimeUnit unit) throws InterruptedException {
     final long timeoutNanos = toSafeNanos(time, unit);
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (guard.isSatisfied()) {
@@ -869,7 +866,7 @@
    * currently occupying this monitor.
    */
   public void waitForUninterruptibly(Guard guard) {
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (!guard.isSatisfied()) {
@@ -897,7 +894,7 @@
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean waitForUninterruptibly(Guard guard, long time, TimeUnit unit) {
     final long timeoutNanos = toSafeNanos(time, unit);
-    if (!((guard.monitor == this) & lock.isHeldByCurrentThread())) {
+    if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
       throw new IllegalMonitorStateException();
     }
     if (guard.isSatisfied()) {
diff --git a/guava/src/com/google/common/util/concurrent/MoreExecutors.java b/guava/src/com/google/common/util/concurrent/MoreExecutors.java
index fc61fba..90776bc 100644
--- a/guava/src/com/google/common/util/concurrent/MoreExecutors.java
+++ b/guava/src/com/google/common/util/concurrent/MoreExecutors.java
@@ -440,14 +440,22 @@
    * difficult to reproduce because they depend on timing. For example:
    *
    * <ul>
-   *   <li>A call like {@code future.transform(function, directExecutor())} may execute the function
-   *       immediately in the thread that is calling {@code transform}. (This specific case happens
-   *       if the future is already completed.) If {@code transform} call was made from a UI thread
-   *       or other latency-sensitive thread, a heavyweight function can harm responsiveness.
-   *   <li>If the task will be executed later, consider which thread will trigger the execution --
-   *       since that thread will execute the task inline. If the thread is a shared system thread
-   *       like an RPC network thread, a heavyweight task can stall progress of the whole system or
-   *       even deadlock it.
+   *   <li>When a {@code ListenableFuture} listener is registered to run under {@code
+   *       directExecutor}, the listener can execute in any of three possible threads:
+   *       <ol>
+   *         <li>When a thread attaches a listener to a {@code ListenableFuture} that's already
+   *             complete, the listener runs immediately in that thread.
+   *         <li>When a thread attaches a listener to a {@code ListenableFuture} that's
+   *             <em>in</em>complete and the {@code ListenableFuture} later completes normally, the
+   *             listener runs in the the thread that completes the {@code ListenableFuture}.
+   *         <li>When a listener is attached to a {@code ListenableFuture} and the {@code
+   *             ListenableFuture} gets cancelled, the listener runs immediately in the the thread
+   *             that cancelled the {@code Future}.
+   *       </ol>
+   *       Given all these possibilities, it is frequently possible for listeners to execute in UI
+   *       threads, RPC network threads, or other latency-sensitive threads. In those cases, slow
+   *       listeners can harm responsiveness, slow the system as a whole, or worse. (See also the
+   *       note about locking below.)
    *   <li>If many tasks will be triggered by the same event, one heavyweight task may delay other
    *       tasks -- even tasks that are not themselves {@code directExecutor} tasks.
    *   <li>If many such tasks are chained together (such as with {@code
@@ -463,9 +471,11 @@
    *       terminate whichever thread happens to trigger the execution.
    * </ul>
    *
-   * Additionally, beware of executing tasks with {@code directExecutor} while holding a lock. Since
-   * the task you submit to the executor (or any other arbitrary work the executor does) may do slow
-   * work or acquire other locks, you risk deadlocks.
+   * A specific warning about locking: Code that executes user-supplied tasks, such as {@code
+   * ListenableFuture} listeners, should take care not to do so while holding a lock. Additionally,
+   * as a further line of defense, prefer not to perform any locking inside a task that will be run
+   * under {@code directExecutor}: Not only might the wait for a lock be long, but if the running
+   * thread was holding a lock, the listener may deadlock or break lock isolation.
    *
    * <p>This instance is equivalent to:
    *
@@ -488,8 +498,11 @@
 
   /**
    * Returns an {@link Executor} that runs each task executed sequentially, such that no two tasks
-   * are running concurrently. Submitted tasks have a happens-before order as defined in the Java
-   * Language Specification.
+   * are running concurrently.
+   *
+   * <p>{@linkplain Executor#execute executed} tasks have a happens-before order as defined in the
+   * Java Language Specification. Tasks execute with the same happens-before order that the function
+   * calls to {@link Executor#execute `execute()`} that submitted those tasks had.
    *
    * <p>The executor uses {@code delegate} in order to {@link Executor#execute execute} each task in
    * turn, and does not create any threads of its own.
@@ -527,7 +540,6 @@
    *
    * @since 23.3 (since 23.1 as {@code sequentialExecutor})
    */
-  @Beta
   @GwtIncompatible
   public static Executor newSequentialExecutor(Executor delegate) {
     return new SequentialExecutor(delegate);
diff --git a/guava/src/com/google/common/util/concurrent/NullnessCasts.java b/guava/src/com/google/common/util/concurrent/NullnessCasts.java
index 0a0d719..a3a914e 100644
--- a/guava/src/com/google/common/util/concurrent/NullnessCasts.java
+++ b/guava/src/com/google/common/util/concurrent/NullnessCasts.java
@@ -65,7 +65,8 @@
    * return to a caller, the code needs to a way to return {@code null} from a method that returns
    * "plain {@code T}." This API provides that.
    */
-  @SuppressWarnings("nullness")
+  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals", "ReturnMissingNullable"})
+  // The warnings are legitimate. Each time we use this method, we document why.
   @ParametricNullness
   static <T extends @Nullable Object> T uncheckedNull() {
     return null;
diff --git a/guava/src/com/google/common/util/concurrent/ParametricNullness.java b/guava/src/com/google/common/util/concurrent/ParametricNullness.java
index ebc5928..a745bf7 100644
--- a/guava/src/com/google/common/util/concurrent/ParametricNullness.java
+++ b/guava/src/com/google/common/util/concurrent/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/util/concurrent/SequentialExecutor.java b/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
index 052c7e0..d0b600b 100644
--- a/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
+++ b/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
@@ -96,10 +96,10 @@
    * execution of tasks will stop until a call to this method is made.
    */
   @Override
-  public void execute(final Runnable task) {
+  public void execute(Runnable task) {
     checkNotNull(task);
-    final Runnable submittedTask;
-    final long oldRunCount;
+    Runnable submittedTask;
+    long oldRunCount;
     synchronized (queue) {
       // If the worker is already running (or execute() on the delegate returned successfully, and
       // the worker has yet to start) then we don't need to start the worker.
diff --git a/guava/src/com/google/common/util/concurrent/ServiceManager.java b/guava/src/com/google/common/util/concurrent/ServiceManager.java
index d2dda7a..5ab95ff 100644
--- a/guava/src/com/google/common/util/concurrent/ServiceManager.java
+++ b/guava/src/com/google/common/util/concurrent/ServiceManager.java
@@ -265,8 +265,7 @@
   @CanIgnoreReturnValue
   public ServiceManager startAsync() {
     for (Service service : services) {
-      State state = service.state();
-      checkState(state == NEW, "Service %s is %s, cannot start it.", service, state);
+      checkState(service.state() == NEW, "Not all services are NEW, cannot start %s", this);
     }
     for (Service service : services) {
       try {
diff --git a/guava/src/com/google/common/util/concurrent/SettableFuture.java b/guava/src/com/google/common/util/concurrent/SettableFuture.java
index 893161e..0a9e194 100644
--- a/guava/src/com/google/common/util/concurrent/SettableFuture.java
+++ b/guava/src/com/google/common/util/concurrent/SettableFuture.java
@@ -40,7 +40,7 @@
    * Creates a new {@code SettableFuture} that can be completed or cancelled by a later method call.
    */
   public static <V extends @Nullable Object> SettableFuture<V> create() {
-    return new SettableFuture<V>();
+    return new SettableFuture<>();
   }
 
   @CanIgnoreReturnValue
diff --git a/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java b/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
index 5a1969e..c6ade6a 100644
--- a/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
@@ -73,35 +73,27 @@
 
   @Override
   public <T> T newProxy(
-      final T target,
-      Class<T> interfaceType,
-      final long timeoutDuration,
-      final TimeUnit timeoutUnit) {
+      T target, Class<T> interfaceType, long timeoutDuration, TimeUnit timeoutUnit) {
     checkNotNull(target);
     checkNotNull(interfaceType);
     checkNotNull(timeoutUnit);
     checkPositiveTimeout(timeoutDuration);
     checkArgument(interfaceType.isInterface(), "interfaceType must be an interface type");
 
-    final Set<Method> interruptibleMethods = findInterruptibleMethods(interfaceType);
+    Set<Method> interruptibleMethods = findInterruptibleMethods(interfaceType);
 
     InvocationHandler handler =
         new InvocationHandler() {
           @Override
           @CheckForNull
-          public Object invoke(
-              Object obj, final Method method, @CheckForNull final @Nullable Object[] args)
+          public Object invoke(Object obj, Method method, @CheckForNull @Nullable Object[] args)
               throws Throwable {
             Callable<@Nullable Object> callable =
-                new Callable<@Nullable Object>() {
-                  @Override
-                  @CheckForNull
-                  public Object call() throws Exception {
-                    try {
-                      return method.invoke(target, args);
-                    } catch (InvocationTargetException e) {
-                      throw throwCause(e, false /* combineStackTraces */);
-                    }
+                () -> {
+                  try {
+                    return method.invoke(target, args);
+                  } catch (InvocationTargetException e) {
+                    throw throwCause(e, false /* combineStackTraces */);
                   }
                 };
             return callWithTimeout(
diff --git a/guava/src/com/google/common/util/concurrent/Striped.java b/guava/src/com/google/common/util/concurrent/Striped.java
index fc8bcd8..2ea61cb 100644
--- a/guava/src/com/google/common/util/concurrent/Striped.java
+++ b/guava/src/com/google/common/util/concurrent/Striped.java
@@ -206,14 +206,7 @@
    * @return a new {@code Striped<Lock>}
    */
   public static Striped<Lock> lock(int stripes) {
-    return custom(
-        stripes,
-        new Supplier<Lock>() {
-          @Override
-          public Lock get() {
-            return new PaddedLock();
-          }
-        });
+    return custom(stripes, PaddedLock::new);
   }
 
   /**
@@ -224,14 +217,7 @@
    * @return a new {@code Striped<Lock>}
    */
   public static Striped<Lock> lazyWeakLock(int stripes) {
-    return lazy(
-        stripes,
-        new Supplier<Lock>() {
-          @Override
-          public Lock get() {
-            return new ReentrantLock(false);
-          }
-        });
+    return lazy(stripes, () -> new ReentrantLock(false));
   }
 
   private static <L> Striped<L> lazy(int stripes, Supplier<L> supplier) {
@@ -248,15 +234,8 @@
    * @param permits the number of permits in each semaphore
    * @return a new {@code Striped<Semaphore>}
    */
-  public static Striped<Semaphore> semaphore(int stripes, final int permits) {
-    return custom(
-        stripes,
-        new Supplier<Semaphore>() {
-          @Override
-          public Semaphore get() {
-            return new PaddedSemaphore(permits);
-          }
-        });
+  public static Striped<Semaphore> semaphore(int stripes, int permits) {
+    return custom(stripes, () -> new PaddedSemaphore(permits));
   }
 
   /**
@@ -267,15 +246,8 @@
    * @param permits the number of permits in each semaphore
    * @return a new {@code Striped<Semaphore>}
    */
-  public static Striped<Semaphore> lazyWeakSemaphore(int stripes, final int permits) {
-    return lazy(
-        stripes,
-        new Supplier<Semaphore>() {
-          @Override
-          public Semaphore get() {
-            return new Semaphore(permits, false);
-          }
-        });
+  public static Striped<Semaphore> lazyWeakSemaphore(int stripes, int permits) {
+    return lazy(stripes, () -> new Semaphore(permits, false));
   }
 
   /**
@@ -286,7 +258,7 @@
    * @return a new {@code Striped<ReadWriteLock>}
    */
   public static Striped<ReadWriteLock> readWriteLock(int stripes) {
-    return custom(stripes, READ_WRITE_LOCK_SUPPLIER);
+    return custom(stripes, ReentrantReadWriteLock::new);
   }
 
   /**
@@ -297,25 +269,8 @@
    * @return a new {@code Striped<ReadWriteLock>}
    */
   public static Striped<ReadWriteLock> lazyWeakReadWriteLock(int stripes) {
-    return lazy(stripes, WEAK_SAFE_READ_WRITE_LOCK_SUPPLIER);
+    return lazy(stripes, WeakSafeReadWriteLock::new);
   }
-
-  private static final Supplier<ReadWriteLock> READ_WRITE_LOCK_SUPPLIER =
-      new Supplier<ReadWriteLock>() {
-        @Override
-        public ReadWriteLock get() {
-          return new ReentrantReadWriteLock();
-        }
-      };
-
-  private static final Supplier<ReadWriteLock> WEAK_SAFE_READ_WRITE_LOCK_SUPPLIER =
-      new Supplier<ReadWriteLock>() {
-        @Override
-        public ReadWriteLock get() {
-          return new WeakSafeReadWriteLock();
-        }
-      };
-
   /**
    * ReadWriteLock implementation whose read and write locks retain a reference back to this lock.
    * Otherwise, a reference to just the read lock or just the write lock would not suffice to ensure
@@ -441,7 +396,7 @@
     final AtomicReferenceArray<@Nullable ArrayReference<? extends L>> locks;
     final Supplier<L> supplier;
     final int size;
-    final ReferenceQueue<L> queue = new ReferenceQueue<L>();
+    final ReferenceQueue<L> queue = new ReferenceQueue<>();
 
     SmallLazyStriped(int stripes, Supplier<L> supplier) {
       super(stripes);
@@ -461,7 +416,7 @@
         return existing;
       }
       L created = supplier.get();
-      ArrayReference<L> newRef = new ArrayReference<L>(created, index, queue);
+      ArrayReference<L> newRef = new ArrayReference<>(created, index, queue);
       while (!locks.compareAndSet(index, existingRef, newRef)) {
         // we raced, we need to re-read and try again
         existingRef = locks.get(index);
diff --git a/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java b/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
index 1027f3c..091f56e 100644
--- a/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
+++ b/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
@@ -151,15 +151,15 @@
   // Split out so that the anonymous ThreadFactory can't contain a reference back to the builder.
   // At least, I assume that's why. TODO(cpovirk): Check, and maybe add a test for this.
   private static ThreadFactory doBuild(ThreadFactoryBuilder builder) {
-    final String nameFormat = builder.nameFormat;
-    final Boolean daemon = builder.daemon;
-    final Integer priority = builder.priority;
-    final UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler;
-    final ThreadFactory backingThreadFactory =
+    String nameFormat = builder.nameFormat;
+    Boolean daemon = builder.daemon;
+    Integer priority = builder.priority;
+    UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler;
+    ThreadFactory backingThreadFactory =
         (builder.backingThreadFactory != null)
             ? builder.backingThreadFactory
             : Executors.defaultThreadFactory();
-    final AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
+    AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
     return new ThreadFactory() {
       @Override
       public Thread newThread(Runnable runnable) {
diff --git a/guava/src/com/google/common/util/concurrent/TimeoutFuture.java b/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
index 219a098..ed8a7bf 100644
--- a/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
+++ b/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
@@ -161,7 +161,7 @@
     if (localInputFuture != null) {
       String message = "inputFuture=[" + localInputFuture + "]";
       if (localTimer != null) {
-        final long delay = localTimer.getDelay(TimeUnit.MILLISECONDS);
+        long delay = localTimer.getDelay(TimeUnit.MILLISECONDS);
         // Negative delays look confusing in an error message
         if (delay > 0) {
           message += ", remaining delay=[" + delay + " ms]";
diff --git a/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java b/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
index a2c2115..929c9fb 100644
--- a/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
+++ b/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
@@ -37,11 +37,11 @@
 
   static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
       AsyncCallable<V> callable) {
-    return new TrustedListenableFutureTask<V>(callable);
+    return new TrustedListenableFutureTask<>(callable);
   }
 
   static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(Callable<V> callable) {
-    return new TrustedListenableFutureTask<V>(callable);
+    return new TrustedListenableFutureTask<>(callable);
   }
 
   /**
@@ -55,7 +55,7 @@
    */
   static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
       Runnable runnable, @ParametricNullness V result) {
-    return new TrustedListenableFutureTask<V>(Executors.callable(runnable, result));
+    return new TrustedListenableFutureTask<>(Executors.callable(runnable, result));
   }
 
   /*
diff --git a/guava/src/com/google/common/util/concurrent/Uninterruptibles.java b/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
index 94678ec..09ace92 100644
--- a/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
+++ b/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
@@ -18,7 +18,6 @@
 import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
@@ -80,7 +79,6 @@
    */
   @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
   @GwtIncompatible // concurrency
-  @Beta
   public static boolean awaitUninterruptibly(CountDownLatch latch, Duration timeout) {
     return awaitUninterruptibly(latch, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
@@ -121,7 +119,6 @@
    * @since 28.0
    */
   @GwtIncompatible // concurrency
-  @Beta
   public static boolean awaitUninterruptibly(Condition condition, Duration timeout) {
     return awaitUninterruptibly(condition, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
@@ -182,7 +179,6 @@
    * @since 28.0
    */
   @GwtIncompatible // concurrency
-  @Beta
   public static void joinUninterruptibly(Thread toJoin, Duration timeout) {
     joinUninterruptibly(toJoin, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
@@ -274,7 +270,6 @@
    */
   @CanIgnoreReturnValue
   @GwtIncompatible // java.time.Duration
-  @Beta
   @ParametricNullness
   public static <V extends @Nullable Object> V getUninterruptibly(
       Future<V> future, Duration timeout) throws ExecutionException, TimeoutException {
@@ -379,7 +374,6 @@
    * @since 28.0
    */
   @GwtIncompatible // concurrency
-  @Beta
   public static void sleepUninterruptibly(Duration sleepFor) {
     sleepUninterruptibly(toNanosSaturated(sleepFor), TimeUnit.NANOSECONDS);
   }
@@ -417,7 +411,6 @@
    * @since 28.0
    */
   @GwtIncompatible // concurrency
-  @Beta
   public static boolean tryAcquireUninterruptibly(Semaphore semaphore, Duration timeout) {
     return tryAcquireUninterruptibly(semaphore, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
@@ -442,7 +435,6 @@
    * @since 28.0
    */
   @GwtIncompatible // concurrency
-  @Beta
   public static boolean tryAcquireUninterruptibly(
       Semaphore semaphore, int permits, Duration timeout) {
     return tryAcquireUninterruptibly(
@@ -487,7 +479,6 @@
    * @since 30.0
    */
   @GwtIncompatible // concurrency
-  @Beta
   public static boolean tryLockUninterruptibly(Lock lock, Duration timeout) {
     return tryLockUninterruptibly(lock, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
@@ -527,7 +518,6 @@
    *
    * @since 30.0
    */
-  @Beta
   @GwtIncompatible // concurrency
   public static void awaitTerminationUninterruptibly(ExecutorService executor) {
     // TODO(cpovirk): We could optimize this to avoid calling nanoTime() at all.
@@ -540,7 +530,6 @@
    *
    * @since 30.0
    */
-  @Beta
   @GwtIncompatible // concurrency
   public static boolean awaitTerminationUninterruptibly(
       ExecutorService executor, Duration timeout) {
@@ -553,7 +542,6 @@
    *
    * @since 30.0
    */
-  @Beta
   @GwtIncompatible // concurrency
   @SuppressWarnings("GoodTime")
   public static boolean awaitTerminationUninterruptibly(
diff --git a/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java b/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
index 03c08cc..5a3c392 100644
--- a/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
@@ -62,16 +62,13 @@
    * delegates to {@link #wrapTask(Callable)}.
    */
   protected Runnable wrapTask(Runnable command) {
-    final Callable<Object> wrapped = wrapTask(Executors.callable(command, null));
-    return new Runnable() {
-      @Override
-      public void run() {
-        try {
-          wrapped.call();
-        } catch (Exception e) {
-          throwIfUnchecked(e);
-          throw new RuntimeException(e);
-        }
+    Callable<Object> wrapped = wrapTask(Executors.callable(command, null));
+    return () -> {
+      try {
+        wrapped.call();
+      } catch (Exception e) {
+        throwIfUnchecked(e);
+        throw new RuntimeException(e);
       }
     };
   }
diff --git a/guava/src/com/google/common/xml/ParametricNullness.java b/guava/src/com/google/common/xml/ParametricNullness.java
index a476558..e4e5d12 100644
--- a/guava/src/com/google/common/xml/ParametricNullness.java
+++ b/guava/src/com/google/common/xml/ParametricNullness.java
@@ -20,24 +20,33 @@
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static javax.annotation.meta.When.UNKNOWN;
 
 import com.google.common.annotations.GwtCompatible;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import javax.annotation.Nonnull;
-import javax.annotation.meta.TypeQualifierNickname;
 
 /**
- * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
- * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
- * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * Marks a "top-level" type-variable usage as the closest we can get to "non-nullable when
+ * non-nullable; nullable when nullable" (like the Android <a
  * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
- * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ * NullFromTypeParam}</a>).
+ *
+ * <p>Consumers of this annotation include:
+ *
+ * <ul>
+ *   <li>Kotlin, for which it makes the type-variable usage (a) a Kotlin platform type when the type
+ *       argument is non-nullable and (b) nullable when the type argument is nullable. We use this
+ *       to "undo" {@link ElementTypesAreNonnullByDefault}.
+ *   <li><a href="https://developers.google.com/j2objc">J2ObjC</a>
+ *   <li>{@code NullPointerTester}, at least in the Android backport (where the type-use annotations
+ *       {@code NullPointerTester} would need are not available) and in case of <a
+ *       href="https://bugs.openjdk.java.net/browse/JDK-8202469">JDK-8202469</a>
+ * </ul>
+ *
  */
 @GwtCompatible
 @Retention(RUNTIME)
 @Target({FIELD, METHOD, PARAMETER})
-@TypeQualifierNickname
-@Nonnull(when = UNKNOWN)
+@javax.annotation.meta.TypeQualifierNickname
+@javax.annotation.Nonnull(when = javax.annotation.meta.When.UNKNOWN)
 @interface ParametricNullness {}
diff --git a/guava/src/com/google/common/xml/XmlEscapers.java b/guava/src/com/google/common/xml/XmlEscapers.java
index a1c637c..33241f3 100644
--- a/guava/src/com/google/common/xml/XmlEscapers.java
+++ b/guava/src/com/google/common/xml/XmlEscapers.java
@@ -14,7 +14,6 @@
 
 package com.google.common.xml;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.Escaper;
 import com.google.common.escape.Escapers;
@@ -38,7 +37,6 @@
  * @author David Beaumont
  * @since 15.0
  */
-@Beta
 @GwtCompatible
 @ElementTypesAreNonnullByDefault
 public class XmlEscapers {
diff --git a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
index 9e5f173..c987065 100644
--- a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
+++ b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
@@ -42,7 +42,7 @@
   /** If a hostname is contained as a key in this map, it is a public suffix. */
   public static final ImmutableMap<String, PublicSuffixType> EXACT =
       TrieParser.parseTrie(
-          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?3np8lv81qo3--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?sr,t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,p&i-on,ohsdaerpsym,?sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?moc?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?moc?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,xc,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?rrd,ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??sum?tic??l!.&gro?moc?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog??c??t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?moc?ten?ude?v&g:.d,,og???q??wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,golbw,hcs?lim?o&c!.topsgolb,?g??palf,r&egolb,o??sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&a&bura-vnej.&1ti,abura.rue.1ti,?tcepsrep,xo:.&ku,nt,?,?bewilek:.sc,,citsalej.piv,drayknil,elej,gnitsohdnert.&ed,hc,?letemirp:.ku,,m&edaid,ialcer.&ac,ku,su,??n&evueluk,woru,?r&epolroov,o&pav,tnemele,??tenraxa.1-se,ululetoj,xelpciffart,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,nevueluk.yxorpze,pohsdaerpsym,snoitulostsohretni.duolc,topsgolb,?ortal?ut!uoy???c&0krbd4--nx?a&lp!.oc,?ps!.&lla4sx,rebu,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,b&ow-nrefeilgitsng--nx,rb-ni,vz-nelletsebgitsng--nx,?decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,e&lletsebgitsnüg,sgnutiel,?i&emtsi,lreb-n&i,yd,??oitatsksid-ygolonys,pv&-n&i,yd,?nyd,?refeilgitsnüg,?orp-ytinummoc,p&h21,iog:ol,,ohsdaerpsym,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??a&lg?rt!.oby,??i&sdoow?ug??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il??g!.&gro?lim?moc?t&en?vp??ude?vog??a&f?gtrom?p!.&3xlh,kselp,sndp,tengam,xlh,ycvrp,??rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&pohsdaerpsym,topsgolb,vog??tilop?v&bba?om???j!.&fo,gro?oc?ten???k!.&c&a?s??e&m?n??ibom?o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,pct,?66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?qbw,r&aegelif,idcm,ofsnd,?s&dym,ndd,ti!bt,?umhol,?t&en?s&acdnuos,ohon,??u&a-raegelif,de?tcn,?v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.&egats-oree,oree,ysrab,??w??o!.&derno:.gnigats,,ecivres,knilemoh,r&ednu,of,??hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?mo&c?n??t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.&e&rawpohs,saberots,?yflles,??taeht?u&ces?sni?t&inruf?necca??za???s!.&a!bap.us,?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!ohsdaerpsym,p??r!owebdluocti,?s!serp?yspoi,?t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&areduolc,e&lej,nilnigol,r&etnim,ocevon,?winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,thrs,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?og??ce&r?t??erots?gro?lim?m&oc?rif??o&c?fni??stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l!.xlh,?rd?ssergorp??ol??w&kct--nx?r??xul?y!.&gro?lim?moc?ten?ude?vog????f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?moc?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx!.&a14--nx,b8lea1j--nx,c&avc0aaa08--nx,ma09--nx,?f&a1a09--nx,ea1j--nx,?gva1c--nx,nha1h--nx,pda1j--nx,zila1h--nx,??ns??ea1j--nx?fo?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram!.&htiw,morf,??hgil?lusnoc?neg?ov?soh!.tfarcnepo,??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.&duolc,etalsnart,???r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?ibptth,o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?dylimaf,eirfotatophcuoc,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,igude,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&delacsne,gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?moc?o&c?g??ro?topsgolb,??v!.ta,a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,p&h21,ohsdaerpsym,?sndtog,topsgolb,wolf.e&a.1pla,nigneppa,?xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??pib,ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh!.arh,?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?moc?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?iki,mroftalpduolc.if,nenikkäh,pohsdaerpsym,retnecatad.&omed,saap,?topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,ppatig,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?moc?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme?ud??d!.&erots,ger,mrif,oc,pohsdaerpsym,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc??npqic--nx?saaces,t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?moc?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&morf,ot,?ten!.&htumiza,nolt,o&c,vra,??doof???s!.topsgolb,?t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??nnoc,o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?omida,p&i-on,ohsdaerpsym,?t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?psoh,shn?t&en?nmyp,?vog!.eci&ffoemoh,vres,??ysrab,???l&04sr4w--nx?a!.&gro?lim?moc?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?oc?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?moc?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.&egapvar,topsgolb,??ten?vog??a&f?m&e?g?toh???m?r?xil??l&a&b&esab?t&eksab!.&sua,zn,??oof???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,pohsdaerpsym,retsulc-gnitsoh,topsgolb,wsma,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.&ed,rotnemele,??hcs??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&erapohs,img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats?uolc&inu,sds,??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks??klwwortso?ohs!daerpsym,??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?moc?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,5sndd,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?g,ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw:.sj,,tsohecapsppa,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,iafaw.&d&ej,yr,?nol,?meaeboda,panqym:-&ahpla,ved,?,smetsystuo,tekcilc,ved&j,pw,??vreser,wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilno&-evreser,ysrab,?og-si,?r&alfduolcyrt,ehwynanohtyp:.ue,,ihcec,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,xiw,??omer-sndnyd,upmocsma,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-&raeghtua,swennwot,?ksndd,robsikrow,?o&fgp,lb&-sndnyd,pawodni,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am&-sndnyd,detsohpw,??l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofererac-htlaeh,sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dc&hsums,umpw,xirtrepmi,?eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,r&italik,tap-el-tse,?s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,hce-namtsop,jodsnd,m&-morf,ed-baltlow,?n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ym&eerf,teg,??ohsdaerpsym,pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&iv&erp-yb-detsoh.saap,orpnwo,?ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb&-a-si,ndi,?h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.&cpj-rev-duolcj,duolcj,?s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,ituob,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&areleccalabolgswa,c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,e&tsoh.&duolc-gar,hc-duolc-gar,?ugolb-nom-tse,?omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,vnacremarf,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,t&isro,yskciuq,??i&ht2tniop,pa&elgoog,tneltneg,??jfac,k&-morf,aerf-ten,colb&egrof,pohsym,??m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppa&raeghtua,tneg,?r&ac-otni-si,e&ntrap-paelut,tsohmaerd,??s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&a&llicno,zno,?ilay,lacarac,re&gitnef,motsuc,?sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,???t&arcomed-a-si,c&-morf,etedatad.&ecnatsni,omed,??eel&-si,rebu-si,?hgilfhtiwletoh,m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,e&capsppa,lbavresbo.citats,?pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,w-morf,?w&o&lpwons-yrt,zok,?ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,l&erottad,pezam,?wetag-llawerif,?dnacsekil,fipohsym,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.r&iaper,of,??po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?moc?ten?ude???i!.&bew,c&a?in??dni?esabapus,gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p?v?w!.taht,?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?ude?vog???o&dnol!.&fo,ni,??i&hsaf!.fo,?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?nhojcs?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&d&ni?uolcegnaro,?esnefed?gro?ltni?m&oc!nim??siruot??n&erut?if??o&fni?srep??sn&e?r??t&an?en!irga?ude??rnr??unr?vog??m??u&f?r!.&bdnevar,lper,sh,tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?esabapus,gro?ipym,l&im?per:.di,,?m&o&c!.topsgolb,?n??rif?udon,?ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e?in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&iaznab.ppa,ropav,?rd,??e&c&apsinu.1rf-duolc,ivedniser,?donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&i&beulb,snoehtnap,?newtu,ybeeb.saap,??gni&gatsniser.secived,tsohytsoh,?k&coregrof.di,orgn,ramytefasresworb,?m&oc?udon,?n&mtsp:.kcom,,yded,?ot&oq,pyrctfihs,?p&opilol,pa&-arusah,e&nalpkcab,tybeeb.1dkes,???r&e&tsneum-hf,vres&cisab,lautriv,??ial.sppa,?s&codehtdaer,gnihtbew,nemeis-om,pparevelc,tacdnas,?t&e&kcubtib,notorp,?i&belet,detfihs,kecaps,?raedon.egats,s&ohg,udgniht.&cersid.&dvreser,tsuc,?dorp.tsuc,gnitset.&dvreser,tsuc,?ved.&dvreser,tsuc,????vgib.0ku,whs,x&bslprbv.g,cq,rotide,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?ohsdaerpsym,p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t??o&c,fni??pohs,stra?t&n?opsgolb,?www??e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!.uj,ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew:erif,,e&niln&igol,okoob,?tupmocegde,?lecrev,n&aecolatigidno,ur:.a,,?poon,remarf,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&acisum?bog?gro?lim?moc!.topsgolb,?rut?t&en?ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.&duolclautriv.elacs.sresu,topsgolb,???nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&c&sid?tfiws??rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?lipuog,rianiretev??hny,i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?pohsdaerpsym,s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?moc?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??pohsdaerpsym,ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,etisinim,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?ni?oc?topsgolb,ude?vog?xo,yldnerb.pohs,?a&c?p?tiug??c?e&dliub!.etisduolc,?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&em?gro?hcs?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.oc,???rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&e&f?lacsne.xhp,?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???u&olcrim,rd,??e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n!.elbaeciton,??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?p&h21,ohsdaerpsym,?r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0&002cilc,rab,?1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,irgevissam.saap.&1-&gs,nol,rf,yn,?2-&nol,yn,??nab-eht-ni,uolc&meaeboda,nievas.c&di-etsedron,itsalej,?xednay:.e&garots,tisbew,?,??e&c&narusnihtlaehezitavirp,rofelacs.j,?gdirbtib,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?n&ilno-evreser,ozdop,?rehurht,s:abapus,,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,sirkcilc,tsohnnylf,?olb&evres,tsaf,??k&catsvano,eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?i&bed,llerk,??dcduabkcalb,i,pv-ni,?o&c-morf,duppa,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,h&bew,sdaerpsym,??pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&gde-ndc,suohsyub,t&isbeweruza,ys,??k&catstsaf,ekokohcs,?n&d&-won,d,golb,npv,?oitcnufduolc,?ppacitatseruza:.&2suts&ae,ew,?aisatsae,eporuetsew,sulartnec,?,s&a-skcik,ecca&-citats,duolc,???t&adies,ce&ffeym,jorprot:.segap,,?e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,oh&-spv:.citsalej.&cir,lta,sjn,?,gnik,???u&h,nyd,r:eakust.citsalej,,?ved-naissalta.dorp.ndc,x&inuemoh,spym,tsale.&1ots-slj,2ots-slj,3ots-slj,?unilemoh,?y&awetag-llawerif,ffijduolc:.&ed-1arf,su-1tsew,?,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?moc?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i!t.nepo.citsalej.duolc,?ol?r??n&a!lim?sl&ab?ub???b?c?e!en.cj,v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?ohsdaerpsym,s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f?m!r??utni??je3a3abgm--nx?kh?l!.&topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.&ude,vog:.ecivres,,??d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?moc?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?moc?o&c?dalusnoc?hon,?ten?ude??a&cmoc?f??e&b?padub?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,lrupmet,s&pvtsaf,seccaduolc,?tsafym,vedumpw,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y!.gro,?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.&pohsdaerpsym,stelduolc.lem,topsgolb,??nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.topsgolb,?m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&3kl,a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,duolcrim,e&niram,rpcm,?g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,d&cm:.spv,,orue,?midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.topsgolb,?ed!.&enilnigol,gnigats-oned,hcetaidem,lecrev,o&ned,tpyrctfihs,?ppa-rettalp,s&egap,rekrow,?vr&esi,uc,?weiverpbuhtig,ylf,??ih?l!.&di?fnoc?gro?lim?moc?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?moc!.reliamym,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?moc?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex??rbgn--nx?s!.vog??x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot??g?lp?p!ila??rot?ssin?wdaorb??b!.&duolcym,fo?hcetaidem,lim?moc!.topsgolb,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??t&en?nemailrap??vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?moc?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude?vog??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog?zib??edaca!.laiciffo,?ra??n&a&ffit?pmoc!ylimafa???os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c?ledif?n&ifx?ummoc!.&bdnevar,gon,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?moc!.topsgolb,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?jsg,moc?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&cos?gro?lop?m&oc?t??ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&duolcj,gro?lim?moc?t&en?ropeletzak.saapu,?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&e&nozlacol,tisgolb,?gnitfarc,otpaz,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур!.&арамас,бпс,гро,зиб,ичос,ксм,м&ок,ырк,?рим,я,??тйас?фр?юе?յահ?לארשי?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
+          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?sr,t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,p&i-on,ohsdaerpsym,?sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?moc?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?moc?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,xc,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?rrd,ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,nwaps.secnatsni,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?esab,gro?l&aiciffo,im??moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??sum?tic??l!.&gro?moc?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog???t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?moc?ten?ude?v&g:.d,,og????wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,golbw,hcs?lim?o&c!.topsgolb,?g??palf,r&egolb,o??sepnop?ten?ym?zib??b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&a&bura-vnej.&1ti,abura.rue.1ti,?tcepsrep,xo:.&ku,nt,?,?b&dnevar,ewilek:.sc,,?citsalej.piv,drayknil,elej,gnitsohdnert.&ed,hc,?letemirp:.ku,,m&edaid,ialcer.&ac,ku,su,??n&evueluk,woru,?r&epolroov,o&pav,tnemele,??tenraxa.1-se,ululetoj,xelpciffart,yawocne.ue,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,nevueluk.yxorpze,pohsdaerpsym,snoitulostsohretni.duolc,topsgolb,?ortal?ut!uoy???c&0krbd4--nx?a&lp!.oc,?ps!.&lla4sx,rebu,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,b&ow-nrefeilgitsng--nx,rb-ni,vz-nelletsebgitsng--nx,?decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,e&lletsebgitsnüg,sgnutiel,?i&emtsi,lreb-n&i,yd,??norblieh-sh.ti.segap,oitatsksid-ygolonys,pv&-n&i,yd,?nyd,?refeilgitsnüg,?orp-ytinummoc,p&h21,iog:ol,,ohsdaerpsym,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??art!.oby,?i&sdoow?ug??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il??g!.&gro?lim?moc?t&en?vp??ude?vog??a&f?gtrom?p!.&3xlh,detalsnart,grebedoc,kselp,sndp,tengam,xlh,y&cvrp,kcor,???rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&pohsdaerpsym,topsgolb,vog??tilop?v&bba?om???j!.&fo,gro?oc?ten???k!.&c&a?s??e&m?n??ibom?o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,p&ct,v,??66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?qbw,r&aegelif,idcm,ofsnd,?s&dym,ndd,ti!bt,?umhol,?t&en?s&acdnuos,ohon,??u&a-raegelif,de??v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.&egats-oree,oree,ysrab,??w??o!.&derno:.gnigats,,ecivres,knilemoh,r&ednu,of,??hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?mo&c?n??t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.&e&rawpohs,saberots,?yflles,??taeht?u&ces?sni?t&inruf?necca??za???s!.&a!bap.us,?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!ohsdaerpsym,p??r!owebdluocti,?s!serp?yspoi,?t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&e&lej,nilnigol,r&etnim,ocevon,?winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,thrs,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?ib?og??ce&r?t??erots?gro?lim?m&o&c?n??rif??o&c?fni??rar?stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l!.xlh,?rd?ssergorp??ol??w&kct--nx?r??xul?y!.&gro?lim?moc?ten?ude?vog????f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?moc?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx!.&a14--nx,b8lea1j--nx,c&avc0aaa08--nx,ma09--nx,?f&a1a09--nx,ea1j--nx,?gva1c--nx,nha1h--nx,pda1j--nx,zila1h--nx,??ns??ea1j--nx?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram!.&htiw,morf,??hgil?lusnoc?neg?ov?soh!.tfarcnepo,??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.&duolc,etalsnart,???r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?ibptth,o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?d&ikcet.3s,ylimaf,?eirfotatophcuoc,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&delacsne,gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?moc?o&c?g??ro?topsgolb,??v!.ta,a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,p&h21,ohsdaerpsym,?sndtog,topsgolb,wolf.e&a.1pla,nigneppa,?xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??pib,ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh!.arh,?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?moc?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?i&ki,spak,?mroftalpduolc.if,nenikkäh,pohsdaerpsym,retnecatad.&omed,saap,?topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,ppatig,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?moc?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme??d!.&erots,ger,mrif,oc,pohsdaerpsym,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc??npqic--nx?saaces,t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?moc?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&morf,ot,?ten!.&htumiza,nolt,o&c,vra,??doof???s!.topsgolb,?t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,yr&ettoly&lkeew,tiniffa,?tneelffar,???lenap-tnednepedni,n&noc,oissimmoc-&layor,tnednepedni,??o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?omida,p&i-on,ohsdaerpsym,?t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?psoh,shn?t&en?nmyp,seuqni-tnednepedni,?vog!.&eci&ffoemoh,vres,?ipa,??weiver-tnednepedni,y&riuqni-&cilbup,tnednepedni,?srab,????l&04sr4w--nx?a!.&gro?lim?moc?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?oc?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?moc?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.&egapvar,redrotibat,topsgolb,??ten?vog??a&f?m&e?g?toh???m?r??l&a&b&esab?t&eksab!.&sua,zn,??oof???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&no&med,rtsic,?oc,pohsdaerpsym,retsulc-gnitsoh,topsgolb,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.&ed,rotnemele,??hcs??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&erapohs,img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats?uolc&inu,sds,??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks!emoh,??klwwortso?ohs!-ecremmoce,daerpsym,??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?moc?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,5sndd,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw:.sj,,tsohecapsppa,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,iafaw.&d&ej,yr,?nol,?meaeboda,panqym:-&ahpla,ved,?,smetsystuo,tekcilc,ved&j,pw,??vreser,wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilno&-evreser,ysrab,?og-si,?r&alfduolcyrt,ehwynanohtyp:.ue,,ihcec,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,xiw,??omer-sndnyd,upmocsma,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-&raeghtua,swennwot,?ksndd,robsikrow,tsoh-bt.etis,?o&fgp,lb&-sndnyd,pawodni,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am&-sndnyd,detsohpw,??l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofe&pyt.orp,rerac-htlaeh,?sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dc&hsums,umpw,xirtrepmi,?eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,r&italik,tap-el-tse,?s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,hce-namtsop,jodsnd,m&-morf,ed-baltlow,?n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ym&eerf,teg,??ohsdaerpsym,pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&iv&erp-yb-detsoh.saap,orpnwo,?ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb&-a-si,ndi,?h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.&cpj-rev-duolcj,duolcj,?s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,ituob,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&areleccalabolgswa,c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,e&tsoh.&duolc-gar,hc-duolc-gar,?ugolb-nom-tse,?omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,vnacremarf,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,t&i&iis,sro,?yskciuq,??i&ht2tniop,pa&elgoog,tneltneg,??jfac,k&-morf,aerf-ten,colb&egrof,pohsym,??m&-morf,cxolb,?n&d&-pmet,dyard,golb,htiwssem,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppa&raeghtua,tneg,?r&ac-otni-si,e&ntrap-paelut,tsohmaerd,??s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&a&llicno,zno,?ilay,lacarac,re&gitnef,motsuc,?sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,??yasdrocsid,?t&arcomed-a-si,c&-morf,etedatad.&ecnatsni,omed,??eel&-si,rebu-si,?hgilfhtiwletoh,m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,e&capsppa,donil.pi,lbavresbo.citats,?pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,rdlf,w-morf,?w&o&lpwons-yrt,zok,?ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,l&erottad,pezam,?wetag-llawerif,?dnacsekil,fipohsym,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orp&hsilbup,mapson.duolc,???zesdrocsid,?inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.r&iaper,of,??po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?moc?ten?ude???i!.&bew,c&a?in??dni?esabapus,gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p?v?w!.taht,?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?ude?vog???o&dnol!.&fo,ni,??i&hsaf!.fo,?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&d&ni?uolcegnaro,?gro?ltni?m&oc!nim??siruot??nif?o&fni?srep??sne?t&an?en??vog??m??u&f?r!.&bdnevar,lper,retropno,s&h,revres,?tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?esabapus,gro?ipym,l&im?per:.di,,?m&o&c!.topsgolb,?n??rif??ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e?in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?czh,d&in,u&olc&iaznab.ppa,ropav,?rd,??e&c&apsinu.1rf-duolc,ivedniser,?donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&i&beulb,snoehtnap,?newtu,ybeeb.saap,??gni&gatsniser.secived,tsohytsoh,?ilpu,k&coregrof.di,orgn,ramytefasresworb,?moc?n&mtsp:.kcom,,yded,?ot&oq,pyrctfihs,?p&opilol,pa&-arusah,e&nalpkcab,tybeeb.1dkes,???r&e&tsneum-hf,vres&cisab,lautriv,??ial.sppa,?s&codehtdaer,gnihtbew,nemeis-om,pparevelc,t&acdnas,ekcit,??t&e&kcubtib,notorp,?i&belet,detfihs,gude,kecaps,?raedon.egats,s&ohg,udgniht.&cersid.&dvreser,tsuc,?dorp.tsuc,gnitset.&dvreser,tsuc,?ved.&dvreser,tsuc,????vgib.0ku,whs,x&bslprbv.g,cq,rotide,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?ohsdaerpsym,p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t??o&c,fni??pohs,stra?t&n?opsgolb,?www?ysrab,?e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e!tfarcdnah,??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???lasrepus,mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????rotsnoihsaf,tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????pohs&eht,iiawak,yub,?r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!.uj,ac?j??nd?o&g?h&pih?s!.&esab,xilpoh,ysrab,???lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew:erif,,e&gatskrelc,niln&igol,okoob,?tupmocegde,virdhsalfno,?krelc,lecrev,n&aecolatigidno,ur:.a,,?poon,remarf,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&a&cisum?sanes??bog?gro?l&autum?im??moc!.topsgolb,?pooc?rut?t&e&b?n??ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.&duolclautriv.elacs.sresu,topsgolb,???nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&csid?rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?lipuog,rianiretev??hny,i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?pohsdaerpsym,s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?moc?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?ik?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??pohsdaerpsym,ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,etisinim,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?ni?oc?topsgolb,ude?vog?xo,yldnerb.pohs,?a&c?p?tiug??c?e&dliub!.etisduolc,?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&em?gro?hcs?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.&nibook,oc,????rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&e&f?lacsne.xhp,?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???u&olcrim,rd,??e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n!.elbaeciton,??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?p&h21,ohsdaerpsym,?r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0rab,1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,irgevissam.saap.&1-&gs,nol,rf,yn,?2-&nol,yn,??nab-eht-ni,uolc&meaeboda,nievas.c&di-etsedron,itsalej,?xednay:.e&garots,tisbew,?,??e&c&narusnihtlaehezitavirp,rofelacs.j,?gdirbtib,ht-no-eciffo,l&acs&liat.ateb,noom,?ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?n&ilno-evreser,ozdop,?rehurht,s:abapus,,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,sirkcilc,tsohnnylf,?olb&evres,tsaf,??k&catsvano,eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?i&bed,llerk,??dcduabkcalb,i,pv-ni,?o&c-morf,duppa,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,h&bew,sdaerpsym,??pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&gde-ndc,suohsyub,t&isbeweruza,ys,??k&catstsaf,ekokohcs,?n&d&-won,d,golb,npv,?oitcnufduolc,?ppacitatseruza:.&2suts&ae,ew,?aisatsae,eporuetsew,sulartnec,?,s&a-skcik,ecca&-citats,duolc,??t,?t&adies,ce&ffeym,jorprot:.segap,,lespohs,?e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,oh&-spv:.citsalej.&cir,lta,sjn,?,gnik,???u&h,nyd,r:eakust.citsalej,,?ved-naissalta.dorp.ndc,x&inuemoh,spym,tsale.&1ots-slj,2ots-slj,3ots-slj,?unilemoh,?y&awetag-llawerif,ffijduolc:.&ed-1arf,su-1tsew,?,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?moc?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i!t.nepo.citsalej.duolc,?ol?r??n&a!lim?sl&ab?ub???b?c?e!en.cj,v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?ohsdaerpsym,s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f?m?utni??je3a3abgm--nx?kh?l!.&topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.&ude,vog:.ecivres,,??d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?moc?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?moc?o&c?dalusnoc?hon,?ten?ude??a&cmoc?f??e&b?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,lrupmet,s&pvtsaf,seccaduolc,?tsafym,vedumpw,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y!.gro,?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.&pohsdaerpsym,stelduolc.lem,topsgolb,??nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.topsgolb,?m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&3kl,a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,duolcrim,e&niram,rpcm,?g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,d&cm:.spv,,orue,?midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.&emon?gro?moc?t&ni?opsgolb,?ude???ed!.&enilnigol,gnigats-oned,hcetaidem,lecrev,o&ned,tpyrctfihs,?ppa-rettalp,s&egap,rekrow,?vr&esi,uc,?weiverpbuhtig,ylf,??ih?l!.&di?fnoc?gro?lim?moc?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?moc!.reliamym,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?moc?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex??rbgn--nx?s!.vog??x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot!.emyfilauqerp,??g?lp?p!ila??rot?ssin?wdaorb??b!.&duolcym,fo?hcetaidem,lim?moc!.topsgolb,?vog??ab?gur??c!.&ca?dtl?gro?lim?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??ten?vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?moc?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog?zib??edaca!.laiciffo,?ra??n&a&ffit?pmoc??os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c?ledif?n&ifx?ummoc!.&bdnevar,gon,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?moc!.topsgolb,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?jsg,moc?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&cos?gro?lop?m&oc?t??ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&duolcj,gro?lim?moc?t&en?ropeletzak.saapu,?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&e&nozlacol,tisgolb,?gnitfarc,otpaz,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур!.&арамас,бпс,гро,зиб,ичос,ксм,м&ок,ырк,?рим,я,??тйас?фр?юе?յահ?לארשי?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
 
   /**
    * If a hostname is not a key in the EXCLUDE map, and if removing its leftmost component results
@@ -50,7 +50,7 @@
    */
   public static final ImmutableMap<String, PublicSuffixType> UNDER =
       TrieParser.parseTrie(
-          "ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.&ecapsrebu,yksurf,?noz.notirt,t&atse.etupmoc,is.&hsmroftalp,tst,???gp?h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,lrihwyap,mme0,osseccandcved,s&t&cejboedonil,nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???n&c.moc.swanozama.&ble,etupmoc,?ur.edoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n?pa.&knalfhtron,repoleved,??r&b.mon?e??s&edoc.owo,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.&cimonotpyrc,hvo.&gnitsoh,saapbew,???u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&e&gats&gts,lcl,?rahbew,?gts,lcl,yawetag,?z&c.murtnecatem.duolc,yx.tibelet,??");
+          "ac.vedwa,d&b?i.ym.ssr,uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.&ecapsrebu,yksurf,?noz.notirt,t&atse.etupmoc,is.&areduolc,hsmroftalp,tst,???g&oog.tnetnocresu,p??h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,lrihwyap,mme0,osseccandcved,s&ecapsnaecolatigid,t&cejbo&edonil,rtluv,?nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???n&c.moc.swanozama.&ble,etupmoc,?ur.edoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n?pa.&knalfhtron,repoleved,tegeb,??r&b.mon?e??s&edoc.owo,noitulos.rehid,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.&cimonotpyrc,hvo.&gnitsoh,saapbew,???u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&e&gats&gts,lcl,?rahbew,?gts,lcl,yawetag,?z&c.murtnecatem.duolc,yx.tibelet,??");
 
   /**
    * The elements in this map would pass the UNDER test, but are known not to be public suffixes and
diff --git a/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java b/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
index dd77780..89cdadd 100644
--- a/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
+++ b/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
@@ -36,7 +36,7 @@
     while (idx < encodedLen) {
       idx += doParseTrieToBuilder(Queues.<CharSequence>newArrayDeque(), encoded, idx, builder);
     }
-    return builder.build();
+    return builder.buildOrThrow();
   }
 
   /**
diff --git a/pom.xml b/pom.xml
index 3cecc43..13dd098 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-parent</artifactId>
-  <version>31.0.1-jre</version>
+  <version>31.1-jre</version>
   <packaging>pom</packaging>
   <name>Guava Maven Parent</name>
   <description>Parent for guava artifacts</description>
@@ -18,6 +18,8 @@
     <checker-framework.version>3.12.0</checker-framework.version>
     <animal.sniffer.version>1.20</animal.sniffer.version>
     <maven-javadoc-plugin.version>3.1.0</maven-javadoc-plugin.version>
+    <!-- Empty for all JDKs but 9-12 -->
+    <maven-javadoc-plugin.additionalJOptions></maven-javadoc-plugin.additionalJOptions>
     <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
@@ -184,6 +186,7 @@
             </additionalOptions>
             <linksource>true</linksource>
             <source>8</source>
+            <additionalJOption>${maven-javadoc-plugin.additionalJOptions}</additionalJOption>
           </configuration>
           <executions>
             <execution>
@@ -270,7 +273,7 @@
       <dependency>
         <groupId>com.google.errorprone</groupId>
         <artifactId>error_prone_annotations</artifactId>
-        <version>2.7.1</version>
+        <version>2.11.0</version>
       </dependency>
       <dependency>
         <groupId>com.google.j2objc</groupId>
@@ -390,5 +393,23 @@
           </plugins>
       </build>
     </profile>
+    <profile>
+      <!--
+          Passes JDK 9-12-specific `no-module-directories` flag to Javadoc tool,
+          which is required to make symbol search work correctly in the generated
+          pages.
+
+          This flag does not exist on 8 and 13+ (https://bugs.openjdk.java.net/browse/JDK-8215582).
+
+          Consider removing it once our release and test scripts are migrated to a recent JDK (17+).
+       -->
+      <id>javadocs-jdk9-12</id>
+      <activation>
+        <jdk>[9,13)</jdk>
+      </activation>
+      <properties>
+        <maven-javadoc-plugin.additionalJOptions>--no-module-directories</maven-javadoc-plugin.additionalJOptions>
+      </properties>
+    </profile>
   </profiles>
 </project>
