Merge "Fix improper destination nesting with deep links" into androidx-main
diff --git a/annotation/annotation/api/current.txt b/annotation/annotation/api/current.txt
index 5d3123f..fcc1fa2 100644
--- a/annotation/annotation/api/current.txt
+++ b/annotation/annotation/api/current.txt
@@ -51,6 +51,13 @@
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface ContentView {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface DeprecatedSinceApi {
+    method public abstract int api();
+    method public abstract String message() default "";
+    property public abstract int api;
+    property public abstract String message;
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DimenRes {
   }
 
@@ -74,6 +81,9 @@
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DrawableRes {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface EmptySuper {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface FloatRange {
     method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
     method public abstract boolean fromInclusive() default true;
@@ -177,6 +187,9 @@
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface Nullable {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface OpenForTesting {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface PluralsRes {
   }
 
@@ -225,6 +238,9 @@
     enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ReturnThis {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Size {
     method public abstract long max() default java.lang.Long.MAX_VALUE;
     method public abstract long min() default java.lang.Long.MIN_VALUE;
diff --git a/annotation/annotation/api/public_plus_experimental_current.txt b/annotation/annotation/api/public_plus_experimental_current.txt
index 5d3123f..fcc1fa2 100644
--- a/annotation/annotation/api/public_plus_experimental_current.txt
+++ b/annotation/annotation/api/public_plus_experimental_current.txt
@@ -51,6 +51,13 @@
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface ContentView {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface DeprecatedSinceApi {
+    method public abstract int api();
+    method public abstract String message() default "";
+    property public abstract int api;
+    property public abstract String message;
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DimenRes {
   }
 
@@ -74,6 +81,9 @@
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DrawableRes {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface EmptySuper {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface FloatRange {
     method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
     method public abstract boolean fromInclusive() default true;
@@ -177,6 +187,9 @@
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface Nullable {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface OpenForTesting {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface PluralsRes {
   }
 
@@ -225,6 +238,9 @@
     enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ReturnThis {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Size {
     method public abstract long max() default java.lang.Long.MAX_VALUE;
     method public abstract long min() default java.lang.Long.MIN_VALUE;
diff --git a/annotation/annotation/api/restricted_current.txt b/annotation/annotation/api/restricted_current.txt
index 5d3123f..fcc1fa2 100644
--- a/annotation/annotation/api/restricted_current.txt
+++ b/annotation/annotation/api/restricted_current.txt
@@ -51,6 +51,13 @@
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface ContentView {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface DeprecatedSinceApi {
+    method public abstract int api();
+    method public abstract String message() default "";
+    property public abstract int api;
+    property public abstract String message;
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DimenRes {
   }
 
@@ -74,6 +81,9 @@
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DrawableRes {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface EmptySuper {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface FloatRange {
     method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
     method public abstract boolean fromInclusive() default true;
@@ -177,6 +187,9 @@
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface Nullable {
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface OpenForTesting {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface PluralsRes {
   }
 
@@ -225,6 +238,9 @@
     enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
   }
 
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ReturnThis {
+  }
+
   @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Size {
     method public abstract long max() default java.lang.Long.MAX_VALUE;
     method public abstract long min() default java.lang.Long.MIN_VALUE;
diff --git a/annotation/annotation/src/main/java/androidx/annotation/DeprecatedSinceApi.kt b/annotation/annotation/src/main/java/androidx/annotation/DeprecatedSinceApi.kt
new file mode 100644
index 0000000..b8bb279
--- /dev/null
+++ b/annotation/annotation/src/main/java/androidx/annotation/DeprecatedSinceApi.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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 androidx.annotation
+
+import kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS
+import kotlin.annotation.AnnotationTarget.CLASS
+import kotlin.annotation.AnnotationTarget.CONSTRUCTOR
+import kotlin.annotation.AnnotationTarget.FUNCTION
+import kotlin.annotation.AnnotationTarget.PROPERTY_GETTER
+import kotlin.annotation.AnnotationTarget.PROPERTY_SETTER
+
+/**
+ * Denotes that this API is only useful until the given API level; after that,
+ * a more suitable platform API is available.
+ */
+@MustBeDocumented
+@Retention(AnnotationRetention.BINARY)
+@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, ANNOTATION_CLASS, CLASS, CONSTRUCTOR)
+public annotation class DeprecatedSinceApi(
+    /** The API level where it is deprecated. */
+    val api: Int,
+    /** Suggested replacement. */
+    val message: String = ""
+)
diff --git a/annotation/annotation/src/main/java/androidx/annotation/EmptySuper.kt b/annotation/annotation/src/main/java/androidx/annotation/EmptySuper.kt
new file mode 100644
index 0000000..bef5c74
--- /dev/null
+++ b/annotation/annotation/src/main/java/androidx/annotation/EmptySuper.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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 androidx.annotation
+
+import kotlin.annotation.AnnotationTarget.FUNCTION
+
+/**
+ * Denotes that any overriding methods should **not** invoke this method, since it is defined
+ * to be empty (or perhaps contain other code not intended to be run when overridden).
+ *
+ * Example:
+ * ```
+ * @EmptySuper
+ * public void onFocus() { }
+ * ```
+ */
+@MustBeDocumented
+@Retention(AnnotationRetention.BINARY)
+@Target(FUNCTION)
+public annotation class EmptySuper
diff --git a/annotation/annotation/src/main/java/androidx/annotation/OpenForTesting.kt b/annotation/annotation/src/main/java/androidx/annotation/OpenForTesting.kt
new file mode 100644
index 0000000..6134b85
--- /dev/null
+++ b/annotation/annotation/src/main/java/androidx/annotation/OpenForTesting.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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 androidx.annotation
+
+import kotlin.annotation.AnnotationRetention.BINARY
+import kotlin.annotation.AnnotationTarget.CLASS
+import kotlin.annotation.AnnotationTarget.FUNCTION
+import kotlin.annotation.AnnotationTarget.PROPERTY_GETTER
+import kotlin.annotation.AnnotationTarget.PROPERTY_SETTER
+
+/**
+ * Denotes that this class or method is only `open` to allow unit testing.
+ * Any subclass or override is only allowed from tests.
+ */
+@MustBeDocumented
+@Retention(BINARY)
+@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, CLASS)
+public annotation class OpenForTesting
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ReturnThis.kt b/annotation/annotation/src/main/java/androidx/annotation/ReturnThis.kt
new file mode 100644
index 0000000..bd8feca
--- /dev/null
+++ b/annotation/annotation/src/main/java/androidx/annotation/ReturnThis.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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 androidx.annotation
+
+import kotlin.annotation.AnnotationTarget.CLASS
+import kotlin.annotation.AnnotationTarget.FUNCTION
+
+/**
+ * Denotes that any overriding methods should `return this`.
+ */
+@MustBeDocumented
+@Retention(AnnotationRetention.BINARY)
+@Target(FUNCTION, CLASS)
+public annotation class ReturnThis
diff --git a/appsearch/appsearch-builtin-types/api/current.txt b/appsearch/appsearch-builtin-types/api/current.txt
index e387d30..364c227 100644
--- a/appsearch/appsearch-builtin-types/api/current.txt
+++ b/appsearch/appsearch-builtin-types/api/current.txt
@@ -12,11 +12,13 @@
 
 package androidx.appsearch.builtintypes {
 
-  @androidx.appsearch.annotation.Document(name="builtin:Alarm") public class Alarm {
-    method public long getBlackoutEndTimeMillis();
-    method public long getBlackoutStartTimeMillis();
+  @androidx.appsearch.annotation.Document(name="builtin:Alarm") public final class Alarm {
+    method public String? getBlackoutPeriodEndDate();
+    method public String? getBlackoutPeriodStartDate();
     method public long getCreationTimestampMillis();
     method public int[]? getDaysOfWeek();
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method @IntRange(from=0, to=23) public int getHour();
     method public String getId();
     method @IntRange(from=0, to=59) public int getMinute();
@@ -25,20 +27,20 @@
     method public androidx.appsearch.builtintypes.AlarmInstance? getNextInstance();
     method public androidx.appsearch.builtintypes.AlarmInstance? getPreviousInstance();
     method public String? getRingtone();
-    method public int getScore();
-    method public long getTtlMillis();
     method public boolean isEnabled();
-    method public boolean isVibrate();
+    method public boolean shouldVibrate();
   }
 
   public static final class Alarm.Builder {
     ctor public Alarm.Builder(String, String);
     ctor public Alarm.Builder(androidx.appsearch.builtintypes.Alarm);
     method public androidx.appsearch.builtintypes.Alarm build();
-    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutEndTimeMillis(long);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutStartTimeMillis(long);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutPeriodEndDate(String?);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutPeriodStartDate(String?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setCreationTimestampMillis(long);
     method public androidx.appsearch.builtintypes.Alarm.Builder setDaysOfWeek(@IntRange(from=java.util.Calendar.SUNDAY, to=java.util.Calendar.SATURDAY) int...);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.Alarm.Builder setEnabled(boolean);
     method public androidx.appsearch.builtintypes.Alarm.Builder setHour(@IntRange(from=0, to=23) int);
     method public androidx.appsearch.builtintypes.Alarm.Builder setMinute(@IntRange(from=0, to=59) int);
@@ -46,24 +48,18 @@
     method public androidx.appsearch.builtintypes.Alarm.Builder setNextInstance(androidx.appsearch.builtintypes.AlarmInstance?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setPreviousInstance(androidx.appsearch.builtintypes.AlarmInstance?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setRingtone(String?);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setScore(int);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setVibrate(boolean);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setShouldVibrate(boolean);
   }
 
-  @androidx.appsearch.annotation.Document(name="builtin:AlarmInstance") public class AlarmInstance {
+  @androidx.appsearch.annotation.Document(name="builtin:AlarmInstance") public final class AlarmInstance {
     method public long getCreationTimestampMillis();
-    method @IntRange(from=1, to=31) public int getDay();
-    method @IntRange(from=0, to=23) public int getHour();
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method public String getId();
-    method @IntRange(from=0, to=59) public int getMinute();
-    method @IntRange(from=java.util.Calendar.JANUARY, to=java.util.Calendar.DECEMBER) public int getMonth();
     method public String getNamespace();
-    method public int getScore();
+    method public String getScheduledTime();
     method public long getSnoozeDurationMillis();
     method public int getStatus();
-    method public long getTtlMillis();
-    method public int getYear();
     field public static final int STATUS_DISMISSED = 3; // 0x3
     field public static final int STATUS_FIRING = 2; // 0x2
     field public static final int STATUS_MISSED = 5; // 0x5
@@ -73,35 +69,34 @@
   }
 
   public static final class AlarmInstance.Builder {
-    ctor public AlarmInstance.Builder(String, String);
+    ctor public AlarmInstance.Builder(String, String, String);
     ctor public AlarmInstance.Builder(androidx.appsearch.builtintypes.AlarmInstance);
     method public androidx.appsearch.builtintypes.AlarmInstance build();
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setCreationTimestampMillis(long);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDay(@IntRange(from=1, to=31) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setHour(@IntRange(from=0, to=23) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setMinute(@IntRange(from=0, to=59) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setMonth(@IntRange(from=java.util.Calendar.JANUARY, to=java.util.Calendar.DECEMBER) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setScore(int);
+    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setSnoozeDurationMillis(long);
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setStatus(int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setYear(int);
   }
 
-  @androidx.appsearch.annotation.Document(name="builtin:Timer") public class Timer {
+  @androidx.appsearch.annotation.Document(name="builtin:Timer") public final class Timer {
+    method public int getBootCount();
     method public long getCreationTimestampMillis();
+    method public long getCurrentRemainingTime(android.content.Context);
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method public long getDurationMillis();
+    method public long getExpirationTimeMillis(android.content.Context);
     method public String getId();
     method public String? getName();
     method public String getNamespace();
-    method public long getRemainingTimeMillis();
+    method public long getOriginalDurationMillis();
+    method public long getRemainingTimeMillisSinceUpdate();
     method public String? getRingtone();
-    method public int getScore();
     method public long getStartTimeMillis();
     method public long getStartTimeMillisInElapsedRealtime();
     method public int getStatus();
-    method public long getTtlMillis();
-    method public boolean isVibrate();
+    method public boolean shouldVibrate();
     field public static final int STATUS_EXPIRED = 3; // 0x3
     field public static final int STATUS_MISSED = 4; // 0x4
     field public static final int STATUS_PAUSED = 2; // 0x2
@@ -115,16 +110,17 @@
     ctor public Timer.Builder(androidx.appsearch.builtintypes.Timer);
     method public androidx.appsearch.builtintypes.Timer build();
     method public androidx.appsearch.builtintypes.Timer.Builder setCreationTimestampMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.Timer.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setDurationMillis(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setName(String?);
-    method public androidx.appsearch.builtintypes.Timer.Builder setRemainingTimeMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setOriginalDurationMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setRemainingTimeMillisSinceUpdate(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setRingtone(String?);
-    method public androidx.appsearch.builtintypes.Timer.Builder setScore(int);
-    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(long);
-    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillisInElapsedRealtime(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setShouldVibrate(boolean);
+    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(long, long, int);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(android.content.Context, long, long);
     method public androidx.appsearch.builtintypes.Timer.Builder setStatus(int);
-    method public androidx.appsearch.builtintypes.Timer.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.Timer.Builder setVibrate(boolean);
   }
 
 }
diff --git a/appsearch/appsearch-builtin-types/api/public_plus_experimental_current.txt b/appsearch/appsearch-builtin-types/api/public_plus_experimental_current.txt
index e387d30..364c227 100644
--- a/appsearch/appsearch-builtin-types/api/public_plus_experimental_current.txt
+++ b/appsearch/appsearch-builtin-types/api/public_plus_experimental_current.txt
@@ -12,11 +12,13 @@
 
 package androidx.appsearch.builtintypes {
 
-  @androidx.appsearch.annotation.Document(name="builtin:Alarm") public class Alarm {
-    method public long getBlackoutEndTimeMillis();
-    method public long getBlackoutStartTimeMillis();
+  @androidx.appsearch.annotation.Document(name="builtin:Alarm") public final class Alarm {
+    method public String? getBlackoutPeriodEndDate();
+    method public String? getBlackoutPeriodStartDate();
     method public long getCreationTimestampMillis();
     method public int[]? getDaysOfWeek();
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method @IntRange(from=0, to=23) public int getHour();
     method public String getId();
     method @IntRange(from=0, to=59) public int getMinute();
@@ -25,20 +27,20 @@
     method public androidx.appsearch.builtintypes.AlarmInstance? getNextInstance();
     method public androidx.appsearch.builtintypes.AlarmInstance? getPreviousInstance();
     method public String? getRingtone();
-    method public int getScore();
-    method public long getTtlMillis();
     method public boolean isEnabled();
-    method public boolean isVibrate();
+    method public boolean shouldVibrate();
   }
 
   public static final class Alarm.Builder {
     ctor public Alarm.Builder(String, String);
     ctor public Alarm.Builder(androidx.appsearch.builtintypes.Alarm);
     method public androidx.appsearch.builtintypes.Alarm build();
-    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutEndTimeMillis(long);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutStartTimeMillis(long);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutPeriodEndDate(String?);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutPeriodStartDate(String?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setCreationTimestampMillis(long);
     method public androidx.appsearch.builtintypes.Alarm.Builder setDaysOfWeek(@IntRange(from=java.util.Calendar.SUNDAY, to=java.util.Calendar.SATURDAY) int...);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.Alarm.Builder setEnabled(boolean);
     method public androidx.appsearch.builtintypes.Alarm.Builder setHour(@IntRange(from=0, to=23) int);
     method public androidx.appsearch.builtintypes.Alarm.Builder setMinute(@IntRange(from=0, to=59) int);
@@ -46,24 +48,18 @@
     method public androidx.appsearch.builtintypes.Alarm.Builder setNextInstance(androidx.appsearch.builtintypes.AlarmInstance?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setPreviousInstance(androidx.appsearch.builtintypes.AlarmInstance?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setRingtone(String?);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setScore(int);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setVibrate(boolean);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setShouldVibrate(boolean);
   }
 
-  @androidx.appsearch.annotation.Document(name="builtin:AlarmInstance") public class AlarmInstance {
+  @androidx.appsearch.annotation.Document(name="builtin:AlarmInstance") public final class AlarmInstance {
     method public long getCreationTimestampMillis();
-    method @IntRange(from=1, to=31) public int getDay();
-    method @IntRange(from=0, to=23) public int getHour();
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method public String getId();
-    method @IntRange(from=0, to=59) public int getMinute();
-    method @IntRange(from=java.util.Calendar.JANUARY, to=java.util.Calendar.DECEMBER) public int getMonth();
     method public String getNamespace();
-    method public int getScore();
+    method public String getScheduledTime();
     method public long getSnoozeDurationMillis();
     method public int getStatus();
-    method public long getTtlMillis();
-    method public int getYear();
     field public static final int STATUS_DISMISSED = 3; // 0x3
     field public static final int STATUS_FIRING = 2; // 0x2
     field public static final int STATUS_MISSED = 5; // 0x5
@@ -73,35 +69,34 @@
   }
 
   public static final class AlarmInstance.Builder {
-    ctor public AlarmInstance.Builder(String, String);
+    ctor public AlarmInstance.Builder(String, String, String);
     ctor public AlarmInstance.Builder(androidx.appsearch.builtintypes.AlarmInstance);
     method public androidx.appsearch.builtintypes.AlarmInstance build();
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setCreationTimestampMillis(long);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDay(@IntRange(from=1, to=31) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setHour(@IntRange(from=0, to=23) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setMinute(@IntRange(from=0, to=59) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setMonth(@IntRange(from=java.util.Calendar.JANUARY, to=java.util.Calendar.DECEMBER) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setScore(int);
+    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setSnoozeDurationMillis(long);
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setStatus(int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setYear(int);
   }
 
-  @androidx.appsearch.annotation.Document(name="builtin:Timer") public class Timer {
+  @androidx.appsearch.annotation.Document(name="builtin:Timer") public final class Timer {
+    method public int getBootCount();
     method public long getCreationTimestampMillis();
+    method public long getCurrentRemainingTime(android.content.Context);
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method public long getDurationMillis();
+    method public long getExpirationTimeMillis(android.content.Context);
     method public String getId();
     method public String? getName();
     method public String getNamespace();
-    method public long getRemainingTimeMillis();
+    method public long getOriginalDurationMillis();
+    method public long getRemainingTimeMillisSinceUpdate();
     method public String? getRingtone();
-    method public int getScore();
     method public long getStartTimeMillis();
     method public long getStartTimeMillisInElapsedRealtime();
     method public int getStatus();
-    method public long getTtlMillis();
-    method public boolean isVibrate();
+    method public boolean shouldVibrate();
     field public static final int STATUS_EXPIRED = 3; // 0x3
     field public static final int STATUS_MISSED = 4; // 0x4
     field public static final int STATUS_PAUSED = 2; // 0x2
@@ -115,16 +110,17 @@
     ctor public Timer.Builder(androidx.appsearch.builtintypes.Timer);
     method public androidx.appsearch.builtintypes.Timer build();
     method public androidx.appsearch.builtintypes.Timer.Builder setCreationTimestampMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.Timer.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setDurationMillis(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setName(String?);
-    method public androidx.appsearch.builtintypes.Timer.Builder setRemainingTimeMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setOriginalDurationMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setRemainingTimeMillisSinceUpdate(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setRingtone(String?);
-    method public androidx.appsearch.builtintypes.Timer.Builder setScore(int);
-    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(long);
-    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillisInElapsedRealtime(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setShouldVibrate(boolean);
+    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(long, long, int);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(android.content.Context, long, long);
     method public androidx.appsearch.builtintypes.Timer.Builder setStatus(int);
-    method public androidx.appsearch.builtintypes.Timer.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.Timer.Builder setVibrate(boolean);
   }
 
 }
diff --git a/appsearch/appsearch-builtin-types/api/restricted_current.txt b/appsearch/appsearch-builtin-types/api/restricted_current.txt
index b69955c..0b067df 100644
--- a/appsearch/appsearch-builtin-types/api/restricted_current.txt
+++ b/appsearch/appsearch-builtin-types/api/restricted_current.txt
@@ -14,11 +14,13 @@
 
 package androidx.appsearch.builtintypes {
 
-  @androidx.appsearch.annotation.Document(name="builtin:Alarm") public class Alarm {
-    method public long getBlackoutEndTimeMillis();
-    method public long getBlackoutStartTimeMillis();
+  @androidx.appsearch.annotation.Document(name="builtin:Alarm") public final class Alarm {
+    method public String? getBlackoutPeriodEndDate();
+    method public String? getBlackoutPeriodStartDate();
     method public long getCreationTimestampMillis();
     method public int[]? getDaysOfWeek();
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method @IntRange(from=0, to=23) public int getHour();
     method public String getId();
     method @IntRange(from=0, to=59) public int getMinute();
@@ -27,20 +29,20 @@
     method public androidx.appsearch.builtintypes.AlarmInstance? getNextInstance();
     method public androidx.appsearch.builtintypes.AlarmInstance? getPreviousInstance();
     method public String? getRingtone();
-    method public int getScore();
-    method public long getTtlMillis();
     method public boolean isEnabled();
-    method public boolean isVibrate();
+    method public boolean shouldVibrate();
   }
 
   public static final class Alarm.Builder {
     ctor public Alarm.Builder(String, String);
     ctor public Alarm.Builder(androidx.appsearch.builtintypes.Alarm);
     method public androidx.appsearch.builtintypes.Alarm build();
-    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutEndTimeMillis(long);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutStartTimeMillis(long);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutPeriodEndDate(String?);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setBlackoutPeriodStartDate(String?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setCreationTimestampMillis(long);
     method public androidx.appsearch.builtintypes.Alarm.Builder setDaysOfWeek(@IntRange(from=java.util.Calendar.SUNDAY, to=java.util.Calendar.SATURDAY) int...);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.Alarm.Builder setEnabled(boolean);
     method public androidx.appsearch.builtintypes.Alarm.Builder setHour(@IntRange(from=0, to=23) int);
     method public androidx.appsearch.builtintypes.Alarm.Builder setMinute(@IntRange(from=0, to=59) int);
@@ -48,24 +50,18 @@
     method public androidx.appsearch.builtintypes.Alarm.Builder setNextInstance(androidx.appsearch.builtintypes.AlarmInstance?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setPreviousInstance(androidx.appsearch.builtintypes.AlarmInstance?);
     method public androidx.appsearch.builtintypes.Alarm.Builder setRingtone(String?);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setScore(int);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.Alarm.Builder setVibrate(boolean);
+    method public androidx.appsearch.builtintypes.Alarm.Builder setShouldVibrate(boolean);
   }
 
-  @androidx.appsearch.annotation.Document(name="builtin:AlarmInstance") public class AlarmInstance {
+  @androidx.appsearch.annotation.Document(name="builtin:AlarmInstance") public final class AlarmInstance {
     method public long getCreationTimestampMillis();
-    method @IntRange(from=1, to=31) public int getDay();
-    method @IntRange(from=0, to=23) public int getHour();
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method public String getId();
-    method @IntRange(from=0, to=59) public int getMinute();
-    method @IntRange(from=java.util.Calendar.JANUARY, to=java.util.Calendar.DECEMBER) public int getMonth();
     method public String getNamespace();
-    method public int getScore();
+    method public String getScheduledTime();
     method public long getSnoozeDurationMillis();
     method public int getStatus();
-    method public long getTtlMillis();
-    method public int getYear();
     field public static final int STATUS_DISMISSED = 3; // 0x3
     field public static final int STATUS_FIRING = 2; // 0x2
     field public static final int STATUS_MISSED = 5; // 0x5
@@ -75,35 +71,34 @@
   }
 
   public static final class AlarmInstance.Builder {
-    ctor public AlarmInstance.Builder(String, String);
+    ctor public AlarmInstance.Builder(String, String, String);
     ctor public AlarmInstance.Builder(androidx.appsearch.builtintypes.AlarmInstance);
     method public androidx.appsearch.builtintypes.AlarmInstance build();
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setCreationTimestampMillis(long);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDay(@IntRange(from=1, to=31) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setHour(@IntRange(from=0, to=23) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setMinute(@IntRange(from=0, to=59) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setMonth(@IntRange(from=java.util.Calendar.JANUARY, to=java.util.Calendar.DECEMBER) int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setScore(int);
+    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setSnoozeDurationMillis(long);
     method public androidx.appsearch.builtintypes.AlarmInstance.Builder setStatus(int);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.AlarmInstance.Builder setYear(int);
   }
 
-  @androidx.appsearch.annotation.Document(name="builtin:Timer") public class Timer {
+  @androidx.appsearch.annotation.Document(name="builtin:Timer") public final class Timer {
+    method public int getBootCount();
     method public long getCreationTimestampMillis();
+    method public long getCurrentRemainingTime(android.content.Context);
+    method public int getDocumentScore();
+    method public long getDocumentTtlMillis();
     method public long getDurationMillis();
+    method public long getExpirationTimeMillis(android.content.Context);
     method public String getId();
     method public String? getName();
     method public String getNamespace();
-    method public long getRemainingTimeMillis();
+    method public long getOriginalDurationMillis();
+    method public long getRemainingTimeMillisSinceUpdate();
     method public String? getRingtone();
-    method public int getScore();
     method public long getStartTimeMillis();
     method public long getStartTimeMillisInElapsedRealtime();
     method public int getStatus();
-    method public long getTtlMillis();
-    method public boolean isVibrate();
+    method public boolean shouldVibrate();
     field public static final int STATUS_EXPIRED = 3; // 0x3
     field public static final int STATUS_MISSED = 4; // 0x4
     field public static final int STATUS_PAUSED = 2; // 0x2
@@ -117,16 +112,17 @@
     ctor public Timer.Builder(androidx.appsearch.builtintypes.Timer);
     method public androidx.appsearch.builtintypes.Timer build();
     method public androidx.appsearch.builtintypes.Timer.Builder setCreationTimestampMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setDocumentScore(int);
+    method public androidx.appsearch.builtintypes.Timer.Builder setDocumentTtlMillis(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setDurationMillis(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setName(String?);
-    method public androidx.appsearch.builtintypes.Timer.Builder setRemainingTimeMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setOriginalDurationMillis(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setRemainingTimeMillisSinceUpdate(long);
     method public androidx.appsearch.builtintypes.Timer.Builder setRingtone(String?);
-    method public androidx.appsearch.builtintypes.Timer.Builder setScore(int);
-    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(long);
-    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillisInElapsedRealtime(long);
+    method public androidx.appsearch.builtintypes.Timer.Builder setShouldVibrate(boolean);
+    method public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(long, long, int);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) public androidx.appsearch.builtintypes.Timer.Builder setStartTimeMillis(android.content.Context, long, long);
     method public androidx.appsearch.builtintypes.Timer.Builder setStatus(int);
-    method public androidx.appsearch.builtintypes.Timer.Builder setTtlMillis(long);
-    method public androidx.appsearch.builtintypes.Timer.Builder setVibrate(boolean);
   }
 
 }
diff --git a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/app/ShortcutAdapterTest.java b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/app/ShortcutAdapterTest.java
index 5c8188f..f1b0573 100644
--- a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/app/ShortcutAdapterTest.java
+++ b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/app/ShortcutAdapterTest.java
@@ -106,16 +106,15 @@
 
     private static Timer timer(@NonNull final String id, @NonNull final String name) {
         return new Timer.Builder(ShortcutAdapter.DEFAULT_NAMESPACE, id)
-                .setScore(1)
-                .setTtlMillis(6000)
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(6000)
                 .setCreationTimestampMillis(100)
                 .setName(name)
                 .setDurationMillis(1000)
-                .setRemainingTimeMillis(500)
+                .setRemainingTimeMillisSinceUpdate(500)
                 .setRingtone("clock://ringtone/1")
                 .setStatus(Timer.STATUS_STARTED)
-                .setVibrate(true)
-                .setStartTimeMillis(750)
+                .setShouldVibrate(true)
                 .build();
     }
 }
diff --git a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmInstanceTest.java b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmInstanceTest.java
index b37aae7e..f2e7df4 100644
--- a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmInstanceTest.java
+++ b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmInstanceTest.java
@@ -22,49 +22,35 @@
 
 import org.junit.Test;
 
-import java.util.Calendar;
-
 public class AlarmInstanceTest {
     @Test
     public void testBuilder() {
-        AlarmInstance alarmInstance = new AlarmInstance.Builder("namespace", "id")
-                .setScore(1)
-                .setTtlMillis(20000)
+        AlarmInstance alarmInstance = new AlarmInstance.Builder(
+                "namespace", "id", "2022-12-01T07:30:00")
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(20000)
                 .setCreationTimestampMillis(100)
-                .setYear(2022)
-                .setMonth(Calendar.DECEMBER)
-                .setDay(1)
-                .setHour(7)
-                .setMinute(30)
                 .setStatus(AlarmInstance.STATUS_SCHEDULED)
                 .setSnoozeDurationMillis(10000)
                 .build();
 
         assertThat(alarmInstance.getNamespace()).isEqualTo("namespace");
         assertThat(alarmInstance.getId()).isEqualTo("id");
-        assertThat(alarmInstance.getScore()).isEqualTo(1);
-        assertThat(alarmInstance.getTtlMillis()).isEqualTo(20000);
+        assertThat(alarmInstance.getDocumentScore()).isEqualTo(1);
+        assertThat(alarmInstance.getDocumentTtlMillis()).isEqualTo(20000);
         assertThat(alarmInstance.getCreationTimestampMillis()).isEqualTo(100);
-        assertThat(alarmInstance.getYear()).isEqualTo(2022);
-        assertThat(alarmInstance.getMonth()).isEqualTo(Calendar.DECEMBER);
-        assertThat(alarmInstance.getDay()).isEqualTo(1);
-        assertThat(alarmInstance.getHour()).isEqualTo(7);
-        assertThat(alarmInstance.getMinute()).isEqualTo(30);
+        assertThat(alarmInstance.getScheduledTime()).isEqualTo("2022-12-01T07:30:00");
         assertThat(alarmInstance.getStatus()).isEqualTo(1);
         assertThat(alarmInstance.getSnoozeDurationMillis()).isEqualTo(10000);
     }
 
     @Test
     public void testBuilderCopy_returnsAlarmInstanceWithAllFieldsCopied() {
-        AlarmInstance alarmInstance1 = new AlarmInstance.Builder("namespace", "id")
-                .setScore(1)
-                .setTtlMillis(20000)
+        AlarmInstance alarmInstance1 = new AlarmInstance.Builder(
+                "namespace", "id", "2022-12-01T07:30:00")
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(20000)
                 .setCreationTimestampMillis(100)
-                .setYear(2022)
-                .setMonth(Calendar.DECEMBER)
-                .setDay(1)
-                .setHour(7)
-                .setMinute(30)
                 .setStatus(AlarmInstance.STATUS_SCHEDULED)
                 .setSnoozeDurationMillis(10000)
                 .build();
@@ -72,15 +58,12 @@
         AlarmInstance alarmInstance2 = new AlarmInstance.Builder(alarmInstance1).build();
         assertThat(alarmInstance1.getNamespace()).isEqualTo(alarmInstance2.getNamespace());
         assertThat(alarmInstance1.getId()).isEqualTo(alarmInstance2.getId());
-        assertThat(alarmInstance1.getScore()).isEqualTo(alarmInstance2.getScore());
-        assertThat(alarmInstance1.getTtlMillis()).isEqualTo(alarmInstance2.getTtlMillis());
+        assertThat(alarmInstance1.getDocumentScore()).isEqualTo(alarmInstance2.getDocumentScore());
+        assertThat(alarmInstance1.getDocumentTtlMillis())
+                .isEqualTo(alarmInstance2.getDocumentTtlMillis());
         assertThat(alarmInstance1.getCreationTimestampMillis())
                 .isEqualTo(alarmInstance2.getCreationTimestampMillis());
-        assertThat(alarmInstance1.getYear()).isEqualTo(alarmInstance2.getYear());
-        assertThat(alarmInstance1.getMonth()).isEqualTo(alarmInstance2.getMonth());
-        assertThat(alarmInstance1.getDay()).isEqualTo(alarmInstance2.getDay());
-        assertThat(alarmInstance1.getHour()).isEqualTo(alarmInstance2.getHour());
-        assertThat(alarmInstance1.getMinute()).isEqualTo(alarmInstance2.getMinute());
+        assertThat(alarmInstance1.getScheduledTime()).isEqualTo(alarmInstance2.getScheduledTime());
         assertThat(alarmInstance1.getStatus()).isEqualTo(alarmInstance2.getStatus());
         assertThat(alarmInstance1.getSnoozeDurationMillis())
                 .isEqualTo(alarmInstance2.getSnoozeDurationMillis());
@@ -88,15 +71,11 @@
 
     @Test
     public void testToGenericDocument() throws Exception {
-        AlarmInstance alarmInstance = new AlarmInstance.Builder("namespace", "id")
-                .setScore(1)
-                .setTtlMillis(20000)
+        AlarmInstance alarmInstance = new AlarmInstance.Builder(
+                "namespace", "id", "2022-12-01T07:30:00")
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(20000)
                 .setCreationTimestampMillis(100)
-                .setYear(2022)
-                .setMonth(Calendar.DECEMBER)
-                .setDay(1)
-                .setHour(7)
-                .setMinute(30)
                 .setStatus(AlarmInstance.STATUS_SCHEDULED)
                 .setSnoozeDurationMillis(10000)
                 .build();
@@ -108,12 +87,7 @@
         assertThat(genericDocument.getScore()).isEqualTo(1);
         assertThat(genericDocument.getTtlMillis()).isEqualTo(20000);
         assertThat(genericDocument.getCreationTimestampMillis()).isEqualTo(100);
-        assertThat(genericDocument.getPropertyLong("year")).isEqualTo(2022);
-        assertThat(genericDocument.getPropertyLong("month")).isEqualTo(Calendar.DECEMBER);
-        assertThat(genericDocument.getPropertyLong("day")).isEqualTo(1);
-        assertThat(genericDocument.getPropertyLong("hour")).isEqualTo(7);
-        assertThat(genericDocument.getPropertyLong("minute")).isEqualTo(30);
-        assertThat(genericDocument.getPropertyLong("status")).isEqualTo(1);
-        assertThat(genericDocument.getPropertyLong("snoozeDurationMillis")).isEqualTo(10000);
+        assertThat(genericDocument.getPropertyString("scheduledTime"))
+                .isEqualTo("2022-12-01T07:30:00");
     }
 }
diff --git a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmTest.java b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmTest.java
index b953f60..201083a 100644
--- a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmTest.java
+++ b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/AlarmTest.java
@@ -29,13 +29,15 @@
 public class AlarmTest {
     @Test
     public void testBuilder() {
-        AlarmInstance alarmInstance1 = new AlarmInstance.Builder("namespace", "instanceId1")
+        AlarmInstance alarmInstance1 = new AlarmInstance.Builder(
+                "namespace", "instanceId1", "2022-01-01T00:00:00")
                 .build();
-        AlarmInstance alarmInstance2 = new AlarmInstance.Builder("namespace", "instanceId2")
+        AlarmInstance alarmInstance2 = new AlarmInstance.Builder(
+                "namespace", "instanceId2", "2022-01-02T00:00:00")
                 .build();
         Alarm alarm = new Alarm.Builder("namespace", "id")
-                .setScore(1)
-                .setTtlMillis(20000)
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(20000)
                 .setCreationTimestampMillis(100)
                 .setName("my alarm")
                 .setEnabled(true)
@@ -43,18 +45,18 @@
                         Calendar.THURSDAY, Calendar.FRIDAY)
                 .setHour(12)
                 .setMinute(0)
-                .setBlackoutStartTimeMillis(1000)
-                .setBlackoutEndTimeMillis(2000)
+                .setBlackoutPeriodStartDate("2022-01-14")
+                .setBlackoutPeriodEndDate("2022-02-14")
                 .setRingtone("clock://ringtone/1")
-                .setVibrate(true)
+                .setShouldVibrate(true)
                 .setPreviousInstance(alarmInstance1)
                 .setNextInstance(alarmInstance2)
                 .build();
 
         assertThat(alarm.getNamespace()).isEqualTo("namespace");
         assertThat(alarm.getId()).isEqualTo("id");
-        assertThat(alarm.getScore()).isEqualTo(1);
-        assertThat(alarm.getTtlMillis()).isEqualTo(20000);
+        assertThat(alarm.getDocumentScore()).isEqualTo(1);
+        assertThat(alarm.getDocumentTtlMillis()).isEqualTo(20000);
         assertThat(alarm.getCreationTimestampMillis()).isEqualTo(100);
         assertThat(alarm.getName()).isEqualTo("my alarm");
         assertThat(alarm.isEnabled()).isTrue();
@@ -62,23 +64,25 @@
                 Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY);
         assertThat(alarm.getHour()).isEqualTo(12);
         assertThat(alarm.getMinute()).isEqualTo(0);
-        assertThat(alarm.getBlackoutStartTimeMillis()).isEqualTo(1000);
-        assertThat(alarm.getBlackoutEndTimeMillis()).isEqualTo(2000);
+        assertThat(alarm.getBlackoutPeriodStartDate()).isEqualTo("2022-01-14");
+        assertThat(alarm.getBlackoutPeriodEndDate()).isEqualTo("2022-02-14");
         assertThat(alarm.getRingtone()).isEqualTo("clock://ringtone/1");
-        assertThat(alarm.isVibrate()).isTrue();
+        assertThat(alarm.shouldVibrate()).isTrue();
         assertThat(alarm.getPreviousInstance()).isEqualTo(alarmInstance1);
         assertThat(alarm.getNextInstance()).isEqualTo(alarmInstance2);
     }
 
     @Test
     public void testBuilderCopy_returnsAlarmWithAllFieldsCopied() {
-        AlarmInstance alarmInstance1 = new AlarmInstance.Builder("namespace", "instanceId1")
+        AlarmInstance alarmInstance1 = new AlarmInstance.Builder(
+                "namespace", "instanceId1", "2022-01-01T00:00:00")
                 .build();
-        AlarmInstance alarmInstance2 = new AlarmInstance.Builder("namespace", "instanceId2")
+        AlarmInstance alarmInstance2 = new AlarmInstance.Builder(
+                "namespace", "instanceId2", "2022-01-02T00:00:00")
                 .build();
         Alarm alarm1 = new Alarm.Builder("namespace", "id")
-                .setScore(1)
-                .setTtlMillis(20000)
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(20000)
                 .setCreationTimestampMillis(100)
                 .setName("my alarm")
                 .setEnabled(true)
@@ -86,10 +90,10 @@
                         Calendar.THURSDAY, Calendar.FRIDAY)
                 .setHour(12)
                 .setMinute(0)
-                .setBlackoutStartTimeMillis(1000)
-                .setBlackoutEndTimeMillis(2000)
+                .setBlackoutPeriodStartDate("2022-01-14")
+                .setBlackoutPeriodEndDate("2022-02-14")
                 .setRingtone("clock://ringtone/1")
-                .setVibrate(true)
+                .setShouldVibrate(true)
                 .setPreviousInstance(alarmInstance1)
                 .setNextInstance(alarmInstance2)
                 .build();
@@ -97,8 +101,8 @@
         Alarm alarm2 = new Alarm.Builder(alarm1).build();
         assertThat(alarm1.getNamespace()).isEqualTo(alarm2.getNamespace());
         assertThat(alarm1.getId()).isEqualTo(alarm2.getId());
-        assertThat(alarm1.getScore()).isEqualTo(alarm2.getScore());
-        assertThat(alarm1.getTtlMillis()).isEqualTo(alarm2.getTtlMillis());
+        assertThat(alarm1.getDocumentScore()).isEqualTo(alarm2.getDocumentScore());
+        assertThat(alarm1.getDocumentTtlMillis()).isEqualTo(alarm2.getDocumentTtlMillis());
         assertThat(alarm1.getCreationTimestampMillis())
                 .isEqualTo(alarm2.getCreationTimestampMillis());
         assertThat(alarm1.getName()).isEqualTo(alarm2.getName());
@@ -106,26 +110,29 @@
         assertThat(alarm1.getDaysOfWeek()).isEqualTo(alarm2.getDaysOfWeek());
         assertThat(alarm1.getHour()).isEqualTo(alarm2.getHour());
         assertThat(alarm1.getMinute()).isEqualTo(alarm2.getMinute());
-        assertThat(alarm1.getBlackoutStartTimeMillis())
-                .isEqualTo(alarm2.getBlackoutStartTimeMillis());
-        assertThat(alarm1.getBlackoutEndTimeMillis()).isEqualTo(alarm2.getBlackoutEndTimeMillis());
+        assertThat(alarm1.getBlackoutPeriodStartDate())
+                .isEqualTo(alarm2.getBlackoutPeriodStartDate());
+        assertThat(alarm1.getBlackoutPeriodEndDate())
+                .isEqualTo(alarm2.getBlackoutPeriodEndDate());
         assertThat(alarm1.getRingtone()).isEqualTo(alarm2.getRingtone());
-        assertThat(alarm1.isVibrate()).isEqualTo(alarm2.isVibrate());
+        assertThat(alarm1.shouldVibrate()).isEqualTo(alarm2.shouldVibrate());
         assertThat(alarm1.getPreviousInstance()).isEqualTo(alarm2.getPreviousInstance());
         assertThat(alarm1.getNextInstance()).isEqualTo(alarm2.getNextInstance());
     }
 
     @Test
     public void testToGenericDocument() throws Exception {
-        AlarmInstance alarmInstance1 = new AlarmInstance.Builder("namespace", "instanceId1")
+        AlarmInstance alarmInstance1 = new AlarmInstance.Builder(
+                "namespace", "instanceId1", "2022-01-01T00:00:00")
                 .setCreationTimestampMillis(100)
                 .build();
-        AlarmInstance alarmInstance2 = new AlarmInstance.Builder("namespace", "instanceId2")
+        AlarmInstance alarmInstance2 = new AlarmInstance.Builder(
+                "namespace", "instanceId2", "2022-01-02T00:00:00")
                 .setCreationTimestampMillis(100)
                 .build();
         Alarm alarm = new Alarm.Builder("namespace", "id")
-                .setScore(1)
-                .setTtlMillis(20000)
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(20000)
                 .setCreationTimestampMillis(100)
                 .setName("my alarm")
                 .setEnabled(true)
@@ -133,10 +140,10 @@
                         Calendar.THURSDAY, Calendar.FRIDAY)
                 .setHour(12)
                 .setMinute(0)
-                .setBlackoutStartTimeMillis(1000)
-                .setBlackoutEndTimeMillis(2000)
+                .setBlackoutPeriodStartDate("2022-01-14")
+                .setBlackoutPeriodEndDate("2022-02-14")
                 .setRingtone("clock://ringtone/1")
-                .setVibrate(true)
+                .setShouldVibrate(true)
                 .setPreviousInstance(alarmInstance1)
                 .setNextInstance(alarmInstance2)
                 .build();
@@ -146,18 +153,20 @@
         assertThat(genericDocument.getNamespace()).isEqualTo("namespace");
         assertThat(genericDocument.getId()).isEqualTo("id");
         assertThat(genericDocument.getScore()).isEqualTo(1);
-        assertThat(genericDocument.getTtlMillis()).isEqualTo(20000);
         assertThat(genericDocument.getCreationTimestampMillis()).isEqualTo(100);
+        assertThat(genericDocument.getTtlMillis()).isEqualTo(20000);
         assertThat(genericDocument.getPropertyString("name")).isEqualTo("my alarm");
         assertThat(genericDocument.getPropertyBoolean("enabled")).isTrue();
         assertThat(genericDocument.getPropertyLongArray("daysOfWeek")).asList()
                 .containsExactly(2L, 3L, 4L, 5L, 6L);
         assertThat(genericDocument.getPropertyLong("hour")).isEqualTo(12);
         assertThat(genericDocument.getPropertyLong("minute")).isEqualTo(0);
-        assertThat(genericDocument.getPropertyLong("blackoutStartTimeMillis")).isEqualTo(1000);
-        assertThat(genericDocument.getPropertyLong("blackoutEndTimeMillis")).isEqualTo(2000);
+        assertThat(genericDocument.getPropertyString("blackoutPeriodStartDate"))
+                .isEqualTo("2022-01-14");
+        assertThat(genericDocument.getPropertyString("blackoutPeriodEndDate"))
+                .isEqualTo("2022-02-14");
         assertThat(genericDocument.getPropertyString("ringtone")).isEqualTo("clock://ringtone/1");
-        assertThat(genericDocument.getPropertyBoolean("vibrate")).isTrue();
+        assertThat(genericDocument.getPropertyBoolean("shouldVibrate")).isTrue();
         assertThat(genericDocument.getPropertyDocument("previousInstance"))
                 .isEqualTo(GenericDocument.fromDocumentClass(alarmInstance1));
         assertThat(genericDocument.getPropertyDocument("nextInstance"))
diff --git a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/TimerTest.java b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/TimerTest.java
index ca78c58..e6f0acb 100644
--- a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/TimerTest.java
+++ b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/builtintypes/TimerTest.java
@@ -26,99 +26,118 @@
     @Test
     public void testBuilder() {
         Timer timer = new Timer.Builder("namespace", "id1")
-                .setScore(1)
-                .setTtlMillis(6000)
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(6000)
                 .setCreationTimestampMillis(100)
                 .setName("my timer")
                 .setDurationMillis(1000)
-                .setRemainingTimeMillis(500)
+                .setOriginalDurationMillis(800)
+                .setRemainingTimeMillisSinceUpdate(500)
                 .setRingtone("clock://ringtone/1")
                 .setStatus(Timer.STATUS_STARTED)
-                .setVibrate(true)
-                .setStartTimeMillis(750)
-                .setStartTimeMillisInElapsedRealtime(700L)
+                .setShouldVibrate(true)
+                .setStartTimeMillis(
+                        /*startTimeMillis=*/750,
+                        /*startTimeMillisInElapsedRealtime=*/700,
+                        /*bootCount=*/1)
                 .build();
 
         assertThat(timer.getNamespace()).isEqualTo("namespace");
         assertThat(timer.getId()).isEqualTo("id1");
-        assertThat(timer.getTtlMillis()).isEqualTo(6000);
-        assertThat(timer.getScore()).isEqualTo(1);
+        assertThat(timer.getDocumentScore()).isEqualTo(1);
+        assertThat(timer.getDocumentTtlMillis()).isEqualTo(6000);
         assertThat(timer.getCreationTimestampMillis()).isEqualTo(100);
         assertThat(timer.getName()).isEqualTo("my timer");
         assertThat(timer.getDurationMillis()).isEqualTo(1000);
-        assertThat(timer.getRemainingTimeMillis()).isEqualTo(500);
+        assertThat(timer.getOriginalDurationMillis()).isEqualTo(800);
+        assertThat(timer.getRemainingTimeMillisSinceUpdate()).isEqualTo(500);
         assertThat(timer.getRingtone()).isEqualTo("clock://ringtone/1");
-        assertThat(timer.getStatus()).isEqualTo(1);
-        assertThat(timer.isVibrate()).isEqualTo(true);
+        assertThat(timer.getStatus()).isEqualTo(Timer.STATUS_STARTED);
+        assertThat(timer.shouldVibrate()).isEqualTo(true);
         assertThat(timer.getStartTimeMillis()).isEqualTo(750);
         assertThat(timer.getStartTimeMillisInElapsedRealtime()).isEqualTo(700);
+        assertThat(timer.getBootCount()).isEqualTo(1);
     }
 
     @Test
     public void testBuilderCopy_allFieldsCopied() {
         Timer timer1 = new Timer.Builder("namespace", "id1")
-                .setScore(1)
-                .setTtlMillis(6000)
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(6000)
                 .setCreationTimestampMillis(100)
                 .setName("my timer")
                 .setDurationMillis(1000)
-                .setRemainingTimeMillis(500)
+                .setOriginalDurationMillis(800)
+                .setRemainingTimeMillisSinceUpdate(500)
                 .setRingtone("clock://ringtone/1")
                 .setStatus(Timer.STATUS_STARTED)
-                .setVibrate(true)
-                .setStartTimeMillis(750)
-                .setStartTimeMillisInElapsedRealtime(700L)
+                .setShouldVibrate(true)
+                .setStartTimeMillis(
+                        /*startTimeMillis=*/750,
+                        /*startTimeMillisInElapsedRealtime=*/700,
+                        /*bootCount=*/1)
                 .build();
         Timer timer2 = new Timer.Builder(timer1).build();
 
         assertThat(timer1.getNamespace()).isEqualTo(timer2.getNamespace());
         assertThat(timer1.getId()).isEqualTo(timer2.getId());
-        assertThat(timer1.getTtlMillis()).isEqualTo(timer2.getTtlMillis());
-        assertThat(timer1.getScore()).isEqualTo(timer2.getScore());
+        assertThat(timer1.getDocumentScore()).isEqualTo(timer2.getDocumentScore());
+        assertThat(timer1.getDocumentTtlMillis()).isEqualTo(timer2.getDocumentTtlMillis());
         assertThat(timer1.getCreationTimestampMillis())
                 .isEqualTo(timer2.getCreationTimestampMillis());
         assertThat(timer1.getName()).isEqualTo(timer2.getName());
         assertThat(timer1.getDurationMillis()).isEqualTo(timer2.getDurationMillis());
-        assertThat(timer1.getRemainingTimeMillis()).isEqualTo(timer2.getRemainingTimeMillis());
+        assertThat(timer1.getOriginalDurationMillis())
+                .isEqualTo(timer2.getOriginalDurationMillis());
+        assertThat(timer1.getRemainingTimeMillisSinceUpdate())
+                .isEqualTo(timer2.getRemainingTimeMillisSinceUpdate());
         assertThat(timer1.getRingtone()).isEqualTo(timer2.getRingtone());
         assertThat(timer1.getStatus()).isEqualTo(timer2.getStatus());
-        assertThat(timer1.isVibrate()).isEqualTo(timer2.isVibrate());
+        assertThat(timer1.shouldVibrate()).isEqualTo(timer2.shouldVibrate());
         assertThat(timer1.getStartTimeMillis()).isEqualTo(timer2.getStartTimeMillis());
         assertThat(timer1.getStartTimeMillisInElapsedRealtime())
                 .isEqualTo(timer2.getStartTimeMillisInElapsedRealtime());
+        assertThat(timer1.getBootCount()).isEqualTo(timer2.getBootCount());
     }
 
     @Test
     public void testToGenericDocument() throws Exception {
         Timer timer = new Timer.Builder("namespace", "id1")
-                .setScore(1)
-                .setTtlMillis(6000)
+                .setDocumentScore(1)
+                .setDocumentTtlMillis(6000)
                 .setCreationTimestampMillis(100)
                 .setName("my timer")
                 .setDurationMillis(1000)
-                .setRemainingTimeMillis(500)
+                .setOriginalDurationMillis(800)
+                .setRemainingTimeMillisSinceUpdate(500)
                 .setRingtone("clock://ringtone/1")
                 .setStatus(Timer.STATUS_STARTED)
-                .setVibrate(true)
-                .setStartTimeMillis(750)
-                .setStartTimeMillisInElapsedRealtime(700L)
+                .setShouldVibrate(true)
+                .setStartTimeMillis(
+                        /*startTimeMillis=*/750,
+                        /*startTimeMillisInElapsedRealtime=*/700,
+                        /*bootCount=*/1)
                 .build();
 
         GenericDocument genericDocument = GenericDocument.fromDocumentClass(timer);
         assertThat(genericDocument.getSchemaType()).isEqualTo("builtin:Timer");
         assertThat(genericDocument.getNamespace()).isEqualTo("namespace");
         assertThat(genericDocument.getId()).isEqualTo("id1");
-        assertThat(genericDocument.getTtlMillis()).isEqualTo(6000);
         assertThat(genericDocument.getScore()).isEqualTo(1);
+        assertThat(genericDocument.getTtlMillis()).isEqualTo(6000);
         assertThat(genericDocument.getCreationTimestampMillis()).isEqualTo(100);
         assertThat(genericDocument.getPropertyString("name")).isEqualTo("my timer");
         assertThat(genericDocument.getPropertyLong("durationMillis")).isEqualTo(1000);
-        assertThat(genericDocument.getPropertyLong("remainingTimeMillis")).isEqualTo(500);
+        assertThat(genericDocument.getPropertyLong("originalDurationMillis"))
+                .isEqualTo(800);
+        assertThat(genericDocument.getPropertyLong("remainingTimeMillisSinceUpdate"))
+                .isEqualTo(500);
         assertThat(genericDocument.getPropertyString("ringtone")).isEqualTo("clock://ringtone/1");
         assertThat(genericDocument.getPropertyLong("status")).isEqualTo(1);
-        assertThat(genericDocument.getPropertyBoolean("vibrate")).isTrue();
+        assertThat(genericDocument.getPropertyBoolean("shouldVibrate")).isTrue();
         assertThat(genericDocument.getPropertyLong("startTimeMillis")).isEqualTo(750);
         assertThat(genericDocument.getPropertyLong("startTimeMillisInElapsedRealtime"))
                 .isEqualTo(700);
+        assertThat(genericDocument.getPropertyLong("bootCount")).isEqualTo(1);
     }
 }
diff --git a/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/utils/DateTimeFormatValidatorTest.java b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/utils/DateTimeFormatValidatorTest.java
new file mode 100644
index 0000000..cf76375
--- /dev/null
+++ b/appsearch/appsearch-builtin-types/src/androidTest/java/androidx/appsearch/utils/DateTimeFormatValidatorTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.appsearch.utils;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+
+public class DateTimeFormatValidatorTest {
+    @Test
+    public void testValidateISO8601Date_validDate_returnsTrue() {
+        assertThat(DateTimeFormatValidator.validateISO8601Date("2022-01-01")).isTrue();
+    }
+
+    @Test
+    public void testValidateISO8601Date_invalidDate_returnsFalse() {
+        assertThat(DateTimeFormatValidator.validateISO8601Date("2022:01:01")).isFalse();
+    }
+
+    @Test
+    public void testValidateISO8601Date_notExactMatch_returnsFalse() {
+        assertThat(DateTimeFormatValidator.validateISO8601Date("2022-01-01T00:00:00"))
+                .isFalse();
+    }
+
+    @Test
+    public void testValidateISO8601DateTime_validDate_returnsTrue() {
+        assertThat(DateTimeFormatValidator.validateISO8601DateTime("2022-01-01T00:00:00"))
+                .isTrue();
+    }
+
+    @Test
+    public void testValidateISO8601DateTime_invalidDate_returnsFalse() {
+        assertThat(DateTimeFormatValidator.validateISO8601DateTime("2022:01:01T00-00-00"))
+                .isFalse();
+    }
+
+    @Test
+    public void testValidateISO8601DateTime_notExactMatch_returnsFalse() {
+        assertThat(DateTimeFormatValidator.validateISO8601DateTime("2022-01-01T00:00:00.000"))
+                .isFalse();
+    }
+}
diff --git a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Alarm.java b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Alarm.java
index 69d384b..7ebe9b2 100644
--- a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Alarm.java
+++ b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Alarm.java
@@ -21,15 +21,16 @@
 import androidx.annotation.Nullable;
 import androidx.appsearch.annotation.Document;
 import androidx.appsearch.app.AppSearchSchema.StringPropertyConfig;
+import androidx.appsearch.utils.DateTimeFormatValidator;
 import androidx.core.util.Preconditions;
 
 import java.util.Calendar;
 
 /**
- * AppSearch document representing an Alarm entity.
+ * AppSearch document representing an {@link Alarm} entity.
  */
 @Document(name = "builtin:Alarm")
-public class Alarm {
+public final class Alarm {
     @Document.Namespace
     private final String mNamespace;
 
@@ -37,13 +38,13 @@
     private final String mId;
 
     @Document.Score
-    private final int mScore;
+    private final int mDocumentScore;
 
     @Document.CreationTimestampMillis
     private final long mCreationTimestampMillis;
 
     @Document.TtlMillis
-    private final long mTtlMillis;
+    private final long mDocumentTtlMillis;
 
     @Document.StringProperty(indexingType = StringPropertyConfig.INDEXING_TYPE_PREFIXES)
     private final String mName;
@@ -60,17 +61,17 @@
     @Document.LongProperty
     private final int mMinute;
 
-    @Document.LongProperty
-    private final long mBlackoutStartTimeMillis;
+    @Document.StringProperty
+    private final String mBlackoutPeriodStartDate;
 
-    @Document.LongProperty
-    private final long mBlackoutEndTimeMillis;
+    @Document.StringProperty
+    private final String mBlackoutPeriodEndDate;
 
     @Document.StringProperty
     private final String mRingtone;
 
     @Document.BooleanProperty
-    private final boolean mVibrate;
+    private final boolean mShouldVibrate;
 
     @Document.DocumentProperty
     private final AlarmInstance mPreviousInstance;
@@ -78,68 +79,82 @@
     @Document.DocumentProperty
     private final AlarmInstance mNextInstance;
 
-    Alarm(String namespace, String id, int score, long creationTimestampMillis, long ttlMillis,
-            String name, boolean enabled, int[] daysOfWeek, int hour, int minute,
-            long blackoutStartTimeMillis, long blackoutEndTimeMillis, String ringtone,
-            boolean vibrate, AlarmInstance previousInstance, AlarmInstance nextInstance) {
-        mNamespace = namespace;
-        mId = id;
-        mScore = score;
+    Alarm(@NonNull String namespace, @NonNull String id, int documentScore,
+            long creationTimestampMillis, long documentTtlMillis, @Nullable String name,
+            boolean enabled, @Nullable int[] daysOfWeek, int hour, int minute,
+            @Nullable String blackoutPeriodStartDate, @Nullable String blackoutPeriodEndDate,
+            @Nullable String ringtone, boolean shouldVibrate,
+            @Nullable AlarmInstance previousInstance, @Nullable AlarmInstance nextInstance) {
+        mNamespace = Preconditions.checkNotNull(namespace);
+        mId = Preconditions.checkNotNull(id);
+        mDocumentScore = documentScore;
         mCreationTimestampMillis = creationTimestampMillis;
-        mTtlMillis = ttlMillis;
+        mDocumentTtlMillis = documentTtlMillis;
         mName = name;
         mEnabled = enabled;
         mDaysOfWeek = daysOfWeek;
         mHour = hour;
         mMinute = minute;
-        mBlackoutStartTimeMillis = blackoutStartTimeMillis;
-        mBlackoutEndTimeMillis = blackoutEndTimeMillis;
+        mBlackoutPeriodStartDate = blackoutPeriodStartDate;
+        mBlackoutPeriodEndDate = blackoutPeriodEndDate;
         mRingtone = ringtone;
-        mVibrate = vibrate;
+        mShouldVibrate = shouldVibrate;
         mPreviousInstance = previousInstance;
         mNextInstance = nextInstance;
     }
 
-    /** Returns the namespace of the {@link Alarm}. */
+    /** Returns the namespace. */
     @NonNull
     public String getNamespace() {
         return mNamespace;
     }
 
-    /** Returns the unique identifier of the {@link Alarm}. */
+    /** Returns the unique identifier. */
     @NonNull
     public String getId() {
         return mId;
     }
 
     /**
-     * Returns the user-provided opaque document score of the {@link Alarm}, which can be
-     * used for ranking using
+     * Returns the user-provided opaque document score of the current AppSearch document, which can
+     * be used for ranking using
      * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}.
+     *
+     * <p>See {@link Document.Score} for more information on score.
      */
-    public int getScore() {
-        return mScore;
+    public int getDocumentScore() {
+        return mDocumentScore;
     }
 
     /**
-     * Returns the creation timestamp for the {@link Alarm} document, in milliseconds using the
+     * Returns the creation timestamp for the current AppSearch entity, in milliseconds using the
      * {@link System#currentTimeMillis()} time base.
+     *
+     * <p>This timestamp refers to the creation time of the AppSearch entity, not when the
+     * document is written into AppSearch.
+     *
+     * <p>If not set, then the current timestamp will be used.
+     *
+     * <p>See {@link androidx.appsearch.annotation.Document.CreationTimestampMillis} for more
+     * information on creation timestamp.
      */
     public long getCreationTimestampMillis() {
         return mCreationTimestampMillis;
     }
 
     /**
-     * Returns the time-to-live (TTL) for the {@link Alarm} document in milliseconds using the
-     * {@link System#currentTimeMillis()} time base.
+     * Returns the time-to-live (TTL) for the current AppSearch document as a duration in
+     * milliseconds.
      *
-     * <p>The {@link Alarm} document will be automatically deleted when the TTL expires.
+     * <p>The document will be automatically deleted when the TTL expires.
+     *
+     * <p>See {@link Document.TtlMillis} for more information on TTL.
      */
-    public long getTtlMillis() {
-        return mTtlMillis;
+    public long getDocumentTtlMillis() {
+        return mDocumentTtlMillis;
     }
 
-    /** Returns the name associated with the {@link Alarm}. */
+    /** Returns the name. */
     @Nullable
     public String getName() {
         return mName;
@@ -151,7 +166,7 @@
     }
 
     /**
-     * Returns the scheduled days for repeating the {@link Alarm}.
+     * Returns the scheduled days for repeating.
      *
      * <p>Days of the week can be {@link java.util.Calendar#MONDAY},
      * {@link java.util.Calendar#TUESDAY}, {@link java.util.Calendar#WEDNESDAY},
@@ -186,37 +201,39 @@
     }
 
     /**
-     * Returns the start time for the {@link Alarm} blackout period in milliseconds using the
-     * {@link System#currentTimeMillis()} time base.
+     * Returns the start date of the blackout period in ISO 8601 format.
+     * E.g.: 2022-01-14
      *
      * <p>A blackout period means the {@link Alarm} will not fire during this period.
      *
-     * <p>The value {@code 0} indicates that the blackout period has no start time.
+     * <p>If not set, then it indicates that the blackout period has no start time.
      *
-     * <p>If both blackoutStartTime and blackoutEndTime are {@code 0}, then the blackout period
-     * is not defined for this {@link Alarm}.
+     * <p>If neither blackoutPeriodStartDate and blackoutPeriodEndDate are set, then
+     * the blackout period is not defined.
      */
-    public long getBlackoutStartTimeMillis() {
-        return mBlackoutStartTimeMillis;
+    @Nullable
+    public String getBlackoutPeriodStartDate() {
+        return mBlackoutPeriodStartDate;
     }
 
     /**
-     * Returns the end time for the {@link Alarm} blackout period in milliseconds using the
-     * {@link System#currentTimeMillis()} time base.
+     * Returns the end time for the blackout period in ISO 8601 format.
+     * E.g.: 2022-01-14
      *
      * <p>A blackout period means the {@link Alarm} will not fire during this period.
      *
-     * <p>The value {@code 0} indicates that the blackout period has no end time.
+     * <p>If not set, then it indicates that the blackout period has no end time.
      *
-     * <p>If both blackoutStartTime and blackoutEndTime are {@code 0}, then the blackout period
-     * is not defined for this {@link Alarm}.
+     * <p>If neither blackoutPeriodStartDate and blackoutPeriodEndDate are set, then
+     * the blackout period is not defined.
      */
-    public long getBlackoutEndTimeMillis() {
-        return mBlackoutEndTimeMillis;
+    @Nullable
+    public String getBlackoutPeriodEndDate() {
+        return mBlackoutPeriodEndDate;
     }
 
     /**
-     * Returns the ringtone of the {@link Alarm} as a content URI to be played, or
+     * Returns the ringtone as a content URI to be played, or
      * {@link android.provider.AlarmClock#VALUE_RINGTONE_SILENT} if no ringtone will be played.
      */
     @Nullable
@@ -225,15 +242,15 @@
     }
 
     /** Returns whether or not to activate the device vibrator when the {@link Alarm} fires. */
-    public boolean isVibrate() {
-        return mVibrate;
+    public boolean shouldVibrate() {
+        return mShouldVibrate;
     }
 
     /**
-     * Returns the previous {@link AlarmInstance} associated with the {@link Alarm}.
+     * Returns the previous {@link AlarmInstance}.
      *
-     * <p>The previous {@link AlarmInstance} is most recent past instance that was fired. If the
-     * {@link Alarm} has no past instances, then null will be returned.
+     * <p>The previous {@link AlarmInstance} is most recent past instance that was fired. If
+     * there are no past instances, then null will be returned.
      *
      * <p>See {@link AlarmInstance}.
      */
@@ -243,10 +260,10 @@
     }
 
     /**
-     * Returns the next {@link AlarmInstance} associated with the {@link Alarm}.
+     * Returns the next {@link AlarmInstance}.
      *
      * <p>The next {@link AlarmInstance} is the immediate future instance that is scheduled to fire.
-     * If the {@link Alarm} has no future instances, then null will be returned.
+     * If there are no future instances, then null will be returned.
      *
      * <p>See {@link AlarmInstance}.
      */
@@ -256,107 +273,54 @@
     }
 
     /** Builder for {@link Alarm}. */
-    public static final class Builder {
-        private final String mNamespace;
-        private final String mId;
-        private int mScore;
-        private long mCreationTimestampMillis;
-        private long mTtlMillis;
+    public static final class Builder extends BaseBuiltinTypeBuilder<Builder> {
         private String mName;
         private boolean mEnabled;
         private int[] mDaysOfWeek;
         private int mHour;
         private int mMinute;
-        private long mBlackoutStartTimeMillis;
-        private long mBlackoutEndTimeMillis;
+        private String mBlackoutPeriodStartDate;
+        private String mBlackoutPeriodEndDate;
         private String mRingtone;
-        private boolean mVibrate;
+        private boolean mShouldVibrate;
         private AlarmInstance mPreviousInstance;
         private AlarmInstance mNextInstance;
 
         /**
          * Constructor for {@link Alarm.Builder}.
          *
-         * @param namespace Namespace for the {@link Alarm} Document. See
+         * @param namespace Namespace for the Document. See
          * {@link Document.Namespace}.
-         * @param id Unique identifier for the {@link Alarm} Document. See {@link Document.Id}.
+         * @param id Unique identifier for the Document. See {@link Document.Id}.
          */
         public Builder(@NonNull String namespace, @NonNull String id) {
-            mNamespace = Preconditions.checkNotNull(namespace);
-            mId = Preconditions.checkNotNull(id);
-
-            // Default for unset creationTimestampMillis. AppSearch will internally convert this
-            // to current time when creating the GenericDocument.
-            mCreationTimestampMillis = -1;
+            super(namespace, id);
         }
 
         /**
-         * Constructor for {@link Alarm.Builder} with all the existing values of an {@link Alarm}.
+         * Constructor with all the existing values.
          */
         public Builder(@NonNull Alarm alarm) {
             this(alarm.getNamespace(), alarm.getId());
-            mScore = alarm.getScore();
+            mDocumentScore = alarm.getDocumentScore();
             mCreationTimestampMillis = alarm.getCreationTimestampMillis();
-            mTtlMillis = alarm.getTtlMillis();
+            mDocumentTtlMillis = alarm.getDocumentTtlMillis();
             mName = alarm.getName();
             mEnabled = alarm.isEnabled();
             mDaysOfWeek = alarm.getDaysOfWeek();
             mHour = alarm.getHour();
             mMinute = alarm.getMinute();
-            mBlackoutStartTimeMillis = alarm.getBlackoutStartTimeMillis();
-            mBlackoutEndTimeMillis = alarm.getBlackoutEndTimeMillis();
+            mBlackoutPeriodStartDate = alarm.getBlackoutPeriodStartDate();
+            mBlackoutPeriodEndDate = alarm.getBlackoutPeriodEndDate();
             mRingtone = alarm.getRingtone();
-            mVibrate = alarm.isVibrate();
+            mShouldVibrate = alarm.shouldVibrate();
             mPreviousInstance = alarm.getPreviousInstance();
             mNextInstance = alarm.getNextInstance();
         }
 
-        /**
-         * Sets the opaque document score of the {@link Alarm}, which can be used for
-         * ranking using
-         * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}
-         *
-         * <p>See {@link Document.Score}
-         */
+        /** Sets the name. */
         @NonNull
-        public Alarm.Builder setScore(int score) {
-            mScore = score;
-            return this;
-        }
-
-        /**
-         * Sets the Creation Timestamp of the {@link Alarm} document, in milliseconds using the
-         * {@link System#currentTimeMillis()} time base.
-         *
-         * <p>If not set, then the current timestamp will be used.
-         *
-         * <p>See {@link Document.CreationTimestampMillis}
-         */
-        @NonNull
-        public Alarm.Builder setCreationTimestampMillis(long creationTimestampMillis) {
-            mCreationTimestampMillis = creationTimestampMillis;
-            return this;
-        }
-
-        /**
-         * Sets the time-to-live (TTL) for the {@link Alarm} document in milliseconds using the
-         * {@link System#currentTimeMillis()} time base.
-         *
-         * <p>The {@link Alarm} document will be automatically deleted when the TTL expires.
-         *
-         * <p>If set to 0, then the document will never expire.
-         *
-         * <p>See {@link Document.TtlMillis}
-         */
-        @NonNull
-        public Alarm.Builder setTtlMillis(long ttlMillis) {
-            mTtlMillis = ttlMillis;
-            return this;
-        }
-
-        /** Sets the name of the {@link Alarm}. */
-        @NonNull
-        public Alarm.Builder setName(@Nullable String name) {
+        public Builder setName(@Nullable String name) {
             mName = name;
             return this;
         }
@@ -369,7 +333,7 @@
         }
 
         /**
-         * Sets the scheduled days for repeating the {@link Alarm}.
+         * Sets the scheduled days for repeating.
          *
          * <p>Days of the week can be {@link java.util.Calendar#MONDAY},
          * {@link java.util.Calendar#TUESDAY}, {@link java.util.Calendar#WEDNESDAY},
@@ -415,36 +379,47 @@
         }
 
         /**
-         * Sets the start time for the {@link Alarm} blackout period in milliseconds using the
-         * {@link System#currentTimeMillis()} time base.
+         * Sets the start date for the blackout period in ISO 8601 format.
+         * E.g.: 2022-01-14
          *
          * <p>A blackout period means the {@link Alarm} will not fire during this period.
          *
-         * <p>If not set, or set to 0, then the blackout period has no start time.
+         * <p>If not set, then it indicates that the blackout period has no start time.
          *
-         * <p>If neither blackoutStartTime nor blackoutEndTime are set, or if they are both set
-         * to 0, then the {@link Alarm} has no blackout period.
+         * <p>If neither blackoutPeriodStartDate and blackoutPeriodEndDate are set, then
+         * the blackout period is not defined.
          */
         @NonNull
-        public Builder setBlackoutStartTimeMillis(long blackoutStartTimeMillis) {
-            mBlackoutStartTimeMillis = blackoutStartTimeMillis;
+        public Builder setBlackoutPeriodStartDate(
+                @Nullable String blackoutPeriodStartDate) {
+            if (blackoutPeriodStartDate != null) {
+                Preconditions.checkArgument(
+                        DateTimeFormatValidator.validateISO8601Date(blackoutPeriodStartDate),
+                        "blackoutPeriodStartDate must be in the format: yyyy-MM-dd");
+            }
+            mBlackoutPeriodStartDate = blackoutPeriodStartDate;
             return this;
         }
 
         /**
-         * Sets the end time for the {@link Alarm} blackout period in milliseconds using the
-         * {@link System#currentTimeMillis()} time base.
+         * Sets the end time for the blackout period in ISO 8601 format.
+         * E.g.: 2022-01-14
          *
          * <p>A blackout period means the {@link Alarm} will not fire during this period.
          *
-         * <p>If not set, or set to 0, then the blackout period has no end time.
+         * <p>If not set, then it indicates that the blackout period has no end time.
          *
-         * <p>If neither blackoutStartTime nor blackoutEndTime are set, or if they are both set
-         * to 0, then the {@link Alarm} has no blackout period.
+         * <p>If neither blackoutPeriodStartDate and blackoutPeriodEndDate are set, then
+         * the blackout period is not defined.
          */
         @NonNull
-        public Builder setBlackoutEndTimeMillis(long blackoutEndTimeMillis) {
-            mBlackoutEndTimeMillis = blackoutEndTimeMillis;
+        public Builder setBlackoutPeriodEndDate(@Nullable String blackoutPeriodEndDate) {
+            if (blackoutPeriodEndDate != null) {
+                Preconditions.checkArgument(
+                        DateTimeFormatValidator.validateISO8601Date(blackoutPeriodEndDate),
+                        "blackoutPeriodEndDate must be in the format: yyyy-MM-dd");
+            }
+            mBlackoutPeriodEndDate = blackoutPeriodEndDate;
             return this;
         }
 
@@ -460,16 +435,16 @@
 
         /** Sets whether or not to activate the device vibrator when the {@link Alarm} fires. */
         @NonNull
-        public Builder setVibrate(boolean vibrate) {
-            mVibrate = vibrate;
+        public Builder setShouldVibrate(boolean shouldVibrate) {
+            mShouldVibrate = shouldVibrate;
             return this;
         }
 
         /**
-         * Sets the previous {@link AlarmInstance} associated with the {@link Alarm}.
+         * Sets the previous {@link AlarmInstance}.
          *
          * <p>The previous {@link AlarmInstance} is most recent past instance that was fired. If
-         * not set, then the {@link Alarm} has no past instances.
+         * not set, then there are no past instances.
          *
          * <p>See {@link AlarmInstance}.
          */
@@ -480,10 +455,10 @@
         }
 
         /**
-         * Sets the next {@link AlarmInstance} associated with the {@link Alarm}.
+         * Sets the next {@link AlarmInstance}.
          *
          * <p>The next {@link AlarmInstance} is the immediate future instance that is scheduled
-         * to fire. If not set, then the {@link Alarm} has no future instances.
+         * to fire. If not set, then there are no future instances.
          *
          * <p>See {@link AlarmInstance}.
          */
@@ -496,12 +471,10 @@
         /** Builds the {@link Alarm}. */
         @NonNull
         public Alarm build() {
-            Preconditions.checkNotNull(mId);
-            Preconditions.checkNotNull(mNamespace);
-
-            return new Alarm(mNamespace, mId, mScore, mCreationTimestampMillis, mTtlMillis, mName,
-                    mEnabled, mDaysOfWeek, mHour, mMinute, mBlackoutStartTimeMillis,
-                    mBlackoutEndTimeMillis, mRingtone, mVibrate, mPreviousInstance, mNextInstance);
+            return new Alarm(mNamespace, mId, mDocumentScore, mCreationTimestampMillis,
+                    mDocumentTtlMillis, mName, mEnabled, mDaysOfWeek, mHour, mMinute,
+                    mBlackoutPeriodStartDate, mBlackoutPeriodEndDate, mRingtone,
+                    mShouldVibrate, mPreviousInstance, mNextInstance);
         }
     }
 }
diff --git a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/AlarmInstance.java b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/AlarmInstance.java
index bf20151..e323b94 100644
--- a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/AlarmInstance.java
+++ b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/AlarmInstance.java
@@ -17,30 +17,29 @@
 package androidx.appsearch.builtintypes;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appsearch.annotation.Document;
+import androidx.appsearch.utils.DateTimeFormatValidator;
 import androidx.core.util.Preconditions;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.util.Calendar;
 
 /**
- * AppSearch document representing an AlarmInstance entity.
+ * AppSearch document representing an {@link AlarmInstance} entity.
  *
  * <p>An {@link AlarmInstance} must be associated with an {@link Alarm}. It represents a
  * particular point in time for that Alarm. For example, if an Alarm is set to
- * repeat every Monday, then each AlarmInstance for it will be the exact Mondays that the Alarm
- * did trigger.
+ * repeat every Monday, then each {@link AlarmInstance} for it will be the exact Mondays that the
+ * Alarm did trigger.
  *
- * <p>Year, month, day, hour, and minute are used over timestamp to ensure the
- * {@link AlarmInstance} remains unchanged across timezones. E.g. An AlarmInstance set to fire at
- * 7am GMT should also fire at 7am when the timezone is changed to PST.
+ * <p>The scheduled time should be timezone independent so that it remains unchanged across
+ * timezones. E.g.: An {@link AlarmInstance} set to fire at 7am GMT should also fire at 7am when
+ * the timezone is changed to PST.
  */
 @Document(name = "builtin:AlarmInstance")
-public class AlarmInstance {
+public final class AlarmInstance {
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     @IntDef({STATUS_UNKNOWN, STATUS_SCHEDULED, STATUS_FIRING, STATUS_DISMISSED, STATUS_SNOOZED,
@@ -68,28 +67,16 @@
     private final String mId;
 
     @Document.Score
-    private final int mScore;
+    private final int mDocumentScore;
 
     @Document.CreationTimestampMillis
     private final long mCreationTimestampMillis;
 
     @Document.TtlMillis
-    private final long mTtlMillis;
+    private final long mDocumentTtlMillis;
 
-    @Document.LongProperty
-    private final int mYear;
-
-    @Document.LongProperty
-    private final int mMonth;
-
-    @Document.LongProperty
-    private final int mDay;
-
-    @Document.LongProperty
-    private final int mHour;
-
-    @Document.LongProperty
-    private final int mMinute;
+    @Document.StringProperty
+    private final String mScheduledTime;
 
     @Document.LongProperty
     private final int mStatus;
@@ -97,115 +84,88 @@
     @Document.LongProperty
     private final long mSnoozeDurationMillis;
 
-    AlarmInstance(String namespace, String id, int score, long creationTimestampMillis,
-            long ttlMillis, int year, int month, int day, int hour, int minute, int status,
-            long snoozeDurationMillis) {
-        mNamespace = namespace;
-        mId = id;
-        mScore = score;
+    AlarmInstance(@NonNull String namespace, @NonNull String id, int documentScore,
+            long creationTimestampMillis, long documentTtlMillis, @NonNull String scheduledTime,
+            int status, long snoozeDurationMillis) {
+        mNamespace = Preconditions.checkNotNull(namespace);
+        mId = Preconditions.checkNotNull(id);
+        mDocumentScore = documentScore;
         mCreationTimestampMillis = creationTimestampMillis;
-        mTtlMillis = ttlMillis;
-        mYear = year;
-        mMonth = month;
-        mDay = day;
-        mHour = hour;
-        mMinute = minute;
+        mDocumentTtlMillis = documentTtlMillis;
+        mScheduledTime = Preconditions.checkNotNull(scheduledTime);
         mStatus = status;
         mSnoozeDurationMillis = snoozeDurationMillis;
     }
 
-    /** Returns the namespace of the {@link AlarmInstance}. */
+    /** Returns the namespace. */
     @NonNull
     public String getNamespace() {
         return mNamespace;
     }
 
-    /** Returns the unique identifier of the {@link AlarmInstance}. */
+    /** Returns the unique identifier. */
     @NonNull
     public String getId() {
         return mId;
     }
 
     /**
-     * Returns the user-provided opaque document score of the {@link AlarmInstance}, which can be
-     * used for ranking using
+     * Returns the user-provided opaque document score of the current AppSearch document, which can
+     * be used for ranking using
      * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}.
+     *
+     * <p>See {@link Document.Score} for more information on score.
      */
-    public int getScore() {
-        return mScore;
+    public int getDocumentScore() {
+        return mDocumentScore;
     }
 
     /**
-     * Returns the creation timestamp for the {@link AlarmInstance} document, in milliseconds
-     * using the {@link System#currentTimeMillis()} time base.
+     * Returns the creation timestamp for the current AppSearch entity, in milliseconds using the
+     * {@link System#currentTimeMillis()} time base.
+     *
+     * <p>This timestamp refers to the creation time of the AppSearch entity, not when the
+     * document is written into AppSearch.
+     *
+     * <p>If not set, then the current timestamp will be used.
+     *
+     * <p>See {@link androidx.appsearch.annotation.Document.CreationTimestampMillis} for more
+     * information on creation timestamp.
      */
     public long getCreationTimestampMillis() {
         return mCreationTimestampMillis;
     }
 
     /**
-     * Returns the time-to-live (TTL) for the {@link AlarmInstance} document in milliseconds using
-     * the {@link System#currentTimeMillis()} time base.
+     * Returns the time-to-live (TTL) for the current AppSearch document as a duration in
+     * milliseconds.
      *
-     * <p>The {@link AlarmInstance} document will be automatically deleted when the TTL expires.
+     * <p>The document will be automatically deleted when the TTL expires.
+     *
+     * <p>See {@link Document.TtlMillis} for more information on TTL.
      */
-    public long getTtlMillis() {
-        return mTtlMillis;
-    }
-
-    /** Returns the year {@link AlarmInstance} is scheduled to fire. */
-    public int getYear() {
-        return mYear;
+    public long getDocumentTtlMillis() {
+        return mDocumentTtlMillis;
     }
 
     /**
-     * Returns the month {@link AlarmInstance} is scheduled to fire.
+     * Returns the time that this is expected to fire in ISO 8601 format.
+     * E.g.: 2022-01-14T00:00:00
      *
-     * <p>Month should range from {@link java.util.Calendar#JANUARY} to
-     * {@link java.util.Calendar#DECEMBER}.
+     * <p>The scheduledTime is a timezone independent date time. When used, it should be
+     * converted into a date time in the local timezone.
      */
-    @IntRange(from = Calendar.JANUARY, to = Calendar.DECEMBER)
-    public int getMonth() {
-        return mMonth;
+    @NonNull
+    public String getScheduledTime() {
+        return mScheduledTime;
     }
 
     /**
-     * Returns the day of the month {@link AlarmInstance} is scheduled to fire.
+     * Returns the current status.
      *
-     * <p>Days are specified by integers from 1 to 31.
-     */
-    @IntRange(from = 1, to = 31)
-    public int getDay() {
-        return mDay;
-    }
-
-    /**
-     * Returns the hour {@link AlarmInstance} is scheduled to fire.
-     *
-     * <p>Hours are specified by integers from 0 to 23.
-     */
-    @IntRange(from = 0, to = 23)
-    public int getHour() {
-        return mHour;
-    }
-
-    /**
-     * Returns the minute {@link AlarmInstance} is scheduled to fire.
-     *
-     * <p>Minutes are specified by integers from 0 to 59.
-     */
-    @IntRange(from = 0, to = 59)
-    public int getMinute() {
-        return mMinute;
-    }
-
-    /**
-     * Returns the current status of the {@link AlarmInstance}.
-     *
-     * <p>Status can be either {@link AlarmInstance#STATUS_UNKNOWN},
-     * {@link AlarmInstance#STATUS_SCHEDULED}, {@link AlarmInstance#STATUS_FIRING},
-     * {@link AlarmInstance#STATUS_DISMISSED}, {@link AlarmInstance#STATUS_SNOOZED}, or
-     * {@link AlarmInstance#STATUS_MISSED}.
+     * <p>Status can be either {@link #STATUS_UNKNOWN}, {@link #STATUS_SCHEDULED},
+     * {@link #STATUS_FIRING}, {@link #STATUS_DISMISSED}, {@link #STATUS_SNOOZED}, or
+     * {@link #STATUS_MISSED}.
      */
     @Status
     public int getStatus() {
@@ -214,168 +174,60 @@
 
     /**
      * Returns the length of time in milliseconds the {@link AlarmInstance} will remain snoozed
-     * before it fires again, or -1 if the {@link AlarmInstance} does not support snoozing.
+     * before it fires again, or -1 if it does not support snoozing.
      */
     public long getSnoozeDurationMillis() {
         return mSnoozeDurationMillis;
     }
 
     /** Builder for {@link AlarmInstance}. */
-    public static final class Builder {
-        private final String mNamespace;
-        private final String mId;
-        private int mScore;
-        private long mCreationTimestampMillis;
-        private long mTtlMillis;
-        private int mYear;
-        private int mMonth;
-        private int mDay;
-        private int mHour;
-        private int mMinute;
+    public static final class Builder extends BaseBuiltinTypeBuilder<Builder> {
+        private final String mScheduledTime;
         private int mStatus;
         private long mSnoozeDurationMillis;
 
         /**
          * Constructor for {@link AlarmInstance.Builder}.
          *
-         * @param namespace Namespace for the {@link AlarmInstance} Document. See
-         * {@link Document.Namespace}.
-         * @param id Unique identifier for the {@link AlarmInstance} Document. See
-         * {@link Document.Id}.
+         * @param namespace Namespace for the Document. See {@link Document.Namespace}.
+         * @param id Unique identifier for the Document. See {@link Document.Id}.
+         * @param scheduledTime The time that this is expected to fire in
+         *                      ISO 8601 format. E.g.: 2022-01-14T00:00:00. Scheduled time should
+         *                      be timezone independent.
          */
-        public Builder(@NonNull String namespace, @NonNull String id) {
-            mNamespace = Preconditions.checkNotNull(namespace);
-            mId = Preconditions.checkNotNull(id);
+        public Builder(@NonNull String namespace, @NonNull String id,
+                @NonNull String scheduledTime) {
+            super(namespace, id);
+            Preconditions.checkNotNull(scheduledTime);
+            Preconditions.checkArgument(
+                    DateTimeFormatValidator.validateISO8601DateTime(scheduledTime),
+                    "scheduledTime must be in the format: yyyy-MM-ddTHH:mm:ss");
 
-            // Default for unset creationTimestampMillis. AppSearch will internally convert this
-            // to current time when creating the GenericDocument.
-            mCreationTimestampMillis = -1;
+            mScheduledTime = scheduledTime;
+
             // default for snooze length. Indicates no snoozing.
             mSnoozeDurationMillis = -1;
         }
 
         /**
-         * Constructor for {@link AlarmInstance.Builder} with all the existing values of an
-         * {@link AlarmInstance}.
+         * Constructor for {@link AlarmInstance.Builder} with all the existing values.
          */
         public Builder(@NonNull AlarmInstance alarmInstance) {
-            this(alarmInstance.getNamespace(), alarmInstance.getId());
-            mScore = alarmInstance.getScore();
+            this(alarmInstance.getNamespace(), alarmInstance.getId(),
+                    alarmInstance.getScheduledTime());
+            mDocumentScore = alarmInstance.getDocumentScore();
             mCreationTimestampMillis = alarmInstance.getCreationTimestampMillis();
-            mTtlMillis = alarmInstance.getTtlMillis();
-            mYear = alarmInstance.getYear();
-            mMonth = alarmInstance.getMonth();
-            mDay = alarmInstance.getDay();
-            mHour = alarmInstance.getHour();
-            mMinute = alarmInstance.getMinute();
+            mDocumentTtlMillis = alarmInstance.getDocumentTtlMillis();
             mStatus = alarmInstance.getStatus();
             mSnoozeDurationMillis = alarmInstance.getSnoozeDurationMillis();
         }
 
         /**
-         * Sets the opaque document score of the {@link AlarmInstance}, which can be used for
-         * ranking using
-         * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}
+         * Sets the current status.
          *
-         * <p>See {@link Document.Score}
-         */
-        @NonNull
-        public Builder setScore(int score) {
-            mScore = score;
-            return this;
-        }
-
-        /**
-         * Sets the Creation Timestamp of the {@link AlarmInstance} document, in milliseconds
-         * using the {@link System#currentTimeMillis()} time base.
-         *
-         * <p>If not set, then the current timestamp will be used.
-         *
-         * <p>See {@link Document.CreationTimestampMillis}
-         */
-        @NonNull
-        public Builder setCreationTimestampMillis(long creationTimestampMillis) {
-            mCreationTimestampMillis = creationTimestampMillis;
-            return this;
-        }
-
-        /**
-         * Sets the time-to-live (TTL) for the {@link AlarmInstance} document in milliseconds using
-         * the {@link System#currentTimeMillis()} time base.
-         *
-         * <p>The {@link AlarmInstance} document will be automatically deleted when the TTL expires.
-         *
-         * <p>If set to 0, then the document will never expire.
-         *
-         * <p>See {@link Document.TtlMillis}
-         */
-        @NonNull
-        public Builder setTtlMillis(long ttlMillis) {
-            mTtlMillis = ttlMillis;
-            return this;
-        }
-
-        /** Sets the year {@link AlarmInstance} is scheduled to fire. */
-        @NonNull
-        public Builder setYear(int year) {
-            mYear = year;
-            return this;
-        }
-
-        /**
-         * Sets the month {@link AlarmInstance} is scheduled to fire.
-         *
-         * <p>Month should range from {@link java.util.Calendar#JANUARY} to
-         * {@link java.util.Calendar#DECEMBER}.
-         */
-        @NonNull
-        public Builder setMonth(
-                @IntRange(from = Calendar.JANUARY, to = Calendar.DECEMBER) int month) {
-            mMonth = Preconditions.checkArgumentInRange(month, Calendar.JANUARY,
-                    Calendar.DECEMBER, "month");
-            return this;
-        }
-
-        /**
-         * Sets the day of the month {@link AlarmInstance} is scheduled to fire.
-         *
-         * <p>Days are specified by integers from 1 to 31.
-         */
-        @NonNull
-        public Builder setDay(@IntRange(from = 1, to = 31) int day) {
-            mDay = Preconditions.checkArgumentInRange(day, 1, 31, "day");
-            return this;
-        }
-
-        /**
-         * Sets the hour {@link AlarmInstance} is scheduled to fire.
-         *
-         * <p>Hours are specified by integers from 0 to 23.
-         */
-        @NonNull
-        public Builder setHour(@IntRange(from = 0, to = 23) int hour) {
-            mHour = Preconditions.checkArgumentInRange(hour, 0, 23, "hour");
-            return this;
-        }
-
-        /**
-         * Sets the minute {@link AlarmInstance} is scheduled to fire.
-         *
-         * <p>Minutes are specified by integers from 0 to 59.
-         */
-        @NonNull
-        public Builder setMinute(@IntRange(from = 0, to = 59) int minute) {
-            mMinute = Preconditions.checkArgumentInRange(minute, 0, 59, "minute");
-            return this;
-        }
-
-        /**
-         * Sets the current status of the {@link AlarmInstance}.
-         *
-         * <p>Status can be either {@link AlarmInstance#STATUS_UNKNOWN},
-         * {@link AlarmInstance#STATUS_SCHEDULED}, {@link AlarmInstance#STATUS_FIRING},
-         * {@link AlarmInstance#STATUS_DISMISSED}, {@link AlarmInstance#STATUS_SNOOZED}, or
-         * {@link AlarmInstance#STATUS_MISSED}.
+         * <p>Status can be either {@link #STATUS_UNKNOWN}, {@link #STATUS_SCHEDULED},
+         * {@link #STATUS_FIRING}, {@link #STATUS_DISMISSED}, {@link #STATUS_SNOOZED}, or
+         * {@link #STATUS_MISSED}.
          */
         @NonNull
         public Builder setStatus(@Status int status) {
@@ -387,7 +239,7 @@
          * Sets the length of time in milliseconds the {@link AlarmInstance} will remain snoozed
          * before it fires again.
          *
-         * <p>If not set, or set to -1, then the {@link AlarmInstance} does not support snoozing.
+         * <p>If not set, or set to -1, then it does not support snoozing.
          */
         @NonNull
         public Builder setSnoozeDurationMillis(long snoozeDurationMillis) {
@@ -398,11 +250,9 @@
         /** Builds the {@link AlarmInstance}. */
         @NonNull
         public AlarmInstance build() {
-            Preconditions.checkNotNull(mId);
-            Preconditions.checkNotNull(mNamespace);
-
-            return new AlarmInstance(mNamespace, mId, mScore, mCreationTimestampMillis, mTtlMillis,
-                    mYear, mMonth, mDay, mHour, mMinute, mStatus, mSnoozeDurationMillis);
+            return new AlarmInstance(mNamespace, mId, mDocumentScore,
+                    mCreationTimestampMillis, mDocumentTtlMillis, mScheduledTime, mStatus,
+                    mSnoozeDurationMillis);
         }
     }
 }
diff --git a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/BaseBuiltinTypeBuilder.java b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/BaseBuiltinTypeBuilder.java
new file mode 100644
index 0000000..43b48a1
--- /dev/null
+++ b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/BaseBuiltinTypeBuilder.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.appsearch.builtintypes;
+
+import androidx.annotation.NonNull;
+import androidx.core.util.Preconditions;
+
+/**
+ * Default Builder for an AppSearch built in type. This builder includes all the default
+ * AppSearch properties.
+ */
+abstract class BaseBuiltinTypeBuilder<T extends BaseBuiltinTypeBuilder<T>> {
+    protected final String mNamespace;
+    protected final String mId;
+    protected int mDocumentScore;
+    protected long mCreationTimestampMillis;
+    protected long mDocumentTtlMillis;
+
+    protected BaseBuiltinTypeBuilder(@NonNull String namespace, @NonNull String id) {
+        mNamespace = Preconditions.checkNotNull(namespace);
+        mId = Preconditions.checkNotNull(id);
+
+        // Default for unset creationTimestampMillis. AppSearch will internally convert this
+        // to current time when creating the GenericDocument.
+        mCreationTimestampMillis = -1;
+    }
+
+    /**
+     * Sets the user-provided opaque document score of the current AppSearch document, which can
+     * be used for ranking using
+     * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}.
+     *
+     * <p>See {@link androidx.appsearch.annotation.Document.Score} for more information on score.
+     */
+    @NonNull
+    @SuppressWarnings("unchecked")
+    public T setDocumentScore(int documentScore) {
+        mDocumentScore = documentScore;
+        return (T) this;
+    }
+
+    /**
+     * Sets the creation timestamp for the current AppSearch entity, in milliseconds using the
+     * {@link System#currentTimeMillis()} time base.
+     *
+     * <p>This timestamp refers to the creation time of the AppSearch entity, not when the
+     * document is written into AppSearch.
+     *
+     * <p>If not set, then the current timestamp will be used.
+     *
+     * <p>See {@link androidx.appsearch.annotation.Document.CreationTimestampMillis} for more
+     * information on creation timestamp.
+     */
+    @NonNull
+    @SuppressWarnings("unchecked")
+    public T setCreationTimestampMillis(long creationTimestampMillis) {
+        mCreationTimestampMillis = creationTimestampMillis;
+        return (T) this;
+    }
+
+    /**
+     * Sets the time-to-live (TTL) for the current AppSearch document as a duration in milliseconds.
+     *
+     * <p>The document will be automatically deleted when the TTL expires.
+     *
+     * <p>If not set, then the document will never expire.
+     *
+     * <p>See {@link androidx.appsearch.annotation.Document.TtlMillis} for more information on
+     * TTL.
+     */
+    @NonNull
+    @SuppressWarnings("unchecked")
+    public T setDocumentTtlMillis(long documentTtlMillis) {
+        mDocumentTtlMillis = documentTtlMillis;
+        return (T) this;
+    }
+}
diff --git a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Timer.java b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Timer.java
index 0bac43d..d2015d1 100644
--- a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Timer.java
+++ b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/builtintypes/Timer.java
@@ -16,11 +16,16 @@
 
 package androidx.appsearch.builtintypes;
 
+import android.content.Context;
+import android.os.Build;
 import android.os.SystemClock;
+import android.provider.Settings;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.appsearch.annotation.Document;
 import androidx.appsearch.app.AppSearchSchema.StringPropertyConfig;
@@ -30,10 +35,10 @@
 import java.lang.annotation.RetentionPolicy;
 
 /**
- * AppSearch document representing a Timer entity.
+ * AppSearch document representing a {@link Timer} entity.
  */
 @Document(name = "builtin:Timer")
-public class Timer {
+public final class Timer {
     /** @hide */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     @IntDef({STATUS_UNKNOWN, STATUS_STARTED, STATUS_PAUSED, STATUS_EXPIRED, STATUS_MISSED,
@@ -61,13 +66,13 @@
     private final String mId;
 
     @Document.Score
-    private final int mScore;
+    private final int mDocumentScore;
 
     @Document.CreationTimestampMillis
     private final long mCreationTimestampMillis;
 
     @Document.TtlMillis
-    private final long mTtlMillis;
+    private final long mDocumentTtlMillis;
 
     @Document.StringProperty(indexingType = StringPropertyConfig.INDEXING_TYPE_PREFIXES)
     private final String mName;
@@ -76,13 +81,19 @@
     private final long mDurationMillis;
 
     @Document.LongProperty
+    private final long mOriginalDurationMillis;
+
+    @Document.LongProperty
     private final long mStartTimeMillis;
 
     @Document.LongProperty
     private final long mStartTimeMillisInElapsedRealtime;
 
     @Document.LongProperty
-    private final long mRemainingTimeMillis;
+    private final int mBootCount;
+
+    @Document.LongProperty
+    private final long mRemainingTimeMillisSinceUpdate;
 
     @Document.StringProperty
     private final String mRingtone;
@@ -91,142 +102,164 @@
     private final int mStatus;
 
     @Document.BooleanProperty
-    private final boolean mVibrate;
+    private final boolean mShouldVibrate;
 
-    Timer(String namespace, String id, int score, long creationTimestampMillis, long ttlMillis,
-            String name, long durationMillis, long startTimeMillis,
-            long startTimeMillisInElapsedRealtime, long remainingTimeMillis, String ringtone,
-            int status, boolean vibrate) {
-        mNamespace = namespace;
-        mId = id;
-        mScore = score;
+    Timer(@NonNull String namespace, @NonNull String id, int documentScore,
+            long creationTimestampMillis, long documentTtlMillis, @Nullable String name,
+            long durationMillis, long originalDurationMillis, long startTimeMillis,
+            long startTimeMillisInElapsedRealtime, int bootCount,
+            long remainingTimeMillisSinceUpdate, @Nullable String ringtone, int status,
+            boolean shouldVibrate) {
+        mNamespace = Preconditions.checkNotNull(namespace);
+        mId = Preconditions.checkNotNull(id);
+        mDocumentScore = documentScore;
         mCreationTimestampMillis = creationTimestampMillis;
-        mTtlMillis = ttlMillis;
+        mDocumentTtlMillis = documentTtlMillis;
         mName = name;
         mDurationMillis = durationMillis;
+        mOriginalDurationMillis = originalDurationMillis;
         mStartTimeMillis = startTimeMillis;
         mStartTimeMillisInElapsedRealtime = startTimeMillisInElapsedRealtime;
-        mRemainingTimeMillis = remainingTimeMillis;
+        mBootCount = bootCount;
+        mRemainingTimeMillisSinceUpdate = remainingTimeMillisSinceUpdate;
         mRingtone = ringtone;
         mStatus = status;
-        mVibrate = vibrate;
+        mShouldVibrate = shouldVibrate;
     }
 
-    /** Returns the namespace of the {@link Timer}. */
+    /** Returns the namespace. */
     @NonNull
     public String getNamespace() {
         return mNamespace;
     }
 
-    /** Returns the unique identifier of the {@link Timer}. */
+    /** Returns the unique identifier. */
     @NonNull
     public String getId() {
         return mId;
     }
 
     /**
-     * Returns the user-provided opaque document score of the {@link Timer}, which can be used for
-     * ranking using
-     * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}
+     * Returns the user-provided opaque document score of the current AppSearch document, which can
+     * be used for ranking using
+     * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}.
+     *
+     * <p>See {@link Document.Score} for more information on score.
      */
-    public int getScore() {
-        return mScore;
+    public int getDocumentScore() {
+        return mDocumentScore;
     }
 
     /**
-     * Returns the creation timestamp for the {@link Timer} document, in milliseconds using the
+     * Returns the creation timestamp for the current AppSearch entity, in milliseconds using the
      * {@link System#currentTimeMillis()} time base.
+     *
+     * <p>This timestamp refers to the creation time of the AppSearch entity, not when the
+     * document is written into AppSearch.
+     *
+     * <p>If not set, then the current timestamp will be used.
+     *
+     * <p>See {@link androidx.appsearch.annotation.Document.CreationTimestampMillis} for more
+     * information on creation timestamp.
      */
     public long getCreationTimestampMillis() {
         return mCreationTimestampMillis;
     }
 
     /**
-     * Returns the time-to-live (TTL) for the {@link Timer} document in milliseconds using the
-     * {@link System#currentTimeMillis()} time base.
+     * Returns the time-to-live (TTL) for the current AppSearch document as a duration in
+     * milliseconds.
      *
-     * <p>The {@link Timer} document will be automatically deleted when the TTL expires.
+     * <p>The document will be automatically deleted when the TTL expires.
+     *
+     * <p>See {@link Document.TtlMillis} for more information on TTL.
      */
-    public long getTtlMillis() {
-        return mTtlMillis;
+    public long getDocumentTtlMillis() {
+        return mDocumentTtlMillis;
     }
 
-    /** Returns the name associated with the {@link Timer}. */
+    /** Returns the name. */
     @Nullable
     public String getName() {
         return mName;
     }
 
     /**
-     * Returns the total duration of the {@link Timer}, in milliseconds.
+     * Returns the total duration in milliseconds, including additional time added by the user.
+     *
+     * <p>Applications may allow the user to add additional durations. The durationMillis will
+     * always return the new updated duration.
      */
     public long getDurationMillis() {
         return mDurationMillis;
     }
 
     /**
-     * Returns the time at which the {@link Timer} was started in milliseconds using the
-     * {@link System#currentTimeMillis()} time base.
+     * Returns the original duration in milliseconds when the {@link Timer} was first created.
      *
+     * <p>Applications may allow the user to add additional durations. The
+     * originalDurationMillis will always return the original duration before any change has
+     * taken place.
+     */
+    public long getOriginalDurationMillis() {
+        return mOriginalDurationMillis;
+    }
+
+    /**
+     * Returns the most recent time that the status transitioned to {@link #STATUS_STARTED}. In
+     * milliseconds using the {@link System#currentTimeMillis()} time base.
      *
-     * <p>If the {@link Timer} is in a {@link Timer#STATUS_STARTED} state, then its expire time
-     * can be calculated using:
-     * <pre>{@code
-     * long expireTime = timer.getStartTimeMillis + timer.getRemainingTimeMillis();
-     * }</pre>
+     * <p>If the status is not {@link #STATUS_STARTED}, then this value is undefined, and
+     * should not be used.
      *
-     * <p>See {@link #getStartTimeMillisInElapsedRealtime()} to see how startTimeMillis and
-     * startTimeMillisInElapsedRealtime should be used.
+     * <p>This value is used to calculate {@link #getExpirationTimeMillis(Context)}.
      */
     public long getStartTimeMillis() {
         return mStartTimeMillis;
     }
 
     /**
-     * Returns the time at which the {@link Timer} was started in milliseconds using the
-     * {@link android.os.SystemClock#elapsedRealtime()} time base, or -1 if not present.
+     * Returns the most recent real time that the status transitioned to {@link #STATUS_STARTED}.
+     * In milliseconds using the {@link android.os.SystemClock#elapsedRealtime()} time base.
      *
-     * <p>If present, startTimeMillisInElapsedRealtime should be the preferred value used to do
-     * accurate time keeping in {@link Timer}.
+     * <p>If the status is not {@link #STATUS_STARTED}, then this value is undefined, and
+     * should not be used.
      *
-     * <p>If not present, or if {@link SystemClock#elapsedRealtime()} is unreliable, for example
-     * after a device reboot, or the {@link Timer} document is moved to a different device, then
-     * startTimeMillis should be used instead for time keeping.
-     *
-     * <p>If the {@link Timer} is in a {@link Timer#STATUS_STARTED} state, then its expire time
-     * can be calculated using:
-     * <pre>{@code
-     * long elapsedTime = SystemClock.elapsedRealtime() -
-     *   timer.getStartTimeMillisInElapsedRealtime();
-     * long expireTime = System.currentTimeMillis() + timer.getRemainingTimeMillis() - elapsedTime;
-     * }</pre>
+     * <p>This value is used to calculate {@link #getExpirationTimeMillis(Context)}.
      */
     public long getStartTimeMillisInElapsedRealtime() {
         return mStartTimeMillisInElapsedRealtime;
     }
 
     /**
-     * Returns the amount of time remaining when the {@link Timer} was started, paused or reset,
-     * in milliseconds.
+     * Returns the boot count of the device when this document is last updated.
      *
-     * <p>The current remaining time can also be calculate using either
-     * {@link #getStartTimeMillis()} or {@link #getStartTimeMillisInElapsedRealtime()}:
-     * <pre>{@code
-     * long elapsedTime = System.currentTimeMillis() - timer.getStartTimeMillis();
-     * long currentRemainingTime = timer.getRemainingTimeMillis() - elapsedTime;
-     * }</pre>
-     * <pre>{@code
-     * long elapsedTime = SystemClock.elapsedRealtime() -
-     *   timer.getStartTimeMillisInElapsedRealtime();
-     * long currentRemainingTime = timer.getRemainingTimeMillis() - elapsedTime;
-     * }</pre>
+     * <p>The boot count of the device can be accessed from Global Settings. See
+     * {@link android.provider.Settings.Global#BOOT_COUNT}.
+     *
+     * <p>On older APIs where boot count is not available, this value should not be used.
+     *
+     * <p>If available, this value is used to calculate {@link #getExpirationTimeMillis(Context)}
+     * and {@link #getCurrentRemainingTime(Context)}.
      */
-    public long getRemainingTimeMillis() {
-        return mRemainingTimeMillis;
+    public int getBootCount() {
+        return mBootCount;
     }
 
     /**
-     * Returns the ringtone of the {@link Timer} as a content URI to be played, or
+     * Returns the amount of time remaining in milliseconds for the {@link Timer} since it was
+     * started, paused or reset.
+     *
+     * <p>If it is in the {@link #STATUS_STARTED} state, then the current remaining time will be
+     * different from this value. To get the current remaining time, use
+     * {@link #getCurrentRemainingTime(Context)}.
+     */
+    public long getRemainingTimeMillisSinceUpdate() {
+        return mRemainingTimeMillisSinceUpdate;
+    }
+
+    /**
+     * Returns the ringtone as a content URI to be played, or
      * {@link android.provider.AlarmClock#VALUE_RINGTONE_SILENT} if no ringtone will be played.
      */
     @Nullable
@@ -235,11 +268,10 @@
     }
 
     /**
-     * Returns the current status of the {@link Timer}.
+     * Returns the current status.
      *
-     * <p>Status can be {@link Timer#STATUS_UNKNOWN}, {@link Timer#STATUS_STARTED},
-     * {@link Timer#STATUS_PAUSED}, {@link Timer#STATUS_EXPIRED}, {@link Timer#STATUS_MISSED}, or
-     * {@link Timer#STATUS_RESET}.
+     * <p>Status can be {@link #STATUS_UNKNOWN}, {@link #STATUS_STARTED}, {@link #STATUS_PAUSED},
+     * {@link #STATUS_EXPIRED}, {@link #STATUS_MISSED}, or {@link #STATUS_RESET}.
      */
     @Status
     public int getStatus() {
@@ -247,102 +279,128 @@
     }
 
     /** Returns whether or not to activate the device vibrator when the {@link Timer} expires. */
-    public boolean isVibrate() {
-        return mVibrate;
+    public boolean shouldVibrate() {
+        return mShouldVibrate;
+    }
+
+    /**
+     * Calculates the expire time in milliseconds in the {@link System#currentTimeMillis()} time
+     * base.
+     *
+     * <p>{@link Long#MAX_VALUE} will be returned if the {@link Timer} is {@link #STATUS_PAUSED}
+     * or {@link #STATUS_RESET}.
+     *
+     * <p>A negative value may be returned if the {@link Timer} is {@link #STATUS_MISSED} or
+     * {@link #STATUS_EXPIRED} to indicate it expired in the past.
+     *
+     * @param context The app context
+     */
+    public long getExpirationTimeMillis(@NonNull Context context) {
+        if (mStatus == STATUS_PAUSED || mStatus == STATUS_RESET) {
+            return Long.MAX_VALUE;
+        }
+
+        int currentBootCount = -1;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            currentBootCount = Api17Impl.getCurrentBootCount(context);
+        }
+
+        if (currentBootCount == -1 || currentBootCount != mBootCount) {
+            // Boot count doesn't exist or doesn't match current device boot count. Use wall
+            // clock time since elapsed realtime is no longer valid.
+            return mStartTimeMillis + mRemainingTimeMillisSinceUpdate;
+        } else {
+            // Boot count matches current device boot count. Therefore we can use elapsed
+            // realtime to do calculations.
+            long elapsedTime = SystemClock.elapsedRealtime() - mStartTimeMillisInElapsedRealtime;
+            return System.currentTimeMillis() + mRemainingTimeMillisSinceUpdate - elapsedTime;
+        }
+    }
+
+    /**
+     * Calculates the current remaining time in milliseconds.
+     *
+     * <p>A negative value may be returned if the {@link Timer} is {@link #STATUS_MISSED} or
+     * {@link #STATUS_EXPIRED} to indicate it has already fired.
+     *
+     * @param context The app context
+     */
+    public long getCurrentRemainingTime(@NonNull Context context) {
+        if (mStatus == STATUS_PAUSED || mStatus == STATUS_RESET) {
+            // The timer has not started, so the remaining time is the same as the last updated one.
+            return mRemainingTimeMillisSinceUpdate;
+        }
+
+        int currentBootCount = -1;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            currentBootCount = Api17Impl.getCurrentBootCount(context);
+        }
+
+        long elapsedTime;
+        if (currentBootCount == -1 || currentBootCount != mBootCount) {
+            // Boot count doesn't exist or doesn't match current device boot count. Use wall
+            // clock time since elapsed realtime is no longer valid.
+            elapsedTime = System.currentTimeMillis() - mStartTimeMillis;
+        } else {
+            // Boot count matches current device boot count. Therefore we can use elapsed
+            // realtime to do calculations.
+            elapsedTime = SystemClock.elapsedRealtime() - mStartTimeMillisInElapsedRealtime;
+        }
+        return mRemainingTimeMillisSinceUpdate - elapsedTime;
+    }
+
+    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+    private static final class Api17Impl {
+        @DoNotInline
+        static int getCurrentBootCount(@NonNull Context context) {
+            return Settings.Global.getInt(context.getContentResolver(),
+                    Settings.Global.BOOT_COUNT, -1);
+        }
+
+        private Api17Impl() {}
     }
 
     /** Builder for {@link Timer}. */
-    public static final class Builder {
-        private final String mNamespace;
-        private final String mId;
-        private int mScore;
-        private long mCreationTimestampMillis;
-        private long mTtlMillis;
+    public static final class Builder extends BaseBuiltinTypeBuilder<Builder> {
         private String mName;
         private long mDurationMillis;
+        private long mOriginalDurationMillis;
         private long mStartTimeMillis;
         private long mStartTimeMillisInElapsedRealtime;
-        private long mRemainingTimeMillis;
+        private int mBootCount;
+        private long mRemainingTimeMillisSinceUpdate;
         private String mRingtone;
         private int mStatus;
-        private boolean mVibrate;
+        private boolean mShouldVibrate;
 
         /**
          * Constructor for {@link Timer.Builder}.
          *
-         * @param namespace Namespace for the {@link Timer} Document. See
-         * {@link Document.Namespace}.
-         * @param id Unique identifier for the {@link Timer} Document. See {@link Document.Id}.
+         * @param namespace Namespace for the Document. See {@link Document.Namespace}.
+         * @param id Unique identifier for the Document. See {@link Document.Id}.
          */
         public Builder(@NonNull String namespace, @NonNull String id) {
-            mNamespace = Preconditions.checkNotNull(namespace);
-            mId = Preconditions.checkNotNull(id);
-
-            // Default for unset creationTimestampMillis. AppSearch will internally convert this
-            // to current time when creating the GenericDocument.
-            mCreationTimestampMillis = -1;
-            // Default for unset startTimeMillisInElapsedRealtime
-            mStartTimeMillisInElapsedRealtime = -1;
+            super(namespace, id);
         }
 
         /**
-         * Constructor for {@link Timer.Builder} with all the existing values of a {@link Timer}.
+         * Constructor for {@link Timer.Builder} with all the existing values.
          */
         public Builder(@NonNull Timer timer) {
             this(timer.getNamespace(), timer.getId());
-            mScore = timer.getScore();
+            mDocumentScore = timer.getDocumentScore();
             mCreationTimestampMillis = timer.getCreationTimestampMillis();
-            mTtlMillis = timer.getTtlMillis();
+            mDocumentTtlMillis = timer.getDocumentTtlMillis();
             mName = timer.getName();
             mDurationMillis = timer.getDurationMillis();
+            mOriginalDurationMillis = timer.getOriginalDurationMillis();
             mStartTimeMillis = timer.getStartTimeMillis();
             mStartTimeMillisInElapsedRealtime = timer.getStartTimeMillisInElapsedRealtime();
-            mRemainingTimeMillis = timer.getRemainingTimeMillis();
+            mBootCount = timer.getBootCount();
+            mRemainingTimeMillisSinceUpdate = timer.getRemainingTimeMillisSinceUpdate();
             mRingtone = timer.getRingtone();
             mStatus = timer.getStatus();
-            mVibrate = timer.isVibrate();
-        }
-
-        /**
-         * Sets the opaque document score of the {@link Timer}, which can be used for ranking using
-         * {@link androidx.appsearch.app.SearchSpec.RankingStrategy#RANKING_STRATEGY_DOCUMENT_SCORE}
-         *
-         * <p>See {@link Document.Score}
-         */
-        @NonNull
-        public Builder setScore(int score) {
-            mScore = score;
-            return this;
-        }
-
-        /**
-         * Sets the creation timestamp of the {@link Timer} document, in milliseconds using the
-         * {@link System#currentTimeMillis()} time base.
-         *
-         * <p>If not set, then the current timestamp will be used.
-         *
-         * <p>See {@link Document.CreationTimestampMillis}
-         */
-        @NonNull
-        public Builder setCreationTimestampMillis(long creationTimestampMillis) {
-            mCreationTimestampMillis = creationTimestampMillis;
-            return this;
-        }
-
-        /**
-         * Sets the time-to-live (TTL) for the {@link Timer} document in milliseconds using the
-         * {@link System#currentTimeMillis()} time base.
-         *
-         * <p>The {@link Timer} document will be automatically deleted when the TTL expires.
-         *
-         * <p>If not set, then the document will never expire.
-         *
-         * <p>See {@link Document.TtlMillis}
-         */
-        @NonNull
-        public Builder setTtlMillis(long ttlMillis) {
-            mTtlMillis = ttlMillis;
-            return this;
+            mShouldVibrate = timer.shouldVibrate();
         }
 
         /** Sets the name. */
@@ -353,7 +411,7 @@
         }
 
         /**
-         * Sets the total duration of the {@link Timer}, in milliseconds.
+         * Sets the total duration in milliseconds, including additional time added by the user.
          */
         @NonNull
         public Builder setDurationMillis(long durationMillis) {
@@ -362,44 +420,64 @@
         }
 
         /**
-         * Sets the time at which the {@link Timer} was started in milliseconds using the
+         * Sets the original duration in milliseconds when the {@link Timer} was first created.
+         */
+        @NonNull
+        public Builder setOriginalDurationMillis(long originalDurationMillis) {
+            mOriginalDurationMillis = originalDurationMillis;
+            return this;
+        }
+
+        /**
+         * Sets the most recent time that the status transitioned to {@link #STATUS_STARTED}.
+         *
+         * <p> Start time should be sampled in both the {@link System#currentTimeMillis()} and
+         * {@link android.os.SystemClock#elapsedRealtime()} time base. In addition, the boot
+         * count of the device is needed to check if the
+         * {@link android.os.SystemClock#elapsedRealtime()} time base is valid.
+         *
+         * @param startTimeMillis The start time in milliseconds using the
          * {@link System#currentTimeMillis()} time base.
-         *
-         * <p>See {@link #setStartTimeMillisInElapsedRealtime(long)} on how startTimeMillis and
-         * startTimeMillisInElapsedRealtime should be used.
-         */
-        @NonNull
-        public Builder setStartTimeMillis(long startTimeMillis) {
-            mStartTimeMillis = startTimeMillis;
-            return this;
-        }
-
-        /**
-         * Sets the time at which the {@link Timer} was started in milliseconds using the
+         * @param startTimeMillisInElapsedRealtime The start time in milliseconds using the
          * {@link android.os.SystemClock#elapsedRealtime()} time base.
-         *
-         * <p>startTimeMillis and startTimeMillisInElapsedRealtime should be sampled at
-         * the same time, using {@link System#currentTimeMillis()} and
-         * {@link android.os.SystemClock#elapsedRealtime()} respectively.
-         *
-         * <p>In situations where the reader cannot reliably use
-         * {@link android.os.SystemClock#elapsedRealtime()}, for example if the reader is not on
-         * the same device where the {@link Timer} document is written, then
-         * startTimeMillisInElapsedRealtime should not be set.
+         * @param bootCount The current boot count of the device. See
+         * {@link android.provider.Settings.Global#BOOT_COUNT}.
          */
         @NonNull
-        public Builder setStartTimeMillisInElapsedRealtime(long startTimeMillisInElapsedRealtime) {
+        public Builder setStartTimeMillis(long startTimeMillis,
+                long startTimeMillisInElapsedRealtime, int bootCount) {
+            mStartTimeMillis = startTimeMillis;
             mStartTimeMillisInElapsedRealtime = startTimeMillisInElapsedRealtime;
+            mBootCount = bootCount;
             return this;
         }
 
         /**
-         * Sets the amount of time remaining when the {@link Timer} was started, paused or reset,
-         * in milliseconds.
+         * Sets the most recent time that the status transitioned to {@link #STATUS_STARTED}.
+         *
+         * <p>See {@link #setStartTimeMillis(long, long, int)}.
+         *
+         * @param context The app context used to fetch boot count.
+         * @param startTimeMillis The start time in milliseconds using the
+         * {@link System#currentTimeMillis()} time base.
+         * @param startTimeMillisInElapsedRealtime The start time in milliseconds using the
+         * {@link android.os.SystemClock#elapsedRealtime()} time base.
+         */
+        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
+        @NonNull
+        public Builder setStartTimeMillis(@NonNull Context context, long startTimeMillis,
+                long startTimeMillisInElapsedRealtime) {
+            int bootCount = Api17Impl.getCurrentBootCount(context);
+            return setStartTimeMillis(startTimeMillis, startTimeMillisInElapsedRealtime, bootCount);
+        }
+
+        /**
+         * Sets the amount of time remaining in milliseconds for the {@link Timer} since it was
+         * started, paused or reset.
          */
         @NonNull
-        public Builder setRemainingTimeMillis(long remainingTimeMillis) {
-            mRemainingTimeMillis = remainingTimeMillis;
+        public Builder setRemainingTimeMillisSinceUpdate(long remainingTimeMillisSinceUpdate) {
+            mRemainingTimeMillisSinceUpdate = remainingTimeMillisSinceUpdate;
             return this;
         }
 
@@ -414,11 +492,11 @@
         }
 
         /**
-         * Sets the current status of the {@link Timer}.
+         * Sets the current status.
          *
-         * <p>Status can be {@link Timer#STATUS_UNKNOWN}, {@link Timer#STATUS_STARTED},
-         * {@link Timer#STATUS_PAUSED}, {@link Timer#STATUS_EXPIRED}, {@link Timer#STATUS_MISSED},
-         * or {@link Timer#STATUS_RESET}.
+         * <p>Status can be {@link #STATUS_UNKNOWN}, {@link #STATUS_STARTED},
+         * {@link #STATUS_PAUSED}, {@link #STATUS_EXPIRED}, {@link #STATUS_MISSED}, or
+         * {@link #STATUS_RESET}.
          */
         @NonNull
         public Builder setStatus(@Status int status) {
@@ -428,20 +506,19 @@
 
         /** Sets whether or not to activate the device vibrator when the {@link Timer} expires. */
         @NonNull
-        public Builder setVibrate(boolean vibrate) {
-            mVibrate = vibrate;
+        public Builder setShouldVibrate(boolean shouldVibrate) {
+            mShouldVibrate = shouldVibrate;
             return this;
         }
 
         /** Builds the {@link Timer}. */
         @NonNull
         public Timer build() {
-            Preconditions.checkNotNull(mId);
-            Preconditions.checkNotNull(mNamespace);
-
-            return new Timer(mNamespace, mId, mScore, mCreationTimestampMillis, mTtlMillis, mName,
-                    mDurationMillis, mStartTimeMillis, mStartTimeMillisInElapsedRealtime,
-                    mRemainingTimeMillis, mRingtone, mStatus, mVibrate);
+            return new Timer(mNamespace, mId, mDocumentScore,
+                    mCreationTimestampMillis, mDocumentTtlMillis, mName, mDurationMillis,
+                    mOriginalDurationMillis, mStartTimeMillis,
+                    mStartTimeMillisInElapsedRealtime, mBootCount,
+                    mRemainingTimeMillisSinceUpdate, mRingtone, mStatus, mShouldVibrate);
         }
     }
 }
diff --git a/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/utils/DateTimeFormatValidator.java b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/utils/DateTimeFormatValidator.java
new file mode 100644
index 0000000..c472161
--- /dev/null
+++ b/appsearch/appsearch-builtin-types/src/main/java/androidx/appsearch/utils/DateTimeFormatValidator.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.appsearch.utils;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Helper class used to validate date time formats.
+ *
+ * @hide
+ */
+@RestrictTo(LIBRARY)
+public final class DateTimeFormatValidator {
+    private DateTimeFormatValidator() {}
+
+    /**
+     * Returns true if the date string matches yyyy-MM-dd
+     */
+    public static boolean validateISO8601Date(@NonNull String dateString) {
+        return validateDateFormat("yyyy-MM-dd", dateString);
+    }
+
+    /**
+     * Returns true if the date string matches yyyy-MM-ddTHH:mm:ss
+     */
+    public static boolean validateISO8601DateTime(@NonNull String dateString) {
+        return validateDateFormat("yyyy-MM-dd'T'HH:mm:ss", dateString);
+    }
+
+    /**
+     * Returns true if the date string matches the provided format exactly.
+     */
+    public static boolean validateDateFormat(@NonNull String format, @NonNull String dateString) {
+        DateFormat dateFormat = new SimpleDateFormat(format);
+        dateFormat.setLenient(false);
+        try {
+            Date date = dateFormat.parse(dateString);
+            // ensure exact match
+            if (date == null || !dateString.equals(dateFormat.format(date))) {
+                return false;
+            }
+        } catch (ParseException e) {
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/appsearch/appsearch-local-storage/build.gradle b/appsearch/appsearch-local-storage/build.gradle
index e79ca97..1e4fca1 100644
--- a/appsearch/appsearch-local-storage/build.gradle
+++ b/appsearch/appsearch-local-storage/build.gradle
@@ -55,7 +55,7 @@
     }
     externalNativeBuild {
         cmake {
-            version "3.22.1"
+            version libs.versions.cmake.get()
             path "../../../../external/icing/CMakeLists.txt"
         }
     }
diff --git a/benchmark/benchmark-common/api/1.1.0-beta03.txt b/benchmark/benchmark-common/api/1.1.0-beta03.txt
new file mode 100644
index 0000000..8fd1366
--- /dev/null
+++ b/benchmark/benchmark-common/api/1.1.0-beta03.txt
@@ -0,0 +1,52 @@
+// Signature format: 4.0
+package androidx.benchmark {
+
+  @RequiresApi(21) public final class Api21Kt {
+  }
+
+  @RequiresApi(24) public final class Api24Kt {
+  }
+
+  @RequiresApi(27) public final class Api27Kt {
+  }
+
+  @RequiresApi(29) public final class Api29Kt {
+  }
+
+  public final class ArgumentsKt {
+  }
+
+  public final class BenchmarkState {
+    method public boolean keepRunning();
+    method public void pauseTiming();
+    method public void resumeTiming();
+    field public static final androidx.benchmark.BenchmarkState.Companion Companion;
+  }
+
+  public static final class BenchmarkState.Companion {
+  }
+
+  public final class ConfigurationErrorKt {
+  }
+
+  public final class MetricNameUtilsKt {
+  }
+
+  public final class ProfilerKt {
+  }
+
+  public final class UserspaceTracingKt {
+  }
+
+}
+
+package androidx.benchmark.perfetto {
+
+  public final class PerfettoConfigKt {
+  }
+
+  public final class UiStateKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-common/api/public_plus_experimental_1.1.0-beta03.txt b/benchmark/benchmark-common/api/public_plus_experimental_1.1.0-beta03.txt
new file mode 100644
index 0000000..fd9ccb2
--- /dev/null
+++ b/benchmark/benchmark-common/api/public_plus_experimental_1.1.0-beta03.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.benchmark {
+
+  @RequiresApi(21) public final class Api21Kt {
+  }
+
+  @RequiresApi(24) public final class Api24Kt {
+  }
+
+  @RequiresApi(27) public final class Api27Kt {
+  }
+
+  @RequiresApi(29) public final class Api29Kt {
+  }
+
+  public final class ArgumentsKt {
+  }
+
+  public final class BenchmarkState {
+    method public boolean keepRunning();
+    method public void pauseTiming();
+    method @androidx.benchmark.BenchmarkState.Companion.ExperimentalExternalReport public static void reportData(String className, String testName, @IntRange(from=0) long totalRunTimeNs, java.util.List<java.lang.Long> dataNs, @IntRange(from=0) int warmupIterations, @IntRange(from=0) long thermalThrottleSleepSeconds, @IntRange(from=1) int repeatIterations);
+    method public void resumeTiming();
+    field public static final androidx.benchmark.BenchmarkState.Companion Companion;
+  }
+
+  public static final class BenchmarkState.Companion {
+    method @androidx.benchmark.BenchmarkState.Companion.ExperimentalExternalReport public void reportData(String className, String testName, @IntRange(from=0) long totalRunTimeNs, java.util.List<java.lang.Long> dataNs, @IntRange(from=0) int warmupIterations, @IntRange(from=0) long thermalThrottleSleepSeconds, @IntRange(from=1) int repeatIterations);
+  }
+
+  @kotlin.Experimental @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public static @interface BenchmarkState.Companion.ExperimentalExternalReport {
+  }
+
+  public final class ConfigurationErrorKt {
+  }
+
+  public final class MetricNameUtilsKt {
+  }
+
+  public final class ProfilerKt {
+  }
+
+  public final class UserspaceTracingKt {
+  }
+
+}
+
+package androidx.benchmark.perfetto {
+
+  public final class PerfettoConfigKt {
+  }
+
+  public final class UiStateKt {
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/benchmark/benchmark-common/api/res-1.1.0-beta03.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to benchmark/benchmark-common/api/res-1.1.0-beta03.txt
diff --git a/benchmark/benchmark-common/api/restricted_1.1.0-beta03.txt b/benchmark/benchmark-common/api/restricted_1.1.0-beta03.txt
new file mode 100644
index 0000000..fb74f25
--- /dev/null
+++ b/benchmark/benchmark-common/api/restricted_1.1.0-beta03.txt
@@ -0,0 +1,54 @@
+// Signature format: 4.0
+package androidx.benchmark {
+
+  @RequiresApi(21) public final class Api21Kt {
+  }
+
+  @RequiresApi(24) public final class Api24Kt {
+  }
+
+  @RequiresApi(27) public final class Api27Kt {
+  }
+
+  @RequiresApi(29) public final class Api29Kt {
+  }
+
+  public final class ArgumentsKt {
+  }
+
+  public final class BenchmarkState {
+    method public boolean keepRunning();
+    method @kotlin.PublishedApi internal boolean keepRunningInternal();
+    method public void pauseTiming();
+    method public void resumeTiming();
+    field public static final androidx.benchmark.BenchmarkState.Companion Companion;
+    field @kotlin.PublishedApi internal int iterationsRemaining;
+  }
+
+  public static final class BenchmarkState.Companion {
+  }
+
+  public final class ConfigurationErrorKt {
+  }
+
+  public final class MetricNameUtilsKt {
+  }
+
+  public final class ProfilerKt {
+  }
+
+  public final class UserspaceTracingKt {
+  }
+
+}
+
+package androidx.benchmark.perfetto {
+
+  public final class PerfettoConfigKt {
+  }
+
+  public final class UiStateKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/ProfilerTest.kt b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/ProfilerTest.kt
index 5f5b7f4..dee870d 100644
--- a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/ProfilerTest.kt
+++ b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/ProfilerTest.kt
@@ -20,14 +20,12 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
-import org.junit.Assume
+import java.io.File
+import kotlin.test.assertSame
+import kotlin.test.assertTrue
 import org.junit.Assume.assumeFalse
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.io.File
-import kotlin.test.assertFalse
-import kotlin.test.assertSame
-import kotlin.test.assertTrue
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
@@ -52,18 +50,21 @@
 
     private fun verifyProfiler(
         profiler: Profiler,
-        file: File
+        regex: Regex
     ) {
-        Assume.assumeFalse(
+        assumeFalse(
             "Workaround native crash on API 21 in CI, see b/173662168",
             profiler == MethodTracing && Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP,
         )
 
-        file.delete() // clean up, if previous run left this behind
-        assertFalse(file.exists())
-
-        profiler.start("test")
+        val outputRelPath = profiler.start("test")!!.outputRelativePath
         profiler.stop()
+        val file = File(Outputs.outputDirectory, outputRelPath)
+
+        assertTrue(
+            actual = regex.matches(outputRelPath),
+            message = "expected profiler output path $outputRelPath to match $regex"
+        )
         assertTrue(file.exists(), "Profiler should create: ${file.absolutePath}")
 
         // we don't delete the file to enable inspecting the file
@@ -73,13 +74,13 @@
     @Test
     fun methodTracing() = verifyProfiler(
         profiler = MethodTracing,
-        file = Outputs.testOutputFile("test-methodTracing.trace")
+        regex = Regex("test-methodTracing-.+.trace")
     )
 
     @Test
     fun stackSamplingLegacy() = verifyProfiler(
         profiler = StackSamplingLegacy,
-        file = Outputs.testOutputFile("test-stackSamplingLegacy.trace")
+        regex = Regex("test-stackSamplingLegacy-.+.trace")
     )
 
     @SdkSuppress(minSdkVersion = 29) // simpleperf on system image starting API 29
@@ -90,7 +91,7 @@
 
         verifyProfiler(
             profiler = StackSamplingSimpleperf,
-            file = Outputs.testOutputFile("test-stackSampling.trace")
+            regex = Regex("test-stackSampling-.+.trace")
         )
     }
 }
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Profiler.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Profiler.kt
index d3d34f5..dbd8793 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Profiler.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Profiler.kt
@@ -22,6 +22,7 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
 import androidx.benchmark.BenchmarkState.Companion.TAG
+import androidx.benchmark.Outputs.dateToFileName
 import androidx.benchmark.simpleperf.ProfileSession
 import androidx.benchmark.simpleperf.RecordOptions
 
@@ -95,6 +96,10 @@
             "ConnectedSampled" to ConnectedSampling
         )
             .mapKeys { it.key.lowercase() }[name.lowercase()]
+
+        fun traceName(traceUniqueName: String, traceTypeLabel: String): String {
+            return "$traceUniqueName-$traceTypeLabel-${dateToFileName()}.trace"
+        }
     }
 }
 
@@ -127,13 +132,13 @@
 }
 
 internal object StackSamplingLegacy : Profiler() {
-    @RestrictTo(RestrictTo.Scope.TESTS)
+    @get:RestrictTo(RestrictTo.Scope.TESTS)
     var isRunning = false
 
     override fun start(traceUniqueName: String): ResultFile {
         isRunning = true
         return startRuntimeMethodTracing(
-            traceFileName = "$traceUniqueName-stackSamplingLegacy.trace",
+            traceFileName = traceName(traceUniqueName, "stackSamplingLegacy"),
             sampled = true
         )
     }
@@ -149,7 +154,7 @@
 internal object MethodTracing : Profiler() {
     override fun start(traceUniqueName: String): ResultFile {
         return startRuntimeMethodTracing(
-            traceFileName = "$traceUniqueName-methodTracing.trace",
+            traceFileName = traceName(traceUniqueName, "methodTracing"),
             sampled = false
         )
     }
@@ -219,7 +224,7 @@
         Shell.executeCommand("setprop debug.perf_cpu_time_max_percent 25")
         Shell.executeCommand("setprop debug.perf_event_mlock_kb 32800")
 
-        outputRelativePath = "$traceUniqueName-stackSampling.trace"
+        outputRelativePath = traceName(traceUniqueName, "stackSampling")
         session = ProfileSession().also {
             // prepare simpleperf must be done as shell user, so do this here with other shell setup
             // NOTE: this is sticky across reboots, so missing this will cause tests or profiling to
diff --git a/benchmark/benchmark-junit4/api/1.1.0-beta03.txt b/benchmark/benchmark-junit4/api/1.1.0-beta03.txt
new file mode 100644
index 0000000..873f105
--- /dev/null
+++ b/benchmark/benchmark-junit4/api/1.1.0-beta03.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.benchmark.junit4 {
+
+  public class AndroidBenchmarkRunner extends androidx.test.runner.AndroidJUnitRunner {
+    ctor public AndroidBenchmarkRunner();
+  }
+
+  public final class BenchmarkRule implements org.junit.rules.TestRule {
+    ctor public BenchmarkRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public androidx.benchmark.BenchmarkState getState();
+  }
+
+  public final class BenchmarkRule.Scope {
+    method public inline <T> T! runWithTimingDisabled(kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class BenchmarkRuleKt {
+    method public static inline void measureRepeated(androidx.benchmark.junit4.BenchmarkRule, kotlin.jvm.functions.Function1<? super androidx.benchmark.junit4.BenchmarkRule.Scope,kotlin.Unit> block);
+  }
+
+}
+
diff --git a/benchmark/benchmark-junit4/api/public_plus_experimental_1.1.0-beta03.txt b/benchmark/benchmark-junit4/api/public_plus_experimental_1.1.0-beta03.txt
new file mode 100644
index 0000000..873f105
--- /dev/null
+++ b/benchmark/benchmark-junit4/api/public_plus_experimental_1.1.0-beta03.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.benchmark.junit4 {
+
+  public class AndroidBenchmarkRunner extends androidx.test.runner.AndroidJUnitRunner {
+    ctor public AndroidBenchmarkRunner();
+  }
+
+  public final class BenchmarkRule implements org.junit.rules.TestRule {
+    ctor public BenchmarkRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public androidx.benchmark.BenchmarkState getState();
+  }
+
+  public final class BenchmarkRule.Scope {
+    method public inline <T> T! runWithTimingDisabled(kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class BenchmarkRuleKt {
+    method public static inline void measureRepeated(androidx.benchmark.junit4.BenchmarkRule, kotlin.jvm.functions.Function1<? super androidx.benchmark.junit4.BenchmarkRule.Scope,kotlin.Unit> block);
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/benchmark/benchmark-junit4/api/res-1.1.0-beta03.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to benchmark/benchmark-junit4/api/res-1.1.0-beta03.txt
diff --git a/benchmark/benchmark-junit4/api/restricted_1.1.0-beta03.txt b/benchmark/benchmark-junit4/api/restricted_1.1.0-beta03.txt
new file mode 100644
index 0000000..d3bf38c
--- /dev/null
+++ b/benchmark/benchmark-junit4/api/restricted_1.1.0-beta03.txt
@@ -0,0 +1,29 @@
+// Signature format: 4.0
+package androidx.benchmark.junit4 {
+
+  public class AndroidBenchmarkRunner extends androidx.test.runner.AndroidJUnitRunner {
+    ctor public AndroidBenchmarkRunner();
+  }
+
+  public final class BenchmarkRule implements org.junit.rules.TestRule {
+    ctor public BenchmarkRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public androidx.benchmark.BenchmarkState getState();
+  }
+
+  public final class BenchmarkRule.Scope {
+    method @kotlin.PublishedApi internal androidx.benchmark.BenchmarkState getOuterState();
+    method public inline <T> T! runWithTimingDisabled(kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class BenchmarkRuleKt {
+    method public static inline void measureRepeated(androidx.benchmark.junit4.BenchmarkRule, kotlin.jvm.functions.Function1<? super androidx.benchmark.junit4.BenchmarkRule.Scope,kotlin.Unit> block);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class PerfettoRule implements org.junit.rules.TestRule {
+    ctor public PerfettoRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/1.1.0-beta03.txt b/benchmark/benchmark-macro-junit4/api/1.1.0-beta03.txt
new file mode 100644
index 0000000..4b1ab53
--- /dev/null
+++ b/benchmark/benchmark-macro-junit4/api/1.1.0-beta03.txt
@@ -0,0 +1,14 @@
+// Signature format: 4.0
+package androidx.benchmark.macro.junit4 {
+
+  public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
+    ctor public MacrobenchmarkRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_1.1.0-beta03.txt b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_1.1.0-beta03.txt
new file mode 100644
index 0000000..31d9966
--- /dev/null
+++ b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_1.1.0-beta03.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.benchmark.macro.junit4 {
+
+  @RequiresApi(28) @androidx.benchmark.macro.ExperimentalBaselineProfilesApi public final class BaselineProfileRule implements org.junit.rules.TestRule {
+    ctor public BaselineProfileRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void collectBaselineProfile(String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+  }
+
+  public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
+    ctor public MacrobenchmarkRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
index fa47278..31d9966 100644
--- a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
+++ b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
@@ -4,7 +4,6 @@
   @RequiresApi(28) @androidx.benchmark.macro.ExperimentalBaselineProfilesApi public final class BaselineProfileRule implements org.junit.rules.TestRule {
     ctor public BaselineProfileRule();
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void collectBaselineProfile(String packageName, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
     method public void collectBaselineProfile(String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
   }
 
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta03.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to benchmark/benchmark-macro-junit4/api/res-1.1.0-beta03.txt
diff --git a/benchmark/benchmark-macro-junit4/api/restricted_1.1.0-beta03.txt b/benchmark/benchmark-macro-junit4/api/restricted_1.1.0-beta03.txt
new file mode 100644
index 0000000..4b1ab53
--- /dev/null
+++ b/benchmark/benchmark-macro-junit4/api/restricted_1.1.0-beta03.txt
@@ -0,0 +1,14 @@
+// Signature format: 4.0
+package androidx.benchmark.macro.junit4 {
+
+  public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
+    ctor public MacrobenchmarkRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
index f4b4bc1..d13868b 100644
--- a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
+++ b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
@@ -54,20 +54,15 @@
     /**
      * Collects baseline profiles for a critical user journey.
      * @param packageName Package name of the app for which profiles are to be generated.
-     * @param setupBlock The block performing app actions prior to the critical user journey.
-     * For example navigating to an Activity where scrolling will be measured.
      * @param [profileBlock] defines the critical user journey.
      */
-    @JvmOverloads
     public fun collectBaselineProfile(
         packageName: String,
-        setupBlock: MacrobenchmarkScope.() -> Unit = {},
         profileBlock: MacrobenchmarkScope.() -> Unit
     ) {
         collectBaselineProfile(
             currentDescription.toUniqueName(),
             packageName = packageName,
-            setupBlock = setupBlock,
             profileBlock = profileBlock
         )
     }
diff --git a/benchmark/benchmark-macro/api/1.1.0-beta03.txt b/benchmark/benchmark-macro/api/1.1.0-beta03.txt
new file mode 100644
index 0000000..ad0beca
--- /dev/null
+++ b/benchmark/benchmark-macro/api/1.1.0-beta03.txt
@@ -0,0 +1,105 @@
+// Signature format: 4.0
+package androidx.benchmark.macro {
+
+  @RequiresApi(29) public final class Api29Kt {
+  }
+
+  public enum BaselineProfileMode {
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode Disable;
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode Require;
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode UseIfAvailable;
+  }
+
+  public final class BaselineProfilesKt {
+  }
+
+  public abstract sealed class CompilationMode {
+    field public static final androidx.benchmark.macro.CompilationMode.Companion Companion;
+    field public static final androidx.benchmark.macro.CompilationMode DEFAULT;
+  }
+
+  public static final class CompilationMode.Companion {
+  }
+
+  public static final class CompilationMode.Full extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.Full();
+  }
+
+  @RequiresApi(24) public static final class CompilationMode.None extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.None();
+  }
+
+  @RequiresApi(24) public static final class CompilationMode.Partial extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.Partial(optional androidx.benchmark.macro.BaselineProfileMode baselineProfileMode, optional @IntRange(from=0) int warmupIterations);
+    ctor public CompilationMode.Partial(optional androidx.benchmark.macro.BaselineProfileMode baselineProfileMode);
+    ctor public CompilationMode.Partial();
+    method public androidx.benchmark.macro.BaselineProfileMode getBaselineProfileMode();
+    method public int getWarmupIterations();
+    property public final androidx.benchmark.macro.BaselineProfileMode baselineProfileMode;
+    property public final int warmupIterations;
+  }
+
+  public final class CompilationModeKt {
+  }
+
+  public final class FrameTimingMetric extends androidx.benchmark.macro.Metric {
+    ctor public FrameTimingMetric();
+  }
+
+  public final class IdeSummaryStringKt {
+  }
+
+  public final class IterationResultKt {
+  }
+
+  public final class MacrobenchmarkKt {
+  }
+
+  public final class MacrobenchmarkScope {
+    ctor public MacrobenchmarkScope(String packageName, boolean launchWithClearTask);
+    method public void dropKernelPageCache();
+    method public androidx.test.uiautomator.UiDevice getDevice();
+    method public Integer? getIteration();
+    method public String getPackageName();
+    method public void killProcess();
+    method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
+    method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
+    method public void startActivityAndWait(android.content.Intent intent);
+    property public final androidx.test.uiautomator.UiDevice device;
+    property public final Integer? iteration;
+    property public final String packageName;
+  }
+
+  public abstract sealed class Metric {
+  }
+
+  public final class MetricKt {
+  }
+
+  public final class MetricResultExtensionsKt {
+  }
+
+  public enum StartupMode {
+    enum_constant public static final androidx.benchmark.macro.StartupMode COLD;
+    enum_constant public static final androidx.benchmark.macro.StartupMode HOT;
+    enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
+  }
+
+  public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+    ctor public StartupTimingMetric();
+  }
+
+  public final class TagKt {
+  }
+
+}
+
+package androidx.benchmark.macro.perfetto {
+
+  public final class ForceTracingKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro/api/public_plus_experimental_1.1.0-beta03.txt b/benchmark/benchmark-macro/api/public_plus_experimental_1.1.0-beta03.txt
new file mode 100644
index 0000000..f010200
--- /dev/null
+++ b/benchmark/benchmark-macro/api/public_plus_experimental_1.1.0-beta03.txt
@@ -0,0 +1,115 @@
+// Signature format: 4.0
+package androidx.benchmark.macro {
+
+  @RequiresApi(29) public final class Api29Kt {
+  }
+
+  public enum BaselineProfileMode {
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode Disable;
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode Require;
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode UseIfAvailable;
+  }
+
+  public final class BaselineProfilesKt {
+  }
+
+  public abstract sealed class CompilationMode {
+    field public static final androidx.benchmark.macro.CompilationMode.Companion Companion;
+    field public static final androidx.benchmark.macro.CompilationMode DEFAULT;
+  }
+
+  public static final class CompilationMode.Companion {
+  }
+
+  public static final class CompilationMode.Full extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.Full();
+  }
+
+  @RequiresApi(24) public static final class CompilationMode.None extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.None();
+  }
+
+  @RequiresApi(24) public static final class CompilationMode.Partial extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.Partial(optional androidx.benchmark.macro.BaselineProfileMode baselineProfileMode, optional @IntRange(from=0) int warmupIterations);
+    ctor public CompilationMode.Partial(optional androidx.benchmark.macro.BaselineProfileMode baselineProfileMode);
+    ctor public CompilationMode.Partial();
+    method public androidx.benchmark.macro.BaselineProfileMode getBaselineProfileMode();
+    method public int getWarmupIterations();
+    property public final androidx.benchmark.macro.BaselineProfileMode baselineProfileMode;
+    property public final int warmupIterations;
+  }
+
+  public final class CompilationModeKt {
+  }
+
+  @kotlin.RequiresOptIn(message="The Baseline profile generation API is experimental.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalBaselineProfilesApi {
+  }
+
+  @kotlin.RequiresOptIn(message="This Metric API is experimental.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalMetricApi {
+  }
+
+  public final class FrameTimingMetric extends androidx.benchmark.macro.Metric {
+    ctor public FrameTimingMetric();
+  }
+
+  public final class IdeSummaryStringKt {
+  }
+
+  public final class IterationResultKt {
+  }
+
+  public final class MacrobenchmarkKt {
+  }
+
+  public final class MacrobenchmarkScope {
+    ctor public MacrobenchmarkScope(String packageName, boolean launchWithClearTask);
+    method public void dropKernelPageCache();
+    method public androidx.test.uiautomator.UiDevice getDevice();
+    method public Integer? getIteration();
+    method public String getPackageName();
+    method public void killProcess();
+    method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
+    method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
+    method public void startActivityAndWait(android.content.Intent intent);
+    property public final androidx.test.uiautomator.UiDevice device;
+    property public final Integer? iteration;
+    property public final String packageName;
+  }
+
+  public abstract sealed class Metric {
+  }
+
+  public final class MetricKt {
+  }
+
+  public final class MetricResultExtensionsKt {
+  }
+
+  public enum StartupMode {
+    enum_constant public static final androidx.benchmark.macro.StartupMode COLD;
+    enum_constant public static final androidx.benchmark.macro.StartupMode HOT;
+    enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
+  }
+
+  public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+    ctor public StartupTimingMetric();
+  }
+
+  public final class TagKt {
+  }
+
+  @RequiresApi(29) @androidx.benchmark.macro.ExperimentalMetricApi public final class TraceSectionMetric extends androidx.benchmark.macro.Metric {
+    ctor public TraceSectionMetric(String sectionName);
+  }
+
+}
+
+package androidx.benchmark.macro.perfetto {
+
+  public final class ForceTracingKt {
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/benchmark/benchmark-macro/api/res-1.1.0-beta03.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to benchmark/benchmark-macro/api/res-1.1.0-beta03.txt
diff --git a/benchmark/benchmark-macro/api/restricted_1.1.0-beta03.txt b/benchmark/benchmark-macro/api/restricted_1.1.0-beta03.txt
new file mode 100644
index 0000000..fd5bba3
--- /dev/null
+++ b/benchmark/benchmark-macro/api/restricted_1.1.0-beta03.txt
@@ -0,0 +1,122 @@
+// Signature format: 4.0
+package androidx.benchmark.macro {
+
+  @RequiresApi(29) public final class Api29Kt {
+  }
+
+  @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class AudioUnderrunMetric extends androidx.benchmark.macro.Metric {
+    ctor public AudioUnderrunMetric();
+  }
+
+  public enum BaselineProfileMode {
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode Disable;
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode Require;
+    enum_constant public static final androidx.benchmark.macro.BaselineProfileMode UseIfAvailable;
+  }
+
+  public final class BaselineProfilesKt {
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void collectBaselineProfile(String uniqueName, String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+  }
+
+  public abstract sealed class CompilationMode {
+    field public static final androidx.benchmark.macro.CompilationMode.Companion Companion;
+    field public static final androidx.benchmark.macro.CompilationMode DEFAULT;
+  }
+
+  public static final class CompilationMode.Companion {
+  }
+
+  public static final class CompilationMode.Full extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.Full();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class CompilationMode.Interpreted extends androidx.benchmark.macro.CompilationMode {
+  }
+
+  @RequiresApi(24) public static final class CompilationMode.None extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.None();
+  }
+
+  @RequiresApi(24) public static final class CompilationMode.Partial extends androidx.benchmark.macro.CompilationMode {
+    ctor public CompilationMode.Partial(optional androidx.benchmark.macro.BaselineProfileMode baselineProfileMode, optional @IntRange(from=0) int warmupIterations);
+    ctor public CompilationMode.Partial(optional androidx.benchmark.macro.BaselineProfileMode baselineProfileMode);
+    ctor public CompilationMode.Partial();
+    method public androidx.benchmark.macro.BaselineProfileMode getBaselineProfileMode();
+    method public int getWarmupIterations();
+    property public final androidx.benchmark.macro.BaselineProfileMode baselineProfileMode;
+    property public final int warmupIterations;
+  }
+
+  public final class CompilationModeKt {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static boolean isSupportedWithVmSettings(androidx.benchmark.macro.CompilationMode);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class FrameTimingGfxInfoMetric extends androidx.benchmark.macro.Metric {
+    ctor public FrameTimingGfxInfoMetric();
+  }
+
+  public final class FrameTimingMetric extends androidx.benchmark.macro.Metric {
+    ctor public FrameTimingMetric();
+  }
+
+  public final class IdeSummaryStringKt {
+  }
+
+  public final class IterationResultKt {
+  }
+
+  public final class MacrobenchmarkKt {
+  }
+
+  public final class MacrobenchmarkScope {
+    ctor public MacrobenchmarkScope(String packageName, boolean launchWithClearTask);
+    method public void dropKernelPageCache();
+    method public androidx.test.uiautomator.UiDevice getDevice();
+    method public Integer? getIteration();
+    method public String getPackageName();
+    method public void killProcess();
+    method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
+    method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
+    method public void startActivityAndWait(android.content.Intent intent);
+    property public final androidx.test.uiautomator.UiDevice device;
+    property public final Integer? iteration;
+    property public final String packageName;
+  }
+
+  public abstract sealed class Metric {
+  }
+
+  public final class MetricKt {
+  }
+
+  public final class MetricResultExtensionsKt {
+  }
+
+  public enum StartupMode {
+    enum_constant public static final androidx.benchmark.macro.StartupMode COLD;
+    enum_constant public static final androidx.benchmark.macro.StartupMode HOT;
+    enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
+  }
+
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class StartupTimingLegacyMetric extends androidx.benchmark.macro.Metric {
+    ctor public StartupTimingLegacyMetric();
+  }
+
+  public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+    ctor public StartupTimingMetric();
+  }
+
+  public final class TagKt {
+  }
+
+}
+
+package androidx.benchmark.macro.perfetto {
+
+  public final class ForceTracingKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro/api/restricted_current.ignore b/benchmark/benchmark-macro/api/restricted_current.ignore
new file mode 100644
index 0000000..01c1abb
--- /dev/null
+++ b/benchmark/benchmark-macro/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.benchmark.macro.BaselineProfilesKt#collectBaselineProfile(String, String, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit>, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit>):
+    Removed method androidx.benchmark.macro.BaselineProfilesKt.collectBaselineProfile(String,String,kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit>,kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit>)
diff --git a/benchmark/benchmark-macro/api/restricted_current.txt b/benchmark/benchmark-macro/api/restricted_current.txt
index d90e8af..fd5bba3 100644
--- a/benchmark/benchmark-macro/api/restricted_current.txt
+++ b/benchmark/benchmark-macro/api/restricted_current.txt
@@ -15,7 +15,7 @@
   }
 
   public final class BaselineProfilesKt {
-    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void collectBaselineProfile(String uniqueName, String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+    method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void collectBaselineProfile(String uniqueName, String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
   }
 
   public abstract sealed class CompilationMode {
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
index 1e89bc5..8f9aea9 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
@@ -35,7 +35,6 @@
 fun collectBaselineProfile(
     uniqueName: String,
     packageName: String,
-    setupBlock: MacrobenchmarkScope.() -> Unit,
     profileBlock: MacrobenchmarkScope.() -> Unit
 ) {
     require(Build.VERSION.SDK_INT >= 28) {
@@ -63,7 +62,6 @@
             compilationMode.resetAndCompile(
                 packageName = packageName
             ) {
-                setupBlock(scope)
                 profileBlock(scope)
             }
         }
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt
index ad70b84..4983e76 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt
@@ -63,10 +63,8 @@
     fun githubBrowserProfiles() {
         baselineRule.collectBaselineProfile(
             packageName = PACKAGE_NAME,
-            setupBlock = {
-                startActivityAndWait()
-            },
             profileBlock = {
+                startActivityAndWait()
                 val searchText = device.findObject(By.res(PACKAGE_NAME, REPO_SEARCH_ID))
                 searchText?.text = "Test"
                 val search = device.findObject(By.res(PACKAGE_NAME, SEARCH_ID))
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
index b85d69c..3218a28 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
@@ -48,12 +48,10 @@
     fun baselineProfiles() {
         baselineRule.collectBaselineProfile(
             packageName = "androidx.benchmark.integration.macrobenchmark.target",
-            setupBlock = {
+            profileBlock = {
                 val intent = Intent()
                 intent.action = ACTION
                 startActivityAndWait(intent)
-            },
-            profileBlock = {
                 val recycler = device.findObject(
                     By.res(
                         PACKAGE_NAME,
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/ChangeInfoGitClientTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/ChangeInfoGitClientTest.kt
index ebeb86a..501c7c6 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/ChangeInfoGitClientTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/dependencyTracker/ChangeInfoGitClientTest.kt
@@ -271,6 +271,6 @@
     fun getVersion(config: String): String? {
         return ChangeInfoGitClient("{}", config)
             .getGitLog(GitCommitRange(n = 1), keepMerges = true, fullProjectDir = File("."))
-            .getOrNull(0)?.gitCommit
+            .getOrNull(0)?.sha
     }
 }
diff --git a/buildSrc/lint.xml b/buildSrc/lint.xml
index 5ec6632..08fefd5 100644
--- a/buildSrc/lint.xml
+++ b/buildSrc/lint.xml
@@ -32,6 +32,19 @@
         <!-- Required for AppSearch icing tests. -->
         <ignore path="**/java/tests/**" />
     </issue>
+
+    <issue id="IllegalExperimentalApiUsage">
+
+        <!--
+         The placeholder string "USE_SYSTEM_OUT_DIR" must match the string
+         ATOMIC_LIBRARY_GROUP_FILE_PLACEHOLDER defined in BanInappropriateExperimentalUsage.
+         The suffix must match `fileLocation` defined in AndroidXRootImplPlugin.
+        -->
+        <option
+            name="atomicLibraryGroupFilename"
+            value="USE_SYSTEM_OUT_DIR/lint/atomic-library-groups.txt"/>
+    </issue>
+
     <!-- Re-enable high-priority checks for tests (and everything else). -->
     <issue id="NewApi" severity="fatal" />
     <issue id="WrongThread" severity="fatal" />
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index dc04d9a..132359e1 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -113,7 +113,6 @@
 
         project.configureTaskTimeouts()
         project.configureMavenArtifactUpload(extension)
-        project.configureExportAtomicLibraryGroupsToText()
         project.configureExternalDependencyLicenseCheck()
         project.configureProjectStructureValidation(extension)
         project.configureProjectVersionValidation(extension)
@@ -394,17 +393,6 @@
         project.addToProjectMap(extension)
     }
 
-    private fun Project.configureExportAtomicLibraryGroupsToText() {
-        project.tasks.register(
-            "exportAtomicLibraryGroupsToText",
-            ExportAtomicLibraryGroupsToTextTask::class.java
-        ) { task ->
-            task.libraryGroupFile = project.file("${project.getSupportRootFolder()}" +
-                "/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt")
-            task.textOutputFile = project.file("${project.buildDir}/lint/atomic-library-groups.txt")
-        }
-    }
-
     private fun Project.configureProjectStructureValidation(
         extension: AndroidXExtension
     ) {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
index 07922a9..00a1892 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
@@ -92,6 +92,20 @@
             tasks.register(AndroidXImplPlugin.CREATE_LIBRARY_BUILD_INFO_FILES_TASK)
         )
 
+        buildOnServerTask.dependsOn(
+            tasks.register(
+                "exportAtomicLibraryGroupsToTextRoot",
+                ExportAtomicLibraryGroupsToTextTask::class.java
+            ) { task ->
+                task.libraryGroupFile = project.file("${project.getSupportRootFolder()}" +
+                    "/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt")
+
+                // This suffix must match the suffix in buildSrc/lint.xml
+                val fileLocation = "${getRootOutDirectory()}/lint/atomic-library-groups.txt"
+                task.textOutputFile = project.file(fileLocation)
+            }
+        )
+
         VerifyPlaygroundGradleConfigurationTask.createIfNecessary(project)?.let {
             buildOnServerTask.dependsOn(it)
         }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index 6345639..53d7c42 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -72,7 +72,6 @@
     // Create fake variant tasks since that is what is invoked by developers.
     val lintTask = tasks.named("lint")
     lintTask.configure { task ->
-        task.dependsOn(tasks.named("exportAtomicLibraryGroupsToText"))
         AffectedModuleDetector.configureTaskGuard(task)
     }
     afterEvaluate {
@@ -123,7 +122,6 @@
                 }}"
             ).configure { task ->
                 AffectedModuleDetector.configureTaskGuard(task)
-                task.dependsOn(tasks.named("exportAtomicLibraryGroupsToText"))
             }
             tasks.named(
                 "lintAnalyze${variant.name.replaceFirstChar {
@@ -131,7 +129,6 @@
                 }}"
             ).configure { task ->
                 AffectedModuleDetector.configureTaskGuard(task)
-                task.dependsOn(tasks.named("exportAtomicLibraryGroupsToText"))
             }
             /* TODO: uncomment when we upgrade to AGP 7.1.0-alpha04
             tasks.named("lintReport${variant.name.capitalize(Locale.US)}").configure { task ->
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfoGitClient.kt b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfoGitClient.kt
index e6758cc..ab175b1 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfoGitClient.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/ChangeInfoGitClient.kt
@@ -147,7 +147,7 @@
         }
         var latestCommit: String? = parseSupportVersion(versionInfo)
         if (latestCommit != null) {
-            return listOf(Commit(latestCommit, fullProjectDir.toString()))
+            return listOf(Commit("_CommitSHA:$latestCommit", fullProjectDir.toString()))
         }
         return listOf()
     }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt
index 073659a..dcc7b31 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitClient.kt
@@ -121,7 +121,7 @@
 /**
  * Class implementation of a git commit.  It uses the input delimiters to parse the commit
  *
- * @property gitCommit a string representation of a git commit
+ * @property formattedCommitText a string representation of a git commit
  * @property projectDir the project directory for which to parse file paths from a commit
  * @property commitSHADelimiter the term to use to search for the commit SHA
  * @property subjectDelimiter the term to use to search for the subject (aka commit summary)
@@ -130,7 +130,7 @@
  * @property authorEmailDelimiter the term to use to search for the author email
  */
 data class Commit(
-    val gitCommit: String,
+    val formattedCommitText: String,
     val projectDir: String,
     private val commitSHADelimiter: String = "_CommitSHA:",
     private val subjectDelimiter: String = "_Subject:",
@@ -150,7 +150,7 @@
     )
 
     init {
-        val listedCommit: List<String> = gitCommit.split('\n')
+        val listedCommit: List<String> = formattedCommitText.split('\n')
         listedCommit.filter { line -> line.trim() != "" }.forEach { line ->
             processCommitLine(line)
         }
@@ -184,7 +184,7 @@
         }
         releaseNoteDelimiters.forEach { delimiter ->
             if (delimiter in line) {
-                getReleaseNotesFromGitLine(line, gitCommit)
+                getReleaseNotesFromGitLine(line, formattedCommitText)
                 return
             }
         }
@@ -270,7 +270,7 @@
      *                  the commit cannot be explained in one line"
      * `release notes: "This is a one-line release note.  The quotes can be used this way too"`
      */
-    private fun getReleaseNotesFromGitLine(line: String, gitCommit: String) {
+    private fun getReleaseNotesFromGitLine(line: String, formattedCommitText: String) {
         /* Account for the use of quotes in a release note line
          * No quotes in the Release Note line means it's a one-line release note
          * If there are quotes, assume it's a multi-line release note
@@ -285,21 +285,22 @@
             releaseNoteDelimiters.forEach { delimiter ->
                 if (delimiter in line) {
                     // Find the starting quote of the release notes quote block
-                    var releaseNoteStartIndex = gitCommit.lastIndexOf(delimiter) + delimiter.length
-                    releaseNoteStartIndex = gitCommit.indexOf('"', releaseNoteStartIndex)
+                    var releaseNoteStartIndex = formattedCommitText.lastIndexOf(delimiter)
+                    + delimiter.length
+                    releaseNoteStartIndex = formattedCommitText.indexOf('"', releaseNoteStartIndex)
                     // Move to the character after the first quote
-                    if (gitCommit[releaseNoteStartIndex] == '"') {
+                    if (formattedCommitText[releaseNoteStartIndex] == '"') {
                         releaseNoteStartIndex++
                     }
                     // Find the ending quote of the release notes quote block
                     var releaseNoteEndIndex = releaseNoteStartIndex + 1
-                    releaseNoteEndIndex = gitCommit.indexOf('"', releaseNoteEndIndex)
+                    releaseNoteEndIndex = formattedCommitText.indexOf('"', releaseNoteEndIndex)
                     // If there is no closing quote, just use the first line
                     if (releaseNoteEndIndex < 0) {
                         getOneLineReleaseNotesFromGitLine(line)
                         return
                     }
-                    releaseNote = gitCommit.substring(
+                    releaseNote = formattedCommitText.substring(
                         startIndex = releaseNoteStartIndex,
                         endIndex = releaseNoteEndIndex
                     ).trim()
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitRunnerGitClient.kt b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitRunnerGitClient.kt
index 985e375..2be38e2 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitRunnerGitClient.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/gitclient/GitRunnerGitClient.kt
@@ -209,7 +209,7 @@
 
     companion object {
         const val PREVIOUS_SUBMITTED_CMD =
-            "git log -1 --merges --oneline --invert-grep --author=android-build-server"
+            "git log -1 --merges --oneline"
         const val CHANGED_FILES_CMD_PREFIX = "git diff --name-only"
         const val GIT_LOG_CMD_PREFIX = "git log --name-only"
     }
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt b/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt
index 9e8d0b4..ec22373 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt
@@ -54,6 +54,7 @@
     val ENTERPRISE = LibraryGroup("androidx.enterprise", LibraryVersions.ENTERPRISE)
     val EXIFINTERFACE = LibraryGroup("androidx.exifinterface", LibraryVersions.EXIFINTERFACE)
     val FRAGMENT = LibraryGroup("androidx.fragment", LibraryVersions.FRAGMENT)
+    val GLANCE_TEMPLATE = LibraryGroup("androidx.template", LibraryVersions.GLANCE_TEMPLATE)
     val GLANCE = LibraryGroup("androidx.glance", LibraryVersions.GLANCE)
     val GRIDLAYOUT = LibraryGroup("androidx.gridlayout", LibraryVersions.GRIDLAYOUT)
     val HEALTH = LibraryGroup("androidx.health", null)
@@ -68,7 +69,6 @@
     val LIBYUV = LibraryGroup("libyuv", LibraryVersions.LIBYUV)
     val LIFECYCLE = LibraryGroup("androidx.lifecycle", LibraryVersions.LIFECYCLE)
     val LOADER = LibraryGroup("androidx.loader", LibraryVersions.LOADER)
-    val LOCALBROADCASTMANAGER = LibraryGroup("androidx.localbroadcastmanager", LibraryVersions.LOCALBROADCASTMANAGER)
     val MEDIA = LibraryGroup("androidx.media", null)
     val MEDIA2 = LibraryGroup("androidx.media2", LibraryVersions.MEDIA2)
     val MEDIAROUTER = LibraryGroup("androidx.mediarouter", LibraryVersions.MEDIAROUTER)
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
index b0eb459..a2bd6d7 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -20,7 +20,7 @@
  * The list of versions codes of all the libraries in this project.
  */
 object LibraryVersions {
-    val ACTIVITY = Version("1.5.0-alpha01")
+    val ACTIVITY = Version("1.5.0-alpha02")
     val ADS_IDENTIFIER = Version("1.0.0-alpha05")
     val ANNOTATION = Version("1.4.0-alpha02")
     val ANNOTATION_EXPERIMENTAL = Version("1.3.0-alpha01")
@@ -29,44 +29,45 @@
     val ARCH_CORE = Version("2.2.0-alpha01")
     val ASYNCLAYOUTINFLATER = Version("1.1.0-alpha01")
     val AUTOFILL = Version("1.2.0-beta02")
-    val BENCHMARK = Version("1.1.0-beta02")
+    val BENCHMARK = Version("1.1.0-beta03")
     val BIOMETRIC = Version("1.2.0-alpha05")
     val BROWSER = Version("1.5.0-alpha01")
     val BUILDSRC_TESTS = Version("1.0.0-alpha01")
-    val CAMERA = Version("1.1.0-beta01")
+    val CAMERA = Version("1.1.0-beta02")
     val CAMERA_PIPE = Version("1.0.0-alpha01")
     val CARDVIEW = Version("1.1.0-alpha01")
-    val CAR_APP = Version("1.2.0-beta02")
+    val CAR_APP = Version("1.2.0-beta03")
     val COLLECTION = Version("1.3.0-alpha01")
     val COLLECTION2 = Version("1.3.0-alpha01")
     val CONTENTPAGER = Version("1.1.0-alpha01")
-    val COMPOSE_MATERIAL3 = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.0.0-alpha04")
-    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.2.0-alpha02")
+    val COMPOSE_MATERIAL3 = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.0.0-alpha05")
+    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.2.0-alpha03")
     val COORDINATORLAYOUT = Version("1.3.0-alpha01")
-    val CORE = Version("1.8.0-alpha03")
+    val CORE = Version("1.8.0-alpha04")
     val CORE_ANIMATION = Version("1.0.0-alpha03")
     val CORE_ANIMATION_TESTING = Version("1.0.0-alpha03")
     val CORE_APPDIGEST = Version("1.0.0-alpha01")
     val CORE_GOOGLE_SHORTCUTS = Version("1.1.0-alpha02")
     val CORE_PERFORMANCE = Version("1.0.0-alpha02")
-    val CORE_REMOTEVIEWS = Version("1.0.0-alpha02")
+    val CORE_REMOTEVIEWS = Version("1.0.0-alpha03")
     val CORE_ROLE = Version("1.2.0-alpha01")
     val CORE_SPLASHSCREEN = Version("1.0.0-beta01")
     val CURSORADAPTER = Version("1.1.0-alpha01")
     val CUSTOMVIEW = Version("1.2.0-alpha01")
     val DATASTORE = Version("1.1.0-alpha01")
     val DOCUMENTFILE = Version("1.1.0-alpha02")
-    val DRAGANDDROP = Version("1.0.0-alpha03")
+    val DRAGANDDROP = Version("1.0.0-alpha04")
     val DRAWERLAYOUT = Version("1.2.0-alpha01")
     val DYNAMICANIMATION = Version("1.1.0-alpha04")
     val DYNAMICANIMATION_KTX = Version("1.0.0-alpha04")
     val EMOJI = Version("1.2.0-alpha03")
-    val EMOJI2 = Version("1.1.0-beta01")
+    val EMOJI2 = Version("1.1.0-beta02")
     val ENTERPRISE = Version("1.1.0-rc01")
     val EXIFINTERFACE = Version("1.4.0-alpha01")
-    val FRAGMENT = Version("1.5.0-alpha01")
+    val FRAGMENT = Version("1.5.0-alpha02")
     val FUTURES = Version("1.2.0-alpha01")
-    val GLANCE = Version("1.0.0-alpha02")
+    val GLANCE_TEMPLATE = Version("1.0.0-alpha01")
+    val GLANCE = Version("1.0.0-alpha03")
     val GRIDLAYOUT = Version("1.1.0-alpha01")
     val HEALTH_SERVICES_CLIENT = Version("1.0.0-alpha04")
     val HEIFWRITER = Version("1.1.0-alpha02")
@@ -81,31 +82,30 @@
     val LEANBACK_TAB = Version("1.1.0-beta01")
     val LEANBACK_GRID = Version("1.0.0-alpha02")
     val LEGACY = Version("1.1.0-alpha01")
-    val LOCALBROADCASTMANAGER = Version("1.2.0-alpha01")
     val LIBYUV = Version("0.1.0-dev01")
-    val LIFECYCLE = Version("2.5.0-alpha01")
-    val LIFECYCLE_VIEWMODEL_COMPOSE = Version("2.5.0-alpha01")
+    val LIFECYCLE = Version("2.5.0-alpha02")
+    val LIFECYCLE_VIEWMODEL_COMPOSE = Version("2.5.0-alpha02")
     val LIFECYCLE_EXTENSIONS = Version("2.2.0")
     val LOADER = Version("1.2.0-alpha01")
-    val MEDIA = Version("1.5.0-rc01")
+    val MEDIA = Version("1.6.0-alpha01")
     val MEDIA2 = Version("1.3.0-alpha01")
     val MEDIAROUTER = Version("1.3.0-alpha02")
     val METRICS = Version("1.0.0-alpha01")
-    val NAVIGATION = Version("2.5.0-alpha01")
+    val NAVIGATION = Version("2.5.0-alpha02")
     val PAGING = Version("3.2.0-alpha01")
     val PAGING_COMPOSE = Version("1.0.0-alpha15")
     val PALETTE = Version("1.1.0-alpha01")
     val PRINT = Version("1.1.0-beta01")
     val PERCENTLAYOUT = Version("1.1.0-alpha01")
     val PREFERENCE = Version("1.3.0-alpha01")
-    val PROFILEINSTALLER = Version("1.2.0-alpha02")
+    val PROFILEINSTALLER = Version("1.2.0-alpha03")
     val RECOMMENDATION = Version("1.1.0-alpha01")
     val RECYCLERVIEW = Version("1.3.0-alpha02")
     val RECYCLERVIEW_SELECTION = Version("1.2.0-alpha02")
     val REMOTECALLBACK = Version("1.0.0-alpha02")
     val RESOURCEINSPECTION = Version("1.1.0-alpha01")
     val ROOM = Version("2.5.0-alpha01")
-    val SAVEDSTATE = Version("1.2.0-alpha01")
+    val SAVEDSTATE = Version("1.2.0-alpha02")
     val SECURITY = Version("1.1.0-alpha04")
     val SECURITY_APP_AUTHENTICATOR = Version("1.0.0-alpha03")
     val SECURITY_APP_AUTHENTICATOR_TESTING = Version("1.0.0-alpha02")
@@ -136,13 +136,13 @@
     val VIEWPAGER = Version("1.1.0-alpha02")
     val VIEWPAGER2 = Version("1.1.0-beta02")
     val WEAR = Version("1.3.0-alpha02")
-    val WEAR_COMPOSE = Version("1.0.0-alpha15")
+    val WEAR_COMPOSE = Version("1.0.0-alpha16")
     val WEAR_INPUT = Version("1.2.0-alpha03")
     val WEAR_INPUT_TESTING = WEAR_INPUT
     val WEAR_ONGOING = Version("1.1.0-alpha01")
     val WEAR_PHONE_INTERACTIONS = Version("1.1.0-alpha03")
     val WEAR_REMOTE_INTERACTIONS = Version("1.1.0-alpha01")
-    val WEAR_TILES = Version("1.1.0-alpha01")
+    val WEAR_TILES = Version("1.1.0-alpha02")
     val WEAR_WATCHFACE = Version("1.1.0-alpha03")
     val WEBKIT = Version("1.5.0-alpha01")
     val WINDOW = Version("1.1.0-alpha01")
diff --git a/busytown/impl/build-studio-and-androidx.sh b/busytown/impl/build-studio-and-androidx.sh
index 0115f27..3354aa1 100755
--- a/busytown/impl/build-studio-and-androidx.sh
+++ b/busytown/impl/build-studio-and-androidx.sh
@@ -85,7 +85,8 @@
 function buildAndroidx() {
   LOG_PROCESSOR="$SCRIPTS_DIR/../development/build_log_processor.sh"
   properties="-Pandroidx.summarizeStderr --no-daemon"
-  "$LOG_PROCESSOR"                   $gw $properties -p frameworks/support    $androidxArguments --profile
+  "$LOG_PROCESSOR" $gw $properties -p frameworks/support $androidxArguments --profile \
+    --dependency-verification=off # building against tip of tree of AGP that potentially pulls in new dependencies
   $SCRIPTS_DIR/impl/parse_profile_htmls.sh
 }
 
diff --git a/camera/camera-camera2/api/1.1.0-beta02.txt b/camera/camera-camera2/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..1459b2c
--- /dev/null
+++ b/camera/camera-camera2/api/1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.camera.camera2 {
+
+  @RequiresApi(21) public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/api/public_plus_experimental_1.1.0-beta02.txt b/camera/camera-camera2/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..583ba10
--- /dev/null
+++ b/camera/camera-camera2/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,53 @@
+// Signature format: 4.0
+package androidx.camera.camera2 {
+
+  @RequiresApi(21) public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
+package androidx.camera.camera2.interop {
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> addCaptureRequestOptions(androidx.camera.camera2.interop.CaptureRequestOptions);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> clearCaptureRequestOptions();
+    method public static androidx.camera.camera2.interop.Camera2CameraControl from(androidx.camera.core.CameraControl);
+    method public androidx.camera.camera2.interop.CaptureRequestOptions getCaptureRequestOptions();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setCaptureRequestOptions(androidx.camera.camera2.interop.CaptureRequestOptions);
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+    method public static androidx.camera.camera2.interop.Camera2CameraInfo from(androidx.camera.core.CameraInfo);
+    method public <T> T? getCameraCharacteristic(android.hardware.camera2.CameraCharacteristics.Key<T!>);
+    method public String getCameraId();
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+  }
+
+  @RequiresApi(21) public static final class Camera2Interop.Extender<T> {
+    ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T!>);
+    method public <ValueT> androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback);
+    method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public class CaptureRequestOptions {
+    ctor public CaptureRequestOptions(androidx.camera.core.impl.Config);
+    method public <ValueT> ValueT? getCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>);
+  }
+
+  @RequiresApi(21) public static final class CaptureRequestOptions.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.camera2.interop.CaptureRequestOptions> {
+    ctor public CaptureRequestOptions.Builder();
+    method public androidx.camera.camera2.interop.CaptureRequestOptions build();
+    method public <ValueT> androidx.camera.camera2.interop.CaptureRequestOptions.Builder clearCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>);
+    method public <ValueT> androidx.camera.camera2.interop.CaptureRequestOptions.Builder setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCamera2Interop {
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/camera/camera-camera2/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to camera/camera-camera2/api/res-1.1.0-beta02.txt
diff --git a/camera/camera-camera2/api/restricted_1.1.0-beta02.txt b/camera/camera-camera2/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..1459b2c
--- /dev/null
+++ b/camera/camera-camera2/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.camera.camera2 {
+
+  @RequiresApi(21) public final class Camera2Config {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SelectResolutionQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SelectResolutionQuirk.java
index ccd9d50..1882363 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SelectResolutionQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SelectResolutionQuirk.java
@@ -43,6 +43,7 @@
             "SM-J710MN", // Samsung Galaxy J7 (2016)
             "SM-A320FL", // Samsung Galaxy A3 (2017)
             "SM-G570M", // Samsung Galaxy J5 Prime
+            "SM-G610F", // Samsung Galaxy J7 Prime
             "SM-G610M"); // Samsung Galaxy J7 Prime
 
     static boolean load() {
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/ResolutionSelectorQuirkTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/ResolutionSelectorQuirkTest.java
index a824364..d7fd719 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/ResolutionSelectorQuirkTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/quirk/ResolutionSelectorQuirkTest.java
@@ -53,5 +53,7 @@
         assertThat(SelectResolutionQuirk.load()).isTrue();
         ReflectionHelpers.setStaticField(Build.class, "MODEL", "SM-G610M");
         assertThat(SelectResolutionQuirk.load()).isTrue();
+        ReflectionHelpers.setStaticField(Build.class, "MODEL", "SM-G610F");
+        assertThat(SelectResolutionQuirk.load()).isTrue();
     }
 }
diff --git a/camera/camera-core/api/1.1.0-beta02.txt b/camera/camera-core/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..75e46de
--- /dev/null
+++ b/camera/camera-core/api/1.1.0-beta02.txt
@@ -0,0 +1,433 @@
+// Signature format: 4.0
+package androidx.camera.core {
+
+  @RequiresApi(21) public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @RequiresApi(21) public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RequiresApi(21) public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
+  @RequiresApi(21) public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
+    method public androidx.camera.core.ExposureState getExposureState();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+    method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
+  }
+
+  @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraProvider {
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+  }
+
+  @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
+  @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
+    ctor public CameraUnavailableException(int);
+    ctor public CameraUnavailableException(int, String?);
+    ctor public CameraUnavailableException(int, String?, Throwable?);
+    ctor public CameraUnavailableException(int, Throwable?);
+    method public int getReason();
+    field public static final int CAMERA_DISABLED = 1; // 0x1
+    field public static final int CAMERA_DISCONNECTED = 2; // 0x2
+    field public static final int CAMERA_ERROR = 3; // 0x3
+    field public static final int CAMERA_IN_USE = 4; // 0x4
+    field public static final int CAMERA_MAX_IN_USE = 5; // 0x5
+    field public static final int CAMERA_UNAVAILABLE_DO_NOT_DISTURB = 6; // 0x6
+    field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class CameraXConfig {
+    method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
+    method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method public int getMinimumLoggingLevel();
+    method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.CameraXConfig.Builder setMinimumLoggingLevel(@IntRange(from=android.util.Log.DEBUG, to=android.util.Log.ERROR) int);
+    method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
+  }
+
+  @RequiresApi(21) public interface ExposureState {
+    method public int getExposureCompensationIndex();
+    method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
+    method public android.util.Rational getExposureCompensationStep();
+    method public boolean isExposureCompensationSupported();
+  }
+
+  @RequiresApi(21) public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  @RequiresApi(21) public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @RequiresApi(21) public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getOutputImageFormat();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
+    field public static final int OUTPUT_IMAGE_FORMAT_YUV_420_888 = 1; // 0x1
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method @IntRange(from=1, to=100) public int getJpegQuality();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  @RequiresApi(21) public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public default android.graphics.Matrix getSensorToBufferTransformMatrix();
+    method public long getTimestamp();
+  }
+
+  @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RequiresApi(21) public class InitializationException extends java.lang.Exception {
+    ctor public InitializationException(String?);
+    ctor public InitializationException(String?, Throwable?);
+    ctor public InitializationException(Throwable?);
+  }
+
+  @RequiresApi(21) public class MeteringPoint {
+    method public float getSize();
+  }
+
+  @RequiresApi(21) public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+    method public void setTargetRotation(int);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract android.util.Size getResolution();
+    method public abstract int getRotationDegrees();
+  }
+
+  @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  @RequiresApi(21) public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public void clearTransformationInfoListener();
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public void setTransformationInfoListener(java.util.concurrent.Executor, androidx.camera.core.SurfaceRequest.TransformationInfoListener);
+    method public boolean willNotProvideSurface();
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract int getRotationDegrees();
+  }
+
+  public static interface SurfaceRequest.TransformationInfoListener {
+    method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
+  }
+
+  @RequiresApi(21) public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @RequiresApi(21) public abstract class UseCase {
+  }
+
+  @RequiresApi(21) public final class UseCaseGroup {
+    method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
+    method public androidx.camera.core.ViewPort? getViewPort();
+  }
+
+  public static final class UseCaseGroup.Builder {
+    ctor public UseCaseGroup.Builder();
+    method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
+    method public androidx.camera.core.UseCaseGroup build();
+    method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
+  }
+
+  @RequiresApi(21) public final class ViewPort {
+    method public android.util.Rational getAspectRatio();
+    method public int getLayoutDirection();
+    method public int getRotation();
+    method public int getScaleType();
+    field public static final int FILL_CENTER = 1; // 0x1
+    field public static final int FILL_END = 2; // 0x2
+    field public static final int FILL_START = 0; // 0x0
+    field public static final int FIT = 3; // 0x3
+  }
+
+  public static final class ViewPort.Builder {
+    ctor public ViewPort.Builder(android.util.Rational, int);
+    method public androidx.camera.core.ViewPort build();
+    method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
+    method public androidx.camera.core.ViewPort.Builder setScaleType(int);
+  }
+
+  @RequiresApi(21) public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/api/public_plus_experimental_1.1.0-beta02.txt b/camera/camera-core/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..58ca9b7
--- /dev/null
+++ b/camera/camera-core/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,437 @@
+// Signature format: 4.0
+package androidx.camera.core {
+
+  @RequiresApi(21) public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @RequiresApi(21) public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RequiresApi(21) public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
+  @RequiresApi(21) public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
+    method public androidx.camera.core.ExposureState getExposureState();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+    method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
+  }
+
+  @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraProvider {
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+  }
+
+  @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
+  @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
+    ctor public CameraUnavailableException(int);
+    ctor public CameraUnavailableException(int, String?);
+    ctor public CameraUnavailableException(int, String?, Throwable?);
+    ctor public CameraUnavailableException(int, Throwable?);
+    method public int getReason();
+    field public static final int CAMERA_DISABLED = 1; // 0x1
+    field public static final int CAMERA_DISCONNECTED = 2; // 0x2
+    field public static final int CAMERA_ERROR = 3; // 0x3
+    field public static final int CAMERA_IN_USE = 4; // 0x4
+    field public static final int CAMERA_MAX_IN_USE = 5; // 0x5
+    field public static final int CAMERA_UNAVAILABLE_DO_NOT_DISTURB = 6; // 0x6
+    field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class CameraXConfig {
+    method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
+    method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method public int getMinimumLoggingLevel();
+    method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.CameraXConfig.Builder setMinimumLoggingLevel(@IntRange(from=android.util.Log.DEBUG, to=android.util.Log.ERROR) int);
+    method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
+  }
+
+  @RequiresApi(21) @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
+  }
+
+  @RequiresApi(21) public interface ExposureState {
+    method public int getExposureCompensationIndex();
+    method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
+    method public android.util.Rational getExposureCompensationStep();
+    method public boolean isExposureCompensationSupported();
+  }
+
+  @RequiresApi(21) public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  @RequiresApi(21) public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @RequiresApi(21) public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getOutputImageFormat();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
+    field public static final int OUTPUT_IMAGE_FORMAT_YUV_420_888 = 1; // 0x1
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method @IntRange(from=1, to=100) public int getJpegQuality();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  @RequiresApi(21) public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public default android.graphics.Matrix getSensorToBufferTransformMatrix();
+    method public long getTimestamp();
+  }
+
+  @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method @androidx.camera.core.ExperimentalGetImage public android.media.Image? getImage();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RequiresApi(21) public class InitializationException extends java.lang.Exception {
+    ctor public InitializationException(String?);
+    ctor public InitializationException(String?, Throwable?);
+    ctor public InitializationException(Throwable?);
+  }
+
+  @RequiresApi(21) public class MeteringPoint {
+    method public float getSize();
+  }
+
+  @RequiresApi(21) public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+    method public void setTargetRotation(int);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract android.util.Size getResolution();
+    method public abstract int getRotationDegrees();
+  }
+
+  @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  @RequiresApi(21) public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public void clearTransformationInfoListener();
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public void setTransformationInfoListener(java.util.concurrent.Executor, androidx.camera.core.SurfaceRequest.TransformationInfoListener);
+    method public boolean willNotProvideSurface();
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract int getRotationDegrees();
+  }
+
+  public static interface SurfaceRequest.TransformationInfoListener {
+    method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
+  }
+
+  @RequiresApi(21) public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @RequiresApi(21) public abstract class UseCase {
+  }
+
+  @RequiresApi(21) public final class UseCaseGroup {
+    method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
+    method public androidx.camera.core.ViewPort? getViewPort();
+  }
+
+  public static final class UseCaseGroup.Builder {
+    ctor public UseCaseGroup.Builder();
+    method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
+    method public androidx.camera.core.UseCaseGroup build();
+    method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
+  }
+
+  @RequiresApi(21) public final class ViewPort {
+    method public android.util.Rational getAspectRatio();
+    method public int getLayoutDirection();
+    method public int getRotation();
+    method public int getScaleType();
+    field public static final int FILL_CENTER = 1; // 0x1
+    field public static final int FILL_END = 2; // 0x2
+    field public static final int FILL_START = 0; // 0x0
+    field public static final int FIT = 3; // 0x3
+  }
+
+  public static final class ViewPort.Builder {
+    ctor public ViewPort.Builder(android.util.Rational, int);
+    method public androidx.camera.core.ViewPort build();
+    method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
+    method public androidx.camera.core.ViewPort.Builder setScaleType(int);
+  }
+
+  @RequiresApi(21) public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/camera/camera-core/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to camera/camera-core/api/res-1.1.0-beta02.txt
diff --git a/camera/camera-core/api/restricted_1.1.0-beta02.txt b/camera/camera-core/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..75e46de
--- /dev/null
+++ b/camera/camera-core/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,433 @@
+// Signature format: 4.0
+package androidx.camera.core {
+
+  @RequiresApi(21) public class AspectRatio {
+    field public static final int RATIO_16_9 = 1; // 0x1
+    field public static final int RATIO_4_3 = 0; // 0x0
+  }
+
+  @RequiresApi(21) public interface Camera {
+    method public androidx.camera.core.CameraControl getCameraControl();
+    method public androidx.camera.core.CameraInfo getCameraInfo();
+  }
+
+  @RequiresApi(21) public interface CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
+  }
+
+  public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraFilter {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+  }
+
+  @RequiresApi(21) public interface CameraInfo {
+    method public androidx.camera.core.CameraSelector getCameraSelector();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
+    method public androidx.camera.core.ExposureState getExposureState();
+    method public int getSensorRotationDegrees();
+    method public int getSensorRotationDegrees(int);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method public boolean hasFlashUnit();
+    method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
+  }
+
+  @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
+  }
+
+  @RequiresApi(21) public interface CameraProvider {
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+  }
+
+  @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
+    field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
+    field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
+    field public static final int LENS_FACING_BACK = 1; // 0x1
+    field public static final int LENS_FACING_FRONT = 0; // 0x0
+  }
+
+  public static final class CameraSelector.Builder {
+    ctor public CameraSelector.Builder();
+    method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
+    method public androidx.camera.core.CameraSelector build();
+    method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
+    ctor public CameraState();
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
+    method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
+    method public abstract androidx.camera.core.CameraState.StateError? getError();
+    method public abstract androidx.camera.core.CameraState.Type getType();
+    field public static final int ERROR_CAMERA_DISABLED = 5; // 0x5
+    field public static final int ERROR_CAMERA_FATAL_ERROR = 6; // 0x6
+    field public static final int ERROR_CAMERA_IN_USE = 2; // 0x2
+    field public static final int ERROR_DO_NOT_DISTURB_MODE_ENABLED = 7; // 0x7
+    field public static final int ERROR_MAX_CAMERAS_IN_USE = 1; // 0x1
+    field public static final int ERROR_OTHER_RECOVERABLE_ERROR = 3; // 0x3
+    field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
+  }
+
+  public enum CameraState.ErrorType {
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
+    enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+    ctor public CameraState.StateError();
+    method public static androidx.camera.core.CameraState.StateError create(int);
+    method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
+    method public abstract Throwable? getCause();
+    method public abstract int getCode();
+    method public androidx.camera.core.CameraState.ErrorType getType();
+  }
+
+  public enum CameraState.Type {
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
+    enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
+    enum_constant public static final androidx.camera.core.CameraState.Type OPENING;
+    enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
+  }
+
+  @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
+    ctor public CameraUnavailableException(int);
+    ctor public CameraUnavailableException(int, String?);
+    ctor public CameraUnavailableException(int, String?, Throwable?);
+    ctor public CameraUnavailableException(int, Throwable?);
+    method public int getReason();
+    field public static final int CAMERA_DISABLED = 1; // 0x1
+    field public static final int CAMERA_DISCONNECTED = 2; // 0x2
+    field public static final int CAMERA_ERROR = 3; // 0x3
+    field public static final int CAMERA_IN_USE = 4; // 0x4
+    field public static final int CAMERA_MAX_IN_USE = 5; // 0x5
+    field public static final int CAMERA_UNAVAILABLE_DO_NOT_DISTURB = 6; // 0x6
+    field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class CameraXConfig {
+    method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
+    method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
+    method public int getMinimumLoggingLevel();
+    method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
+  }
+
+  public static final class CameraXConfig.Builder {
+    method public androidx.camera.core.CameraXConfig build();
+    method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
+    method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
+    method public androidx.camera.core.CameraXConfig.Builder setCameraExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.CameraXConfig.Builder setMinimumLoggingLevel(@IntRange(from=android.util.Log.DEBUG, to=android.util.Log.ERROR) int);
+    method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
+  }
+
+  public static interface CameraXConfig.Provider {
+    method public androidx.camera.core.CameraXConfig getCameraXConfig();
+  }
+
+  @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
+  }
+
+  @RequiresApi(21) public interface ExposureState {
+    method public int getExposureCompensationIndex();
+    method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
+    method public android.util.Rational getExposureCompensationStep();
+    method public boolean isExposureCompensationSupported();
+  }
+
+  @RequiresApi(21) public interface ExtendableBuilder<T> {
+    method public T build();
+  }
+
+  @RequiresApi(21) public final class FocusMeteringAction {
+    method public long getAutoCancelDurationInMillis();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
+    method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAwb();
+    method public boolean isAutoCancelEnabled();
+    field public static final int FLAG_AE = 2; // 0x2
+    field public static final int FLAG_AF = 1; // 0x1
+    field public static final int FLAG_AWB = 4; // 0x4
+  }
+
+  public static class FocusMeteringAction.Builder {
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
+    ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
+    method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint, int);
+    method public androidx.camera.core.FocusMeteringAction build();
+    method public androidx.camera.core.FocusMeteringAction.Builder disableAutoCancel();
+    method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
+  }
+
+  @RequiresApi(21) public final class FocusMeteringResult {
+    method public boolean isFocusSuccessful();
+  }
+
+  @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
+    method public void clearAnalyzer();
+    method public int getBackpressureStrategy();
+    method public int getImageQueueDepth();
+    method public int getOutputImageFormat();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
+    method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method public void setTargetRotation(int);
+    field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
+    field public static final int OUTPUT_IMAGE_FORMAT_YUV_420_888 = 1; // 0x1
+    field public static final int STRATEGY_BLOCK_PRODUCER = 1; // 0x1
+    field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
+  }
+
+  public static interface ImageAnalysis.Analyzer {
+    method public void analyze(androidx.camera.core.ImageProxy);
+  }
+
+  public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+    ctor public ImageAnalysis.Builder();
+    method public androidx.camera.core.ImageAnalysis build();
+    method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
+  }
+
+  @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
+    method public int getCaptureMode();
+    method public int getFlashMode();
+    method @IntRange(from=1, to=100) public int getJpegQuality();
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method public void setCropAspectRatio(android.util.Rational);
+    method public void setFlashMode(int);
+    method public void setTargetRotation(int);
+    method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    field public static final int CAPTURE_MODE_MAXIMIZE_QUALITY = 0; // 0x0
+    field public static final int CAPTURE_MODE_MINIMIZE_LATENCY = 1; // 0x1
+    field public static final int ERROR_CAMERA_CLOSED = 3; // 0x3
+    field public static final int ERROR_CAPTURE_FAILED = 2; // 0x2
+    field public static final int ERROR_FILE_IO = 1; // 0x1
+    field public static final int ERROR_INVALID_CAMERA = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int FLASH_MODE_AUTO = 0; // 0x0
+    field public static final int FLASH_MODE_OFF = 2; // 0x2
+    field public static final int FLASH_MODE_ON = 1; // 0x1
+  }
+
+  public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+    ctor public ImageCapture.Builder();
+    method public androidx.camera.core.ImageCapture build();
+    method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setFlashMode(int);
+    method public androidx.camera.core.ImageCapture.Builder setIoExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.core.ImageCapture.Builder setJpegQuality(@IntRange(from=1, to=100) int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.ImageCapture.Builder setTargetName(String);
+    method public androidx.camera.core.ImageCapture.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
+  }
+
+  public static final class ImageCapture.Metadata {
+    ctor public ImageCapture.Metadata();
+    method public android.location.Location? getLocation();
+    method public boolean isReversedHorizontal();
+    method public boolean isReversedVertical();
+    method public void setLocation(android.location.Location?);
+    method public void setReversedHorizontal(boolean);
+    method public void setReversedVertical(boolean);
+  }
+
+  public abstract static class ImageCapture.OnImageCapturedCallback {
+    ctor public ImageCapture.OnImageCapturedCallback();
+    method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
+    method public void onError(androidx.camera.core.ImageCaptureException);
+  }
+
+  public static interface ImageCapture.OnImageSavedCallback {
+    method public void onError(androidx.camera.core.ImageCaptureException);
+    method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
+  }
+
+  public static final class ImageCapture.OutputFileOptions {
+  }
+
+  public static final class ImageCapture.OutputFileOptions.Builder {
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
+    ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
+    method public androidx.camera.core.ImageCapture.OutputFileOptions build();
+    method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
+  }
+
+  public static class ImageCapture.OutputFileResults {
+    method public android.net.Uri? getSavedUri();
+  }
+
+  @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
+    ctor public ImageCaptureException(int, String, Throwable?);
+    method public int getImageCaptureError();
+  }
+
+  @RequiresApi(21) public interface ImageInfo {
+    method public int getRotationDegrees();
+    method public default android.graphics.Matrix getSensorToBufferTransformMatrix();
+    method public long getTimestamp();
+  }
+
+  @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
+    method public void close();
+    method public android.graphics.Rect getCropRect();
+    method public int getFormat();
+    method public int getHeight();
+    method public androidx.camera.core.ImageInfo getImageInfo();
+    method public androidx.camera.core.ImageProxy.PlaneProxy![] getPlanes();
+    method public int getWidth();
+    method public void setCropRect(android.graphics.Rect?);
+  }
+
+  public static interface ImageProxy.PlaneProxy {
+    method public java.nio.ByteBuffer getBuffer();
+    method public int getPixelStride();
+    method public int getRowStride();
+  }
+
+  @RequiresApi(21) public class InitializationException extends java.lang.Exception {
+    ctor public InitializationException(String?);
+    ctor public InitializationException(String?, Throwable?);
+    ctor public InitializationException(Throwable?);
+  }
+
+  @RequiresApi(21) public class MeteringPoint {
+    method public float getSize();
+  }
+
+  @RequiresApi(21) public abstract class MeteringPointFactory {
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float);
+    method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
+    method public static float getDefaultPointSize();
+  }
+
+  @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
+    method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
+    method public int getTargetRotation();
+    method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
+    method @UiThread public void setSurfaceProvider(androidx.camera.core.Preview.SurfaceProvider?);
+    method public void setTargetRotation(int);
+  }
+
+  public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+    ctor public Preview.Builder();
+    method public androidx.camera.core.Preview build();
+    method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
+    method public androidx.camera.core.Preview.Builder setTargetName(String);
+    method public androidx.camera.core.Preview.Builder setTargetResolution(android.util.Size);
+    method public androidx.camera.core.Preview.Builder setTargetRotation(int);
+  }
+
+  public static interface Preview.SurfaceProvider {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract android.util.Size getResolution();
+    method public abstract int getRotationDegrees();
+  }
+
+  @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+    ctor public SurfaceOrientedMeteringPointFactory(float, float);
+    ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
+  }
+
+  @RequiresApi(21) public final class SurfaceRequest {
+    method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
+    method public void clearTransformationInfoListener();
+    method public android.util.Size getResolution();
+    method public void provideSurface(android.view.Surface, java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.core.SurfaceRequest.Result!>);
+    method public void setTransformationInfoListener(java.util.concurrent.Executor, androidx.camera.core.SurfaceRequest.TransformationInfoListener);
+    method public boolean willNotProvideSurface();
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+    method public abstract int getResultCode();
+    method public abstract android.view.Surface getSurface();
+    field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
+    field public static final int RESULT_REQUEST_CANCELLED = 1; // 0x1
+    field public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3; // 0x3
+    field public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0; // 0x0
+    field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
+  }
+
+  @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+    method public abstract android.graphics.Rect getCropRect();
+    method public abstract int getRotationDegrees();
+  }
+
+  public static interface SurfaceRequest.TransformationInfoListener {
+    method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
+  }
+
+  @RequiresApi(21) public class TorchState {
+    field public static final int OFF = 0; // 0x0
+    field public static final int ON = 1; // 0x1
+  }
+
+  @RequiresApi(21) public abstract class UseCase {
+  }
+
+  @RequiresApi(21) public final class UseCaseGroup {
+    method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
+    method public androidx.camera.core.ViewPort? getViewPort();
+  }
+
+  public static final class UseCaseGroup.Builder {
+    ctor public UseCaseGroup.Builder();
+    method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
+    method public androidx.camera.core.UseCaseGroup build();
+    method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
+  }
+
+  @RequiresApi(21) public final class ViewPort {
+    method public android.util.Rational getAspectRatio();
+    method public int getLayoutDirection();
+    method public int getRotation();
+    method public int getScaleType();
+    field public static final int FILL_CENTER = 1; // 0x1
+    field public static final int FILL_END = 2; // 0x2
+    field public static final int FILL_START = 0; // 0x0
+    field public static final int FIT = 3; // 0x3
+  }
+
+  public static final class ViewPort.Builder {
+    ctor public ViewPort.Builder(android.util.Rational, int);
+    method public androidx.camera.core.ViewPort build();
+    method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
+    method public androidx.camera.core.ViewPort.Builder setScaleType(int);
+  }
+
+  @RequiresApi(21) public interface ZoomState {
+    method public float getLinearZoom();
+    method public float getMaxZoomRatio();
+    method public float getMinZoomRatio();
+    method public float getZoomRatio();
+  }
+
+}
+
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index 12b4bc7..dfda24e 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -85,7 +85,7 @@
 
     externalNativeBuild {
         cmake {
-            version "3.22.1"
+            version libs.versions.cmake.get()
             path "src/main/cpp/CMakeLists.txt"
         }
     }
diff --git a/camera/camera-extensions/api/1.1.0-beta02.txt b/camera/camera-extensions/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..0db7e93
--- /dev/null
+++ b/camera/camera-extensions/api/1.1.0-beta02.txt
@@ -0,0 +1,21 @@
+// Signature format: 4.0
+package androidx.camera.extensions {
+
+  @RequiresApi(21) public final class ExtensionMode {
+    field public static final int AUTO = 5; // 0x5
+    field public static final int BOKEH = 1; // 0x1
+    field public static final int FACE_RETOUCH = 4; // 0x4
+    field public static final int HDR = 2; // 0x2
+    field public static final int NIGHT = 3; // 0x3
+    field public static final int NONE = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class ExtensionsManager {
+    method public android.util.Range<java.lang.Long!>? getEstimatedCaptureLatencyRange(androidx.camera.core.CameraSelector, int);
+    method public androidx.camera.core.CameraSelector getExtensionEnabledCameraSelector(androidx.camera.core.CameraSelector, int);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.extensions.ExtensionsManager!> getInstanceAsync(android.content.Context, androidx.camera.core.CameraProvider);
+    method public boolean isExtensionAvailable(androidx.camera.core.CameraSelector, int);
+  }
+
+}
+
diff --git a/camera/camera-extensions/api/public_plus_experimental_1.1.0-beta02.txt b/camera/camera-extensions/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..0db7e93
--- /dev/null
+++ b/camera/camera-extensions/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,21 @@
+// Signature format: 4.0
+package androidx.camera.extensions {
+
+  @RequiresApi(21) public final class ExtensionMode {
+    field public static final int AUTO = 5; // 0x5
+    field public static final int BOKEH = 1; // 0x1
+    field public static final int FACE_RETOUCH = 4; // 0x4
+    field public static final int HDR = 2; // 0x2
+    field public static final int NIGHT = 3; // 0x3
+    field public static final int NONE = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class ExtensionsManager {
+    method public android.util.Range<java.lang.Long!>? getEstimatedCaptureLatencyRange(androidx.camera.core.CameraSelector, int);
+    method public androidx.camera.core.CameraSelector getExtensionEnabledCameraSelector(androidx.camera.core.CameraSelector, int);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.extensions.ExtensionsManager!> getInstanceAsync(android.content.Context, androidx.camera.core.CameraProvider);
+    method public boolean isExtensionAvailable(androidx.camera.core.CameraSelector, int);
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/camera/camera-extensions/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to camera/camera-extensions/api/res-1.1.0-beta02.txt
diff --git a/camera/camera-extensions/api/restricted_1.1.0-beta02.txt b/camera/camera-extensions/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..0db7e93
--- /dev/null
+++ b/camera/camera-extensions/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,21 @@
+// Signature format: 4.0
+package androidx.camera.extensions {
+
+  @RequiresApi(21) public final class ExtensionMode {
+    field public static final int AUTO = 5; // 0x5
+    field public static final int BOKEH = 1; // 0x1
+    field public static final int FACE_RETOUCH = 4; // 0x4
+    field public static final int HDR = 2; // 0x2
+    field public static final int NIGHT = 3; // 0x3
+    field public static final int NONE = 0; // 0x0
+  }
+
+  @RequiresApi(21) public final class ExtensionsManager {
+    method public android.util.Range<java.lang.Long!>? getEstimatedCaptureLatencyRange(androidx.camera.core.CameraSelector, int);
+    method public androidx.camera.core.CameraSelector getExtensionEnabledCameraSelector(androidx.camera.core.CameraSelector, int);
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.extensions.ExtensionsManager!> getInstanceAsync(android.content.Context, androidx.camera.core.CameraProvider);
+    method public boolean isExtensionAvailable(androidx.camera.core.CameraSelector, int);
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/1.1.0-beta02.txt b/camera/camera-lifecycle/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..7077f67
--- /dev/null
+++ b/camera/camera-lifecycle/api/1.1.0-beta02.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.camera.lifecycle {
+
+  @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_1.1.0-beta02.txt b/camera/camera-lifecycle/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..c9ff443
--- /dev/null
+++ b/camera/camera-lifecycle/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.camera.lifecycle {
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCameraProviderConfiguration {
+  }
+
+  @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
+    method @androidx.camera.lifecycle.ExperimentalCameraProviderConfiguration public static void configureInstance(androidx.camera.core.CameraXConfig);
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/camera/camera-lifecycle/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to camera/camera-lifecycle/api/res-1.1.0-beta02.txt
diff --git a/camera/camera-lifecycle/api/restricted_1.1.0-beta02.txt b/camera/camera-lifecycle/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..7077f67
--- /dev/null
+++ b/camera/camera-lifecycle/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.camera.lifecycle {
+
+  @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
+    method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
+    method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.camera.lifecycle.ProcessCameraProvider!> getInstance(android.content.Context);
+    method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
+    method public boolean isBound(androidx.camera.core.UseCase);
+    method @MainThread public void unbind(androidx.camera.core.UseCase!...);
+    method @MainThread public void unbindAll();
+  }
+
+}
+
diff --git a/camera/camera-previewview/build.gradle b/camera/camera-previewview/build.gradle
index eb5bf9f..845d00d 100644
--- a/camera/camera-previewview/build.gradle
+++ b/camera/camera-previewview/build.gradle
@@ -32,11 +32,33 @@
     implementation("androidx.concurrent:concurrent-futures:1.0.0")
     implementation(libs.autoValueAnnotations)
     implementation("androidx.appcompat:appcompat:1.1.0")
+    implementation("androidx.test.espresso:espresso-idling-resource:3.1.0")
+
     // Added for annotation-experimental
     compileOnly(libs.kotlinStdlib)
 
-    annotationProcessor(libs.nullaway)
     annotationProcessor(libs.autoValue)
+
+    testImplementation(libs.testRunner)
+    testImplementation(libs.mockitoCore)
+    testImplementation(libs.robolectric)
+    testImplementation(libs.kotlinStdlib)
+    testImplementation(libs.truth)
+    testImplementation(libs.testRules)
+    testImplementation(libs.testCore)
+
+    androidTestImplementation(libs.multidex)
+    androidTestImplementation(libs.mockitoCore)
+    androidTestImplementation(libs.espressoCore)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.testUiautomator)
+    androidTestImplementation(libs.kotlinStdlib)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
+    androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
 }
 
 android {
diff --git a/camera/camera-previewview/lint-baseline.xml b/camera/camera-previewview/lint-baseline.xml
new file mode 100644
index 0000000..a35ba7c
--- /dev/null
+++ b/camera/camera-previewview/lint-baseline.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.2.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-alpha07)" variant="all" version="7.2.0-alpha07">
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    ListenableFuture&lt;O> apply(@Nullable I input) throws Exception;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/previewview/internal/utils/futures/AsyncFunction.java"
+            line="50"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    void onFailure(Throwable t);"
+        errorLine2="                   ~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/previewview/internal/utils/futures/FutureCallback.java"
+            line="50"
+            column="20"/>
+    </issue>
+
+</issues>
diff --git a/camera/camera-previewview/src/androidTest/AndroidManifest.xml b/camera/camera-previewview/src/androidTest/AndroidManifest.xml
index 4e32fa9..f74bdac 100644
--- a/camera/camera-previewview/src/androidTest/AndroidManifest.xml
+++ b/camera/camera-previewview/src/androidTest/AndroidManifest.xml
@@ -16,6 +16,29 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
-    package="androidx.camera.previewview.test">
+    package="androidx.camera.previewview">
     <uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator" />
+
+    <application>
+        <activity
+            android:name="androidx.camera.previewview.utils.ForegroundTestActivity"
+            android:exported="true"
+            android:configChanges="orientation|screenSize"
+            android:label="ForegroundTestActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name="androidx.camera.previewview.utils.FakeActivity"
+            android:exported="true"
+            android:label="Fake Activity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
 </manifest>
diff --git a/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/SurfaceViewImplementationTest.kt b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/SurfaceViewImplementationTest.kt
new file mode 100644
index 0000000..8b75ac5
--- /dev/null
+++ b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/SurfaceViewImplementationTest.kt
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview
+
+import android.content.Context
+import android.hardware.display.DisplayManager
+import android.util.Size
+import android.view.Display
+import android.view.View
+import android.widget.FrameLayout
+import androidx.camera.previewview.utils.CoreAppTestUtil
+import androidx.camera.previewview.utils.FakeActivity
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import java.util.concurrent.TimeUnit
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
+class SurfaceViewImplementationTest {
+
+    companion object {
+        private const val ANY_WIDTH = 640
+        private const val ANY_HEIGHT = 480
+        private val ANY_SIZE: Size by lazy { Size(ANY_WIDTH, ANY_HEIGHT) }
+    }
+
+    private lateinit var mParent: FrameLayout
+    private lateinit var mImplementation: SurfaceViewImplementation
+    private val mInstrumentation = InstrumentationRegistry.getInstrumentation()
+    private lateinit var mSurfaceRequest: PreviewSurfaceRequest
+    private lateinit var mContext: Context
+    private lateinit var mDisplay: Display
+
+    // Shows the view in activity so that SurfaceView can work normally
+    private lateinit var mActivityScenario: ActivityScenario<FakeActivity>
+
+    @Before
+    fun setUp() {
+        CoreAppTestUtil.prepareDeviceUI(mInstrumentation)
+
+        mActivityScenario = ActivityScenario.launch(FakeActivity::class.java)
+        mContext = ApplicationProvider.getApplicationContext()
+        mParent = FrameLayout(mContext)
+        setContentView(mParent)
+
+        val displayManager = mContext.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
+        mDisplay = displayManager.getDisplay(0)
+
+        mSurfaceRequest = PreviewSurfaceRequest(
+            ANY_SIZE,
+            mDisplay,
+            /*isLegacyDevice=*/true,
+            /*isFrontCamera=*/true,
+            /*sensorOrientation=*/0)
+        mImplementation = SurfaceViewImplementation(mParent, PreviewTransformation())
+    }
+
+    @After
+    fun tearDown() {
+        mSurfaceRequest.previewSurface.close()
+    }
+
+    @Test
+    fun surfaceProvidedSuccessfully() {
+        CoreAppTestUtil.checkKeyguard(mContext)
+
+        mInstrumentation.runOnMainSync {
+            mImplementation.onSurfaceRequested(mSurfaceRequest)
+        }
+
+        mSurfaceRequest.previewSurface.surface.get(1000, TimeUnit.MILLISECONDS)
+        mSurfaceRequest.previewSurface.close()
+    }
+
+    @Throws(Throwable::class)
+    private fun setContentView(view: View) {
+        mActivityScenario.onActivity { activity -> activity.setContentView(view) }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/TextureViewImplementationTest.kt b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/TextureViewImplementationTest.kt
new file mode 100644
index 0000000..9a35c85
--- /dev/null
+++ b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/TextureViewImplementationTest.kt
@@ -0,0 +1,266 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview
+
+import android.content.Context.DISPLAY_SERVICE
+import android.graphics.SurfaceTexture
+import android.hardware.display.DisplayManager
+import android.os.Build
+import android.util.Size
+import android.view.Display
+import android.view.TextureView
+import android.widget.FrameLayout
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
+class TextureViewImplementationTest {
+    private var parent: FrameLayout? = null
+    private var implementation: TextureViewImplementation? = null
+    private var surfaceTexture: SurfaceTexture? = null
+    private var _surfaceRequest: PreviewSurfaceRequest? = null
+    private val surfaceRequest: PreviewSurfaceRequest
+        get() {
+            if (_surfaceRequest == null) {
+                _surfaceRequest = PreviewSurfaceRequest(
+                    ANY_SIZE,
+                    display,
+                    /*isLegacyDevice=*/true,
+                    /*isFrontCamera=*/true,
+                    /*sensorOrientation=*/0)
+            }
+            return _surfaceRequest!!
+        }
+
+    private lateinit var display: Display
+
+    @Before
+    fun setUp() {
+        val mContext = InstrumentationRegistry.getInstrumentation().targetContext
+        surfaceTexture = SurfaceTexture(0)
+        parent = FrameLayout(mContext)
+        val displayManager = mContext.getSystemService(DISPLAY_SERVICE) as DisplayManager
+        display = displayManager.getDisplay(0)
+        implementation = TextureViewImplementation(parent!!, PreviewTransformation())
+    }
+
+    @After
+    fun tearDown() {
+        if (_surfaceRequest != null) {
+            _surfaceRequest!!.willNotProvideSurface()
+            // Ensure all successful requests have their returned future finish.
+            _surfaceRequest!!.previewSurface.close()
+            _surfaceRequest = null
+        }
+    }
+
+    @LargeTest
+    @Test(expected = TimeoutException::class)
+    @Throws(
+        Exception::class
+    )
+    fun doNotProvideSurface_ifSurfaceTextureNotAvailableYet() {
+        val request = surfaceRequest
+        implementation!!.onSurfaceRequested(request)
+        request.previewSurface.surface[2, TimeUnit.SECONDS]
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun provideSurface_ifSurfaceTextureAvailable() {
+        val surfaceRequest = surfaceRequest
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        val surfaceListenableFuture = surfaceRequest.previewSurface.surface
+        implementation!!.mTextureView
+            ?.surfaceTextureListener!!
+            .onSurfaceTextureAvailable(surfaceTexture!!, ANY_WIDTH, ANY_HEIGHT)
+        val surface = surfaceListenableFuture.get()
+        Truth.assertThat(surface).isNotNull()
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun doNotDestroySurface_whenSurfaceTextureBeingDestroyed_andCameraUsingSurface() {
+        val surfaceRequest = surfaceRequest
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        val surfaceListenableFuture = surfaceRequest.previewSurface.surface
+        val surfaceTextureListener = implementation!!.mTextureView?.surfaceTextureListener
+        surfaceTextureListener!!.onSurfaceTextureAvailable(surfaceTexture!!, ANY_WIDTH, ANY_HEIGHT)
+        surfaceListenableFuture.get()
+        Truth.assertThat(implementation!!.mSurfaceReleaseFuture).isNotNull()
+        Truth.assertThat(
+            surfaceTextureListener.onSurfaceTextureDestroyed(
+                surfaceTexture!!
+            )
+        ).isFalse()
+    }
+
+    @Test
+    @LargeTest
+    @Throws(Exception::class)
+    fun destroySurface_whenSurfaceTextureBeingDestroyed_andCameraNotUsingSurface() {
+        val surfaceRequest = surfaceRequest
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        val deferrableSurface = surfaceRequest.previewSurface
+        val surfaceListenableFuture = deferrableSurface.surface
+        val surfaceTextureListener = implementation!!.mTextureView?.surfaceTextureListener
+        surfaceTextureListener!!.onSurfaceTextureAvailable(surfaceTexture!!, ANY_WIDTH, ANY_HEIGHT)
+        surfaceListenableFuture.get()
+        deferrableSurface.close()
+
+        // Wait enough time for surfaceReleaseFuture's listener to be called
+        Thread.sleep(1000)
+        Truth.assertThat(implementation!!.mSurfaceReleaseFuture).isNull()
+        Truth.assertThat(
+            surfaceTextureListener.onSurfaceTextureDestroyed(
+                surfaceTexture!!
+            )
+        ).isTrue()
+    }
+
+    @Test
+    @LargeTest
+    @Throws(Exception::class)
+    fun releaseSurfaceTexture_afterSurfaceTextureDestroyed_andCameraNoLongerUsingSurface() {
+        val surfaceRequest = surfaceRequest
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        val deferrableSurface = surfaceRequest.previewSurface
+        val surfaceListenableFuture = deferrableSurface.surface
+        val surfaceTextureListener = implementation!!.mTextureView?.surfaceTextureListener
+        surfaceTextureListener!!.onSurfaceTextureAvailable(surfaceTexture!!, ANY_WIDTH, ANY_HEIGHT)
+        surfaceListenableFuture.get()
+        surfaceTextureListener.onSurfaceTextureDestroyed(surfaceTexture!!)
+        deferrableSurface.close()
+
+        // Wait enough time for surfaceReleaseFuture's listener to be called
+        Thread.sleep(1000)
+        Truth.assertThat(implementation!!.mSurfaceReleaseFuture).isNull()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            Truth.assertThat(surfaceTexture!!.isReleased).isTrue()
+        }
+    }
+
+    @Test
+    @LargeTest
+    @Throws(Exception::class)
+    fun nullSurfaceCompleterAndSurfaceReleaseFuture_whenSurfaceProviderCancelled() {
+        val surfaceRequest = surfaceRequest
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        // Cancel the request from the camera side
+        surfaceRequest.previewSurface.surface.cancel(true)
+
+        // Wait enough time for mCompleter's cancellation listener to be called
+        Thread.sleep(1000)
+        Truth.assertThat(implementation!!.mSurfaceRequest).isNull()
+        Truth.assertThat(implementation!!.mSurfaceReleaseFuture).isNull()
+    }
+
+    @Test
+    @LargeTest
+    @Throws(Exception::class)
+    fun releaseSurface_whenSurfaceTextureDestroyed_andCameraSurfaceRequestIsCancelled() {
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        // Cancel the request from the client side
+        surfaceRequest.willNotProvideSurface()
+        val surfaceTextureListener = implementation!!.mTextureView?.surfaceTextureListener
+        surfaceTextureListener!!.onSurfaceTextureAvailable(surfaceTexture!!, ANY_WIDTH, ANY_HEIGHT)
+        // Wait enough time for surfaceReleaseFuture's listener to be called.
+        Thread.sleep(1000)
+        Truth.assertThat(
+            surfaceTextureListener.onSurfaceTextureDestroyed(
+                surfaceTexture!!
+            )
+        ).isTrue()
+        Truth.assertThat(implementation!!.mSurfaceTexture).isNull()
+    }
+
+    @Test
+    fun doNotCreateTextureView_beforeSensorOutputSizeKnown() {
+        Truth.assertThat(parent!!.childCount).isEqualTo(0)
+    }
+
+    @Test
+    @Throws(Exception::class)
+    fun resetSurfaceTextureOnDetachAndAttachWindow() {
+        val surfaceRequest = surfaceRequest
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        val deferrableSurface = surfaceRequest.previewSurface
+        val surfaceListenableFuture = deferrableSurface.surface
+        val surfaceTextureListener = implementation!!.mTextureView?.surfaceTextureListener
+        surfaceTextureListener!!.onSurfaceTextureAvailable(surfaceTexture!!, ANY_WIDTH, ANY_HEIGHT)
+        surfaceListenableFuture.get()
+        surfaceTextureListener.onSurfaceTextureDestroyed(surfaceTexture!!)
+        Truth.assertThat(implementation!!.mDetachedSurfaceTexture).isNotNull()
+        implementation!!.onDetachedFromWindow()
+        implementation!!.onAttachedToWindow()
+        Truth.assertThat(implementation!!.mDetachedSurfaceTexture).isNull()
+        Truth.assertThat(implementation!!.mTextureView?.surfaceTexture).isEqualTo(surfaceTexture)
+    }
+
+    @Test
+    @LargeTest
+    @Throws(Exception::class)
+    fun releaseDetachedSurfaceTexture_whenDeferrableSurfaceClose() {
+        val surfaceRequest = surfaceRequest
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        val deferrableSurface = surfaceRequest.previewSurface
+        val surfaceListenableFuture = deferrableSurface.surface
+        val surfaceTextureListener = implementation!!.mTextureView?.surfaceTextureListener
+        surfaceTextureListener!!.onSurfaceTextureAvailable(surfaceTexture!!, ANY_WIDTH, ANY_HEIGHT)
+        surfaceListenableFuture.get()
+        surfaceTextureListener.onSurfaceTextureDestroyed(surfaceTexture!!)
+        Truth.assertThat(implementation!!.mDetachedSurfaceTexture).isNotNull()
+        deferrableSurface.close()
+
+        // Wait enough time for surfaceReleaseFuture's listener to be called
+        Thread.sleep(1000)
+        Truth.assertThat(implementation!!.mSurfaceReleaseFuture).isNull()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            Truth.assertThat(surfaceTexture!!.isReleased).isTrue()
+        }
+        Truth.assertThat(implementation!!.mDetachedSurfaceTexture).isNull()
+    }
+
+    @Test
+    fun keepOnlyLatestTextureView_whenGetSurfaceProviderCalledMultipleTimes() {
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        Truth.assertThat(parent!!.getChildAt(0)).isInstanceOf(TextureView::class.java)
+        val textureView1 = parent!!.getChildAt(0) as TextureView
+        implementation!!.onSurfaceRequested(surfaceRequest)
+        Truth.assertThat(parent!!.getChildAt(0)).isInstanceOf(TextureView::class.java)
+        val textureView2 = parent!!.getChildAt(0) as TextureView
+        Truth.assertThat(textureView1).isNotSameInstanceAs(textureView2)
+        Truth.assertThat(parent!!.childCount).isEqualTo(1)
+    }
+
+    companion object {
+        private const val ANY_WIDTH = 1600
+        private const val ANY_HEIGHT = 1200
+        private val ANY_SIZE: Size by lazy { Size(ANY_WIDTH, ANY_HEIGHT) }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/CoreAppTestUtil.java b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/CoreAppTestUtil.java
new file mode 100644
index 0000000..fe4c243
--- /dev/null
+++ b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/CoreAppTestUtil.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.utils;
+
+import static org.junit.Assume.assumeTrue;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.test.espresso.Espresso;
+import androidx.test.espresso.IdlingRegistry;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.uiautomator.UiDevice;
+
+import org.junit.AssumptionViolatedException;
+
+import java.io.IOException;
+
+/** Utility functions of tests on CoreTestApp. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class CoreAppTestUtil {
+
+    /** ADB shell input key code for dismissing keyguard for device with API level <= 22. */
+    private static final int DISMISS_LOCK_SCREEN_CODE = 82;
+    /** ADB shell command for dismissing keyguard for device with API level >= 23. */
+    private static final String ADB_SHELL_DISMISS_KEYGUARD_API23_AND_ABOVE = "wm dismiss-keyguard";
+    /** ADB shell command to set the screen always on when usb is connected. */
+    private static final String ADB_SHELL_SCREEN_ALWAYS_ON = "svc power stayon true";
+
+    private static final int MAX_TIMEOUT_MS = 3000;
+
+    private CoreAppTestUtil() {
+    }
+
+    /**
+     * Check if this is compatible device for test.
+     *
+     * <p> Most devices should be compatible except devices with compatible issues.
+     *
+     */
+    public static void assumeCompatibleDevice() {
+        // TODO(b/134894604) This will be removed once the issue is fixed.
+        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP
+                && Build.MODEL.contains("Nexus 5")) {
+            throw new AssumptionViolatedException("Known issue, b/134894604.");
+        }
+    }
+
+    /**
+     * Throws the Exception for the devices which is not compatible to the testing.
+     */
+    public static void assumeCanTestCameraDisconnect() {
+        // TODO(b/141656413) Remove this when the issue is fixed.
+        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M
+                && (Build.MODEL.contains("Nexus 5") || Build.MODEL.contains("Pixel C"))) {
+            throw new AssumptionViolatedException("Known issue, b/141656413.");
+        }
+    }
+
+    /**
+     * Clean up the device UI and back to the home screen for test.
+     * @param instrumentation the instrumentation used to run the test
+     */
+    @SuppressLint("MissingPermission") // Permission needed for action_close_system_dialogs in S
+    @SuppressWarnings("deprecation")
+    public static void clearDeviceUI(@NonNull Instrumentation instrumentation) {
+        UiDevice device = UiDevice.getInstance(instrumentation);
+        // On some devices, its necessary to wake up the device before attempting unlock, otherwise
+        // unlock attempt will not unlock.
+        try {
+            device.wakeUp();
+        } catch (RemoteException remoteException) {
+        }
+
+        // In case the lock screen on top, the action to dismiss it.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+            device.pressKeyCode(DISMISS_LOCK_SCREEN_CODE);
+        } else {
+            try {
+                device.executeShellCommand(ADB_SHELL_DISMISS_KEYGUARD_API23_AND_ABOVE);
+            } catch (IOException e) {
+            }
+        }
+
+        try {
+            device.executeShellCommand(ADB_SHELL_SCREEN_ALWAYS_ON);
+        } catch (IOException e) {
+        }
+
+        device.pressHome();
+        device.waitForIdle(MAX_TIMEOUT_MS);
+
+        // Close system dialogs first to avoid interrupt.
+        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
+            instrumentation.getTargetContext().sendBroadcast(
+                    new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+        }
+    }
+
+    /**
+     * Checks whether keyguard is locked.
+     *
+     * Keyguard is locked if the screen is off or the device is currently locked and requires a
+     * PIN, pattern or password to unlock.
+     *
+     * @throws IllegalStateException if keyguard is locked.
+     */
+    public static void checkKeyguard(@NonNull Context context) {
+        KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(
+                Context.KEYGUARD_SERVICE);
+
+        if (keyguardManager != null && keyguardManager.isKeyguardLocked()) {
+            throw new IllegalStateException("<KEYGUARD_STATE_ERROR> Keyguard is locked!");
+        }
+    }
+
+    /**
+     * Try to clear the UI and then check if there is any dialog or lock screen on the top of the
+     * window that might cause the activity related test fail.
+     *
+     * @param instrumentation The instrumentation instance.
+     * @throws ForegroundOccupiedError throw the exception when the test app cannot get
+     *                                 foreground of the device window in CameraX lab.
+     */
+    public static void prepareDeviceUI(@NonNull Instrumentation instrumentation)
+            throws ForegroundOccupiedError {
+        clearDeviceUI(instrumentation);
+
+        ForegroundTestActivity activityRef = null;
+        try {
+            Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+            Intent startIntent = new Intent(Intent.ACTION_MAIN);
+            startIntent.setClassName(context.getPackageName(),
+                    ForegroundTestActivity.class.getName());
+            startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+            activityRef = ForegroundTestActivity.class.cast(
+                    instrumentation.startActivitySync(startIntent));
+            instrumentation.waitForIdleSync();
+
+            if (activityRef == null) {
+                Logger.d("CoreAppTestUtil", String.format("Activity %s, failed to launch",
+                        startIntent.getComponent()) + ", ignore the foreground checking");
+                return;
+            }
+            IdlingRegistry.getInstance().register(activityRef.getViewReadyIdlingResource());
+
+            // The {@link Espresso#onIdle()} throws timeout exception if the
+            // ForegroundTestActivity cannot get focus. The default timeout in espresso is 26 sec.
+            Espresso.onIdle();
+            return;
+        } catch (Exception e) {
+            Logger.d("CoreAppTestUtil", "Fail to get foreground", e);
+        } finally {
+            if (activityRef != null) {
+                IdlingRegistry.getInstance().unregister(activityRef.getViewReadyIdlingResource());
+                final Activity act = activityRef;
+                instrumentation.runOnMainSync(() -> act.finish());
+                instrumentation.waitForIdleSync();
+            }
+        }
+
+        // Throw AssumptionViolatedException to skip the test if not in the CameraX lab
+        // environment. The loggable tag will be set when running the CameraX daily testing.
+        assumeTrue(Log.isLoggable("MH", Log.DEBUG));
+
+        throw new ForegroundOccupiedError("CameraX_fail_to_start_foreground, model:" + Build.MODEL);
+    }
+
+    /** The display foreground of the device is occupied that cannot execute UI related test. */
+    public static class ForegroundOccupiedError extends Exception {
+        public ForegroundOccupiedError(@NonNull String message) {
+            super(message);
+        }
+    }
+
+    /**
+     * Launch activity and return the activity instance for testing.
+     *
+     * @param instrumentation The instrumentation used to run the test
+     * @param activityClass   The activity under test. This must be a class in the instrumentation
+     *                        targetPackage specified in the AndroidManifest.xml
+     * @param startIntent     The Intent that will be used to start the Activity under test. If
+     *                        {@code startIntent} is null, a default launch Intent for the
+     *                        {@code activityClass} is used.
+     * @param <T>             The Activity class under test
+     * @return Returns the reference to the activity for test.
+     */
+    @Nullable
+    public static <T extends Activity> T launchActivity(@NonNull Instrumentation instrumentation,
+            @NonNull Class<T> activityClass, @Nullable Intent startIntent) {
+        Context context = instrumentation.getTargetContext();
+
+        // inject custom intent, if provided
+        if (null == startIntent) {
+            startIntent = new Intent(Intent.ACTION_MAIN);
+        }
+
+        // Set target component if not set Intent
+        if (null == startIntent.getComponent()) {
+            startIntent.setClassName(context.getPackageName(), activityClass.getName());
+        }
+
+        // Set launch flags where if not set Intent
+        if (0 /* No flags set */ == startIntent.getFlags()) {
+            startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+
+        T activityRef = activityClass.cast(instrumentation.startActivitySync(startIntent));
+        instrumentation.waitForIdleSync();
+
+        return activityRef;
+    }
+}
diff --git a/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/FakeActivity.java b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/FakeActivity.java
new file mode 100644
index 0000000..576743f
--- /dev/null
+++ b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/FakeActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.utils;
+
+import android.app.Activity;
+
+import androidx.annotation.RequiresApi;
+
+/** A fake {@link Activity} that can be used in tests. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class FakeActivity extends Activity {
+}
diff --git a/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/ForegroundTestActivity.java b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/ForegroundTestActivity.java
new file mode 100644
index 0000000..61a72c0
--- /dev/null
+++ b/camera/camera-previewview/src/androidTest/java/androidx/camera/previewview/utils/ForegroundTestActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.utils;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.test.espresso.idling.CountingIdlingResource;
+
+/** An empty activity that checks the activity's <em>main</em> window currently has window focus. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class ForegroundTestActivity extends Activity {
+
+    final CountingIdlingResource mViewReady = new CountingIdlingResource("ViewReady");
+
+    @NonNull
+    public CountingIdlingResource getViewReadyIdlingResource() {
+        return mViewReady;
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mViewReady.increment();
+    }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        if (hasFocus && !mViewReady.isIdleNow()) {
+            mViewReady.decrement();
+        }
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/CameraPreviewView.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/CameraPreviewView.java
deleted file mode 100644
index 707be7e..0000000
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/CameraPreviewView.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * 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 androidx.camera.previewview;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.view.Surface;
-import android.view.SurfaceView;
-import android.view.TextureView;
-import android.widget.FrameLayout;
-
-import androidx.annotation.ColorRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.UiThread;
-import androidx.camera.previewview.surface.PreviewSurfaceRequest;
-import androidx.core.content.ContextCompat;
-import androidx.core.view.ViewCompat;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Custom View that displays the camera feed for Camera2 and CameraX.
- *
- * <p> This class manages the preview {@link Surface}'s lifecycle. It internally uses either a
- * {@link TextureView} or {@link SurfaceView} to display the camera feed, and applies required
- * transformations on them to correctly display the preview, this involves correcting their
- * aspect ratio, scale and rotation.
- */
-@RequiresApi(21)
-public final class CameraPreviewView extends FrameLayout {
-
-    private static final String TAG = "PreviewView";
-
-    @ColorRes
-    static final int DEFAULT_BACKGROUND_COLOR = android.R.color.black;
-    private static final ImplementationMode DEFAULT_IMPL_MODE = ImplementationMode.PERFORMANCE;
-
-    @NonNull
-    ImplementationMode mImplementationMode = DEFAULT_IMPL_MODE;
-
-    @Nullable
-    PreviewViewImplementation mImplementation;
-
-    @NonNull
-    final PreviewTransformation mPreviewTransform = new PreviewTransformation();
-
-    @UiThread
-    public CameraPreviewView(@NonNull Context context) {
-        this(context, null);
-    }
-
-    @UiThread
-    public CameraPreviewView(@NonNull Context context, @Nullable AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    @UiThread
-    public CameraPreviewView(@NonNull Context context,
-            @Nullable AttributeSet attrs,
-            int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    @UiThread
-    public CameraPreviewView(@NonNull Context context,
-            @Nullable AttributeSet attrs,
-            int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs,
-                R.styleable.PreviewView, defStyleAttr, defStyleRes);
-        ViewCompat.saveAttributeDataForStyleable(this, context, R.styleable.PreviewView, attrs,
-                attributes, defStyleAttr, defStyleRes);
-
-        try {
-            final int scaleTypeId = attributes.getInteger(
-                    R.styleable.PreviewView_scaleType,
-                    mPreviewTransform.getScaleType().getId());
-            setScaleType(ScaleType.fromId(scaleTypeId));
-
-            int implementationModeId =
-                    attributes.getInteger(R.styleable.PreviewView_implementationMode,
-                            DEFAULT_IMPL_MODE.getId());
-            setImplementationMode(ImplementationMode.fromId(implementationModeId));
-        } finally {
-            attributes.recycle();
-        }
-
-        // Set background only if it wasn't already set. A default background prevents the content
-        // behind the PreviewView from being visible before the preview starts streaming.
-        if (getBackground() == null) {
-            setBackgroundColor(ContextCompat.getColor(getContext(), DEFAULT_BACKGROUND_COLOR));
-        }
-    }
-
-    /**
-     * Sets the {@link ImplementationMode} for the {@link CameraPreviewView}.
-     *
-     * <p> {@link CameraPreviewView} displays the preview with a {@link TextureView} when the
-     * mode is {@link ImplementationMode#COMPATIBLE}, and tries to use a {@link SurfaceView} if
-     * it is {@link ImplementationMode#PERFORMANCE} when possible, which depends on the device's
-     * attributes (e.g. API level). If not set, the default mode is
-     * {@link ImplementationMode#PERFORMANCE}.
-     */
-    @UiThread
-    public void setImplementationMode(@NonNull final ImplementationMode implementationMode) {
-        mImplementationMode = implementationMode;
-    }
-
-    /**
-     * Returns the {@link ImplementationMode}.
-     *
-     * <p> If nothing is set via {@link #setImplementationMode}, the default
-     * value is {@link ImplementationMode#PERFORMANCE}.
-     *
-     * @return The {@link ImplementationMode} for {@link CameraPreviewView}.
-     */
-    @UiThread
-    @NonNull
-    public ImplementationMode getImplementationMode() {
-        return mImplementationMode;
-    }
-
-    /**
-     * Applies a {@link ScaleType} to the preview.
-     *
-     * <p> This value can also be set in the layout XML file via the {@code app:scaleType}
-     * attribute.
-     *
-     * <p> The default value is {@link ScaleType#FILL_CENTER}.
-     *
-     * @param scaleType A {@link ScaleType} to apply to the preview.
-     * @attr name app:scaleType
-     */
-    @UiThread
-    public void setScaleType(@NonNull final ScaleType scaleType) {
-        mPreviewTransform.setScaleType(scaleType);
-        redrawPreview();
-    }
-
-    /**
-     * Returns the {@link ScaleType} currently applied to the preview.
-     *
-     * <p> The default value is {@link ScaleType#FILL_CENTER}.
-     *
-     * @return The {@link ScaleType} currently applied to the preview.
-     */
-    @UiThread
-    @NonNull
-    public ScaleType getScaleType() {
-        return mPreviewTransform.getScaleType();
-    }
-
-    /**
-     * Request surface asynchronously.
-     *
-     * @param surfaceRequest surface request.
-     * @return surface.
-     */
-    @UiThread
-    @NonNull
-    public ListenableFuture<Surface> requestSurfaceAsync(
-            @NonNull PreviewSurfaceRequest surfaceRequest) {
-        // TODO: API implementation
-        return surfaceRequest.getPreviewSurface().getSurface();
-    }
-
-    private void redrawPreview() {
-        if (mImplementation != null) {
-            mImplementation.redrawPreview();
-        }
-    }
-
-    /**
-     * The implementation mode of a {@link CameraPreviewView}.
-     *
-     * <p> User preference on how the {@link CameraPreviewView} should render the preview.
-     * {@link CameraPreviewView} displays the preview with either a {@link SurfaceView} or a
-     * {@link TextureView}. A {@link SurfaceView} is generally better than a {@link TextureView}
-     * when it comes to certain key metrics, including power and latency. On the other hand,
-     * {@link TextureView} is better supported by a wider range of devices. The option is used by
-     * {@link CameraPreviewView} to decide what is the best internal implementation given the device
-     * capabilities and user configurations.
-     */
-    @RequiresApi(21)
-    public enum ImplementationMode {
-
-        /**
-         * Use a {@link SurfaceView} for the preview when possible. If the device
-         * doesn't support {@link SurfaceView}, {@link CameraPreviewView} will fall back to use a
-         * {@link TextureView} instead.
-         *
-         * <p>{@link CameraPreviewView} falls back to {@link TextureView} when the API level is 24.
-         */
-        PERFORMANCE(0),
-
-        /**
-         * Use a {@link TextureView} for the preview.
-         */
-        COMPATIBLE(1);
-
-        private final int mId;
-
-        ImplementationMode(int id) {
-            mId = id;
-        }
-
-        int getId() {
-            return mId;
-        }
-
-        static ImplementationMode fromId(int id) {
-            for (ImplementationMode implementationMode : values()) {
-                if (implementationMode.mId == id) {
-                    return implementationMode;
-                }
-            }
-            throw new IllegalArgumentException("Unknown implementation mode id " + id);
-        }
-    }
-
-    /** Options for scaling the preview vis-à-vis its container {@link CameraPreviewView}. */
-    @RequiresApi(21)
-    public enum ScaleType {
-        /**
-         * Scale the preview, maintaining the source aspect ratio, so it fills the entire
-         * {@link CameraPreviewView}, and align it to the start of the view, which is the top left
-         * corner in a left-to-right (LTR) layout, or the top right corner in a right-to-left
-         * (RTL) layout.
-         * <p>
-         * This may cause the preview to be cropped if the camera preview aspect ratio does not
-         * match that of its container {@link CameraPreviewView}.
-         */
-        FILL_START(0),
-        /**
-         * Scale the preview, maintaining the source aspect ratio, so it fills the entire
-         * {@link CameraPreviewView}, and center it in the view.
-         * <p>
-         * This may cause the preview to be cropped if the camera preview aspect ratio does not
-         * match that of its container {@link CameraPreviewView}.
-         */
-        FILL_CENTER(1),
-        /**
-         * Scale the preview, maintaining the source aspect ratio, so it fills the entire
-         * {@link CameraPreviewView}, and align it to the end of the view, which is the bottom right
-         * corner in a left-to-right (LTR) layout, or the bottom left corner in a right-to-left
-         * (RTL) layout.
-         * <p>
-         * This may cause the preview to be cropped if the camera preview aspect ratio does not
-         * match that of its container {@link CameraPreviewView}.
-         */
-        FILL_END(2),
-        /**
-         * Scale the preview, maintaining the source aspect ratio, so it is entirely contained
-         * within the {@link CameraPreviewView}, and align it to the start of the view, which is the
-         * top left corner in a left-to-right (LTR) layout, or the top right corner in a
-         * right-to-left (RTL) layout. The background area not covered by the preview stream
-         * will be black or the background of the {@link CameraPreviewView}
-         * <p>
-         * Both dimensions of the preview will be equal or less than the corresponding dimensions
-         * of its container {@link CameraPreviewView}.
-         */
-        FIT_START(3),
-        /**
-         * Scale the preview, maintaining the source aspect ratio, so it is entirely contained
-         * within the {@link CameraPreviewView}, and center it inside the view. The background
-         * area not covered by the preview stream will be black or the background of the
-         * {@link CameraPreviewView}.
-         * <p>
-         * Both dimensions of the preview will be equal or less than the corresponding dimensions
-         * of its container {@link CameraPreviewView}.
-         */
-        FIT_CENTER(4),
-        /**
-         * Scale the preview, maintaining the source aspect ratio, so it is entirely contained
-         * within the {@link CameraPreviewView}, and align it to the end of the view, which is the
-         * bottom right corner in a left-to-right (LTR) layout, or the bottom left corner in a
-         * right-to-left (RTL) layout. The background area not covered by the preview stream
-         * will be black or the background of the {@link CameraPreviewView}.
-         * <p>
-         * Both dimensions of the preview will be equal or less than the corresponding dimensions
-         * of its container {@link CameraPreviewView}.
-         */
-        FIT_END(5);
-
-        private final int mId;
-
-        ScaleType(int id) {
-            mId = id;
-        }
-
-        int getId() {
-            return mId;
-        }
-
-        static ScaleType fromId(int id) {
-            for (ScaleType scaleType : values()) {
-                if (scaleType.mId == id) {
-                    return scaleType;
-                }
-            }
-            throw new IllegalArgumentException("Unknown scale type id " + id);
-        }
-    }
-}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/CameraViewFinder.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/CameraViewFinder.java
new file mode 100644
index 0000000..b780418
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/CameraViewFinder.java
@@ -0,0 +1,469 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.os.Looper;
+import android.util.AttributeSet;
+import android.view.Surface;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import android.widget.FrameLayout;
+
+import androidx.annotation.AnyThread;
+import androidx.annotation.ColorRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.UiThread;
+import androidx.camera.previewview.internal.quirk.DeviceQuirks;
+import androidx.camera.previewview.internal.quirk.SurfaceViewNotCroppedByParentQuirk;
+import androidx.camera.previewview.internal.quirk.SurfaceViewStretchedQuirk;
+import androidx.camera.previewview.internal.surface.PreviewSurfaceProvider;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.camera.previewview.internal.utils.Threads;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * Base view finder that displays the camera feed for Camera2 and CameraX.
+ *
+ * <p> This class manages the preview {@link Surface}'s lifecycle. It internally uses either a
+ * {@link TextureView} or {@link SurfaceView} to display the camera feed, and applies required
+ * transformations on them to correctly display the preview, this involves correcting their
+ * aspect ratio, scale and rotation.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class CameraViewFinder extends FrameLayout {
+
+    private static final String TAG = "CameraViewFinder";
+
+    @ColorRes private static final int DEFAULT_BACKGROUND_COLOR = android.R.color.black;
+    private static final ImplementationMode DEFAULT_IMPL_MODE = ImplementationMode.PERFORMANCE;
+
+    // Synthetic access
+    @SuppressWarnings("WeakerAccess")
+    @NonNull
+    final PreviewTransformation mPreviewTransform = new PreviewTransformation();
+
+    @NonNull
+    private final Looper mRequiredLooper = Looper.myLooper();
+
+    @NonNull ImplementationMode mImplementationMode = DEFAULT_IMPL_MODE;
+
+    @Nullable PreviewViewImplementation mImplementation;
+    @Nullable PreviewSurfaceRequest mCurrentSurfaceRequest;
+
+    private final OnLayoutChangeListener mOnLayoutChangeListener =
+            (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
+                boolean isSizeChanged =
+                        right - left != oldRight - oldLeft || bottom - top != oldBottom - oldTop;
+                if (isSizeChanged) {
+                    redrawPreview();
+                }
+            };
+
+    // Synthetic access
+    @SuppressWarnings("WeakerAccess")
+    final PreviewSurfaceProvider mSurfaceProvider = new PreviewSurfaceProvider() {
+
+        @Override
+        @AnyThread
+        public void onSurfaceRequested(@NonNull PreviewSurfaceRequest surfaceRequest) {
+            if (!Threads.isMainThread()) {
+                // In short term, throwing exception to guarantee onSurfaceRequest is
+                //  called on main thread. In long term, user should be able to specify an
+                //  executor to run this function.
+                throw new IllegalStateException("onSurfaceRequested must be called on the main  "
+                        + "thread");
+            }
+            Logger.d(TAG, "Surface requested by Preview.");
+
+            mImplementation = shouldUseTextureView(
+                    surfaceRequest.isLegacyDevice(), mImplementationMode)
+                    ? new TextureViewImplementation(CameraViewFinder.this, mPreviewTransform)
+                    : new SurfaceViewImplementation(CameraViewFinder.this, mPreviewTransform);
+
+            mImplementation.onSurfaceRequested(surfaceRequest);
+
+            mPreviewTransform.setTransformationInfo(
+                    surfaceRequest.getTransformationInfo(),
+                    surfaceRequest.getResolution(),
+                    surfaceRequest.isFrontCamera());
+            redrawPreview();
+        }
+    };
+
+    @UiThread
+    public CameraViewFinder(@NonNull Context context) {
+        this(context, null);
+    }
+
+    @UiThread
+    public CameraViewFinder(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    @UiThread
+    public CameraViewFinder(@NonNull Context context,
+            @Nullable AttributeSet attrs,
+            int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    @UiThread
+    public CameraViewFinder(@NonNull Context context,
+            @Nullable AttributeSet attrs,
+            int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs,
+                R.styleable.PreviewView, defStyleAttr, defStyleRes);
+        ViewCompat.saveAttributeDataForStyleable(this, context, R.styleable.PreviewView, attrs,
+                attributes, defStyleAttr, defStyleRes);
+
+        try {
+            final int scaleTypeId = attributes.getInteger(
+                    R.styleable.PreviewView_scaleType,
+                    mPreviewTransform.getScaleType().getId());
+            setScaleType(ScaleType.fromId(scaleTypeId));
+
+            int implementationModeId =
+                    attributes.getInteger(R.styleable.PreviewView_implementationMode,
+                            DEFAULT_IMPL_MODE.getId());
+            setImplementationMode(ImplementationMode.fromId(implementationModeId));
+        } finally {
+            attributes.recycle();
+        }
+
+        // Set background only if it wasn't already set. A default background prevents the content
+        // behind the PreviewView from being visible before the preview starts streaming.
+        if (getBackground() == null) {
+            setBackgroundColor(ContextCompat.getColor(getContext(), DEFAULT_BACKGROUND_COLOR));
+        }
+    }
+
+    /**
+     * Sets the {@link ImplementationMode} for the {@link CameraViewFinder}.
+     *
+     * <p> {@link CameraViewFinder} displays the preview with a {@link TextureView} when the
+     * mode is {@link ImplementationMode#COMPATIBLE}, and tries to use a {@link SurfaceView} if
+     * it is {@link ImplementationMode#PERFORMANCE} when possible, which depends on the device's
+     * attributes (e.g. API level). If not set, the default mode is
+     * {@link ImplementationMode#PERFORMANCE}.
+     */
+    @UiThread
+    public void setImplementationMode(@NonNull final ImplementationMode implementationMode) {
+        checkUiThread();
+        mImplementationMode = implementationMode;
+    }
+
+    /**
+     * Returns the {@link ImplementationMode}.
+     *
+     * <p> If nothing is set via {@link #setImplementationMode}, the default
+     * value is {@link ImplementationMode#PERFORMANCE}.
+     *
+     * @return The {@link ImplementationMode} for {@link CameraViewFinder}.
+     */
+    @UiThread
+    @NonNull
+    public ImplementationMode getImplementationMode() {
+        checkUiThread();
+        return mImplementationMode;
+    }
+
+    /**
+     * Applies a {@link ScaleType} to the preview.
+     *
+     * <p> This value can also be set in the layout XML file via the {@code app:scaleType}
+     * attribute.
+     *
+     * <p> The default value is {@link ScaleType#FILL_CENTER}.
+     *
+     * @param scaleType A {@link ScaleType} to apply to the preview.
+     * @attr name app:scaleType
+     */
+    @UiThread
+    public void setScaleType(@NonNull final ScaleType scaleType) {
+        checkUiThread();
+        mPreviewTransform.setScaleType(scaleType);
+        redrawPreview();
+    }
+
+    /**
+     * Returns the {@link ScaleType} currently applied to the preview.
+     *
+     * <p> The default value is {@link ScaleType#FILL_CENTER}.
+     *
+     * @return The {@link ScaleType} currently applied to the preview.
+     */
+    @UiThread
+    @NonNull
+    public ScaleType getScaleType() {
+        checkUiThread();
+        return mPreviewTransform.getScaleType();
+    }
+
+    /**
+     * Request surface asynchronously.
+     *
+     * @param surfaceRequest surface request.
+     * @return surface.
+     */
+    @UiThread
+    @NonNull
+    public ListenableFuture<Surface> requestSurfaceAsync(
+            @NonNull PreviewSurfaceRequest surfaceRequest) {
+        checkUiThread();
+
+        if (mCurrentSurfaceRequest != null
+                && surfaceRequest.equals(mCurrentSurfaceRequest)) {
+            return mCurrentSurfaceRequest.getPreviewSurface().getSurface();
+        }
+
+        if (mCurrentSurfaceRequest != null) {
+            mCurrentSurfaceRequest.markSurfaceSafeToRelease();
+        }
+
+        ListenableFuture<Surface> surfaceListenableFuture =
+                surfaceRequest.getPreviewSurface().getSurface();
+        mCurrentSurfaceRequest = surfaceRequest;
+
+        provideSurfaceIfReady();
+
+        return surfaceListenableFuture;
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        addOnLayoutChangeListener(mOnLayoutChangeListener);
+        if (mImplementation != null) {
+            mImplementation.onAttachedToWindow();
+        }
+        // TODO: need to handle incomplete surface request if request is received before view
+        //  attached to window.
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        removeOnLayoutChangeListener(mOnLayoutChangeListener);
+        if (mImplementation != null) {
+            mImplementation.onDetachedFromWindow();
+        }
+        if (mCurrentSurfaceRequest != null) {
+            mCurrentSurfaceRequest.markSurfaceSafeToRelease();
+            mCurrentSurfaceRequest = null;
+        }
+    }
+
+    // Synthetic access
+    @SuppressWarnings("WeakerAccess")
+    static boolean shouldUseTextureView(
+            boolean isLegacyDevice,
+            @NonNull final ImplementationMode implementationMode) {
+        boolean hasSurfaceViewQuirk = DeviceQuirks.get(SurfaceViewStretchedQuirk.class) != null
+                ||  DeviceQuirks.get(SurfaceViewNotCroppedByParentQuirk.class) != null;
+        if (Build.VERSION.SDK_INT <= 24 || isLegacyDevice || hasSurfaceViewQuirk) {
+            // Force to use TextureView when the device is running android 7.0 and below, legacy
+            // level or SurfaceView has quirks.
+            return true;
+        }
+        switch (implementationMode) {
+            case COMPATIBLE:
+                return true;
+            case PERFORMANCE:
+                return false;
+            default:
+                throw new IllegalArgumentException(
+                        "Invalid implementation mode: " + implementationMode);
+        }
+    }
+
+    // Synthetic access
+    @SuppressWarnings("WeakerAccess")
+    void redrawPreview() {
+        if (mImplementation != null) {
+            mImplementation.redrawPreview();
+        }
+    }
+
+    private boolean provideSurfaceIfReady() {
+        final PreviewSurfaceRequest surfaceRequest = mCurrentSurfaceRequest;
+        final PreviewSurfaceProvider surfaceProvider = mSurfaceProvider;
+        if (surfaceProvider != null && surfaceRequest != null) {
+            surfaceProvider.onSurfaceRequested(surfaceRequest);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Checks if the current thread is the same UI thread on which the class was constructed.
+     *
+     * @see <a href = go/android-api-guidelines/concurrency#uithread></a>
+     */
+    private void checkUiThread() {
+        // Ignore mRequiredLooper == null because this can be called from the super
+        // class constructor before the class's own constructor has run.
+        if (mRequiredLooper != null && Looper.myLooper() != mRequiredLooper) {
+            Throwable throwable = new Throwable(
+                    "A method was called on thread '" + Thread.currentThread().getName()
+                            + "'. All methods must be called on the same thread. (Expected Looper "
+                            + mRequiredLooper + ", but called on " + Looper.myLooper() + ".");
+            throw new RuntimeException(throwable);
+        }
+    }
+
+    /**
+     * The implementation mode of a {@link CameraViewFinder}.
+     *
+     * <p> User preference on how the {@link CameraViewFinder} should render the preview.
+     * {@link CameraViewFinder} displays the preview with either a {@link SurfaceView} or a
+     * {@link TextureView}. A {@link SurfaceView} is generally better than a {@link TextureView}
+     * when it comes to certain key metrics, including power and latency. On the other hand,
+     * {@link TextureView} is better supported by a wider range of devices. The option is used by
+     * {@link CameraViewFinder} to decide what is the best internal implementation given the device
+     * capabilities and user configurations.
+     */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+    public enum ImplementationMode {
+
+        /**
+         * Use a {@link SurfaceView} for the preview when possible. If the device
+         * doesn't support {@link SurfaceView}, {@link CameraViewFinder} will fall back to use a
+         * {@link TextureView} instead.
+         *
+         * <p>{@link CameraViewFinder} falls back to {@link TextureView} when the API level is 24.
+         */
+        PERFORMANCE(0),
+
+        /**
+         * Use a {@link TextureView} for the preview.
+         */
+        COMPATIBLE(1);
+
+        private final int mId;
+
+        ImplementationMode(int id) {
+            mId = id;
+        }
+
+        int getId() {
+            return mId;
+        }
+
+        static ImplementationMode fromId(int id) {
+            for (ImplementationMode implementationMode : values()) {
+                if (implementationMode.mId == id) {
+                    return implementationMode;
+                }
+            }
+            throw new IllegalArgumentException("Unknown implementation mode id " + id);
+        }
+    }
+
+    /** Options for scaling the preview vis-à-vis its container {@link CameraViewFinder}. */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+    public enum ScaleType {
+        /**
+         * Scale the preview, maintaining the source aspect ratio, so it fills the entire
+         * {@link CameraViewFinder}, and align it to the start of the view, which is the top left
+         * corner in a left-to-right (LTR) layout, or the top right corner in a right-to-left
+         * (RTL) layout.
+         * <p>
+         * This may cause the preview to be cropped if the camera preview aspect ratio does not
+         * match that of its container {@link CameraViewFinder}.
+         */
+        FILL_START(0),
+        /**
+         * Scale the preview, maintaining the source aspect ratio, so it fills the entire
+         * {@link CameraViewFinder}, and center it in the view.
+         * <p>
+         * This may cause the preview to be cropped if the camera preview aspect ratio does not
+         * match that of its container {@link CameraViewFinder}.
+         */
+        FILL_CENTER(1),
+        /**
+         * Scale the preview, maintaining the source aspect ratio, so it fills the entire
+         * {@link CameraViewFinder}, and align it to the end of the view, which is the bottom right
+         * corner in a left-to-right (LTR) layout, or the bottom left corner in a right-to-left
+         * (RTL) layout.
+         * <p>
+         * This may cause the preview to be cropped if the camera preview aspect ratio does not
+         * match that of its container {@link CameraViewFinder}.
+         */
+        FILL_END(2),
+        /**
+         * Scale the preview, maintaining the source aspect ratio, so it is entirely contained
+         * within the {@link CameraViewFinder}, and align it to the start of the view, which is the
+         * top left corner in a left-to-right (LTR) layout, or the top right corner in a
+         * right-to-left (RTL) layout. The background area not covered by the preview stream
+         * will be black or the background of the {@link CameraViewFinder}
+         * <p>
+         * Both dimensions of the preview will be equal or less than the corresponding dimensions
+         * of its container {@link CameraViewFinder}.
+         */
+        FIT_START(3),
+        /**
+         * Scale the preview, maintaining the source aspect ratio, so it is entirely contained
+         * within the {@link CameraViewFinder}, and center it inside the view. The background
+         * area not covered by the preview stream will be black or the background of the
+         * {@link CameraViewFinder}.
+         * <p>
+         * Both dimensions of the preview will be equal or less than the corresponding dimensions
+         * of its container {@link CameraViewFinder}.
+         */
+        FIT_CENTER(4),
+        /**
+         * Scale the preview, maintaining the source aspect ratio, so it is entirely contained
+         * within the {@link CameraViewFinder}, and align it to the end of the view, which is the
+         * bottom right corner in a left-to-right (LTR) layout, or the bottom left corner in a
+         * right-to-left (RTL) layout. The background area not covered by the preview stream
+         * will be black or the background of the {@link CameraViewFinder}.
+         * <p>
+         * Both dimensions of the preview will be equal or less than the corresponding dimensions
+         * of its container {@link CameraViewFinder}.
+         */
+        FIT_END(5);
+
+        private final int mId;
+
+        ScaleType(int id) {
+            mId = id;
+        }
+
+        int getId() {
+            return mId;
+        }
+
+        static ScaleType fromId(int id) {
+            for (ScaleType scaleType : values()) {
+                if (scaleType.mId == id) {
+                    return scaleType;
+                }
+            }
+            throw new IllegalArgumentException("Unknown scale type id " + id);
+        }
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewSurfaceRequest.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewSurfaceRequest.java
new file mode 100644
index 0000000..dedff4f
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewSurfaceRequest.java
@@ -0,0 +1,602 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview;
+
+import android.annotation.SuppressLint;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.util.Size;
+import android.view.Display;
+import android.view.Surface;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+import androidx.camera.previewview.internal.surface.PreviewSurface;
+import androidx.camera.previewview.internal.transform.TransformationInfo;
+import androidx.camera.previewview.internal.utils.CameraOrientationUtil;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.camera.previewview.internal.utils.executor.CameraExecutors;
+import androidx.camera.previewview.internal.utils.futures.FutureCallback;
+import androidx.camera.previewview.internal.utils.futures.Futures;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.util.Consumer;
+import androidx.core.util.Preconditions;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * A completable, single-use request of a {@link Surface}.
+ *
+ * <p>Contains requirements for surface characteristics along with methods for completing the
+ * request and listening for request cancellation.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class PreviewSurfaceRequest {
+
+    private static final String TAG = "PreviewSurfaceRequest";
+
+    private final boolean mIsLegacyDevice;
+    private final boolean mIsFrontCamera;
+    @NonNull private final Size mResolution;
+    @NonNull private final PreviewSurface mInternalPreviewSurface;
+    @NonNull private final CallbackToFutureAdapter.Completer<Void> mRequestCancellationCompleter;
+    @NonNull private final ListenableFuture<Void> mSessionStatusFuture;
+    @NonNull private final CallbackToFutureAdapter.Completer<Surface> mSurfaceCompleter;
+
+    @SuppressWarnings("WeakerAccess") /*synthetic accessor */
+    @NonNull
+    final ListenableFuture<Surface> mSurfaceFuture;
+
+    @NonNull private TransformationInfo mTransformationInfo;
+
+    @SuppressWarnings("WeakerAccess") /*synthetic accessor */
+    @Nullable
+    Callback mCallback;
+
+    @Nullable private Executor mTransformationInfoExecutor;
+    @Nullable private TransformationInfoListener mTransformationInfoListener;
+
+    /**
+     * Creates a new surface request with surface resolution, view display and camera device
+     * information.
+     *
+     * @param resolution requested surface resolution.
+     * @param display view display.
+     * @param isLegacyDevice hardware level is legacy or not.
+     * @param isFrontCamera camera is front facing or not.
+     * @param sensorOrientation camera sensor orientation.
+     */
+    public PreviewSurfaceRequest(
+            @NonNull Size resolution,
+            @NonNull Display display,
+            boolean isLegacyDevice,
+            boolean isFrontCamera,
+            int sensorOrientation) {
+        super();
+        mResolution = resolution;
+        mIsLegacyDevice = isLegacyDevice;
+        mIsFrontCamera = isFrontCamera;
+        mTransformationInfo = createTransformInfo(resolution, display, isFrontCamera,
+                sensorOrientation);
+
+        // To ensure concurrency and ordering, operations are chained. Completion can only be
+        // triggered externally by the top-level completer (mSurfaceCompleter). The other future
+        // completers are only completed by callbacks set up within the constructor of this class
+        // to ensure correct ordering of events.
+
+        // Cancellation listener must be called last to ensure the result can be retrieved from
+        // the session listener.
+        String surfaceRequestString =
+                "SurfaceRequest[size: " + resolution + ", id: " + this.hashCode() + "]";
+        AtomicReference<CallbackToFutureAdapter.Completer<Void>> cancellationCompleterRef =
+                new AtomicReference<>(null);
+        ListenableFuture<Void> requestCancellationFuture =
+                CallbackToFutureAdapter.getFuture(completer -> {
+                    cancellationCompleterRef.set(completer);
+                    return surfaceRequestString + "-cancellation";
+                });
+        CallbackToFutureAdapter.Completer<Void> requestCancellationCompleter =
+                Preconditions.checkNotNull(cancellationCompleterRef.get());
+        mRequestCancellationCompleter = requestCancellationCompleter;
+
+        // Surface session status future completes and is responsible for finishing the
+        // cancellation listener.
+        AtomicReference<CallbackToFutureAdapter.Completer<Void>> sessionStatusCompleterRef =
+                new AtomicReference<>(null);
+        mSessionStatusFuture = CallbackToFutureAdapter.getFuture(completer -> {
+            sessionStatusCompleterRef.set(completer);
+            return surfaceRequestString + "-status";
+        });
+
+        Futures.addCallback(mSessionStatusFuture, new FutureCallback<Void>() {
+            @Override
+            public void onSuccess(@Nullable Void result) {
+                // Cancellation didn't occur, so complete the cancellation future. There
+                // shouldn't ever be any standard listeners on this future, so nothing should be
+                // invoked.
+                Preconditions.checkState(requestCancellationCompleter.set(null));
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                if (t instanceof RequestCancelledException) {
+                    // Cancellation occurred. Notify listeners.
+                    Preconditions.checkState(requestCancellationFuture.cancel(false));
+                } else {
+                    // Cancellation didn't occur, complete the future so cancellation listeners
+                    // are not invoked.
+                    Preconditions.checkState(requestCancellationCompleter.set(null));
+                }
+            }
+        }, CameraExecutors.directExecutor());
+
+        // Create the surface future/completer. This will be used to complete the rest of the
+        // future chain and can be set externally via SurfaceRequest methods.
+        CallbackToFutureAdapter.Completer<Void> sessionStatusCompleter =
+                Preconditions.checkNotNull(sessionStatusCompleterRef.get());
+        AtomicReference<CallbackToFutureAdapter.Completer<Surface>> surfaceCompleterRef =
+                new AtomicReference<>(null);
+        mSurfaceFuture = CallbackToFutureAdapter.getFuture(completer -> {
+            surfaceCompleterRef.set(completer);
+            return surfaceRequestString + "-Surface";
+        });
+        mSurfaceCompleter = Preconditions.checkNotNull(surfaceCompleterRef.get());
+
+        // Create the preview surface which will be used for communicating when the
+        // camera and consumer are done using the surface. Note this anonymous inner class holds
+        // an implicit reference to the PreviewSurfaceRequest. This is by design, and ensures the
+        // PreviewSurfaceRequest and all contained future completers will not be garbage collected
+        // as long as the PreviewSurface is referenced externally (via getPreviewSurface()).
+        mInternalPreviewSurface = new PreviewSurface() {
+            @SuppressLint("SyntheticAccessor")
+            @NonNull
+            @Override
+            protected ListenableFuture<Surface> provideSurfaceAsync() {
+                Logger.d(TAG,
+                        "mInternalPreviewSurface + " + mInternalPreviewSurface + " "
+                                + "provideSurface");
+                return mSurfaceFuture;
+            }
+        };
+        ListenableFuture<Void> terminationFuture = mInternalPreviewSurface.getTerminationFuture();
+
+        // Propagate surface completion to the session future.
+        Futures.addCallback(mSurfaceFuture, new FutureCallback<Surface>() {
+            @Override
+            public void onSuccess(@Nullable Surface surface) {
+                // On successful setting of a surface, defer completion of the session future to
+                // the PreviewSurface termination future. Once that future completes, then it
+                // is safe to release the Surface and associated resources.
+
+                Futures.propagate(terminationFuture, sessionStatusCompleter);
+                if (mCallback != null) {
+                    mCallback.onSuccess(surface);
+                }
+            }
+
+            @Override
+            public void onFailure(@NonNull Throwable t) {
+                // Translate cancellation into a SurfaceRequestCancelledException. Other
+                // exceptions mean either the request was completed via willNotProvideSurface() or a
+                // programming error occurred. In either case, the user will never see the
+                // session future (an immediate future will be returned instead), so complete the
+                // future so cancellation listeners are never called.
+                if (t instanceof CancellationException) {
+                    Preconditions.checkState(sessionStatusCompleter.setException(
+                            new RequestCancelledException(
+                                    surfaceRequestString + " cancelled.", t)));
+                } else {
+                    sessionStatusCompleter.set(null);
+                }
+                if (mCallback != null) {
+                    mCallback.onFailure(t);
+                }
+            }
+        }, CameraExecutors.directExecutor());
+
+        // If the preview surface is terminated, there are two cases:
+        // 1. The surface has not yet been provided to the camera (or marked as 'will not
+        //    complete'). Treat this as if the surface request has been cancelled.
+        // 2. The surface was already provided to the camera. In this case the camera is now
+        //    finished with the surface, so cancelling the surface future below will be a no-op.
+        terminationFuture.addListener(() -> {
+            Logger.d(TAG,
+                    "mInternalPreviewSurface + " + mInternalPreviewSurface + " "
+                            + "terminateFuture triggered");
+            mSurfaceFuture.cancel(true);
+        }, CameraExecutors.directExecutor());
+    }
+
+    /**
+     * Returns the resolution of the requested {@link Surface}.
+     *
+     * The surface which fulfills this request must have the resolution specified here in
+     * order to fulfill the resource requirements of the camera.
+     *
+     * @return The guaranteed supported resolution.
+     * @see SurfaceTexture#setDefaultBufferSize(int, int)
+     */
+    @NonNull
+    public Size getResolution() {
+        return mResolution;
+    }
+
+    /**
+     * Returns the status of camera lens facing.
+     *
+     * @return true if front camera, otherwise false.
+     */
+    public boolean isFrontCamera() {
+        return mIsFrontCamera;
+    }
+
+    /**
+     * Returns the status of camera hardware level.
+     *
+     * @return true if legacy device, otherwise false.
+     */
+    public boolean isLegacyDevice() {
+        return mIsLegacyDevice;
+    }
+
+    /**
+     * Set surface request callback.
+     *
+     * @param callback {@link Callback}.
+     */
+    @SuppressLint("ExecutorRegistration")
+    public void setCallback(@NonNull Callback callback) {
+        mCallback = callback;
+    }
+
+    /**
+     * Clear surface request callback.
+     */
+    public void clearCallback() {
+        mCallback = null;
+    }
+
+    /**
+     * Closes the preview surface to mark it as safe to release.
+     */
+    public void markSurfaceSafeToRelease() {
+        mInternalPreviewSurface.close();
+    }
+
+    @NonNull
+    TransformationInfo getTransformationInfo() {
+        return mTransformationInfo;
+    }
+
+    @NonNull
+    PreviewSurface getPreviewSurface() {
+        return mInternalPreviewSurface;
+    }
+
+    @SuppressLint("PairedRegistration")
+    void addRequestCancellationListener(@NonNull Executor executor,
+            @NonNull Runnable listener) {
+        mRequestCancellationCompleter.addCancellationListener(listener, executor);
+    }
+
+    /**
+     * Completes the request for a {@link Surface} if it has not already been
+     * completed or cancelled.
+     *
+     * <p>Once the camera no longer needs the provided surface, the {@code resultListener} will be
+     * invoked with a {@link Result} containing {@link Result#RESULT_SURFACE_USED_SUCCESSFULLY}.
+     * At this point it is safe to release the surface and any underlying resources. Releasing
+     * the surface before receiving this signal may cause undesired behavior on lower API levels.
+     *
+     * <p>If the request is cancelled by the camera before successfully attaching the
+     * provided surface to the camera, then the {@code resultListener} will be invoked with a
+     * {@link Result} containing {@link Result#RESULT_REQUEST_CANCELLED}.
+     *
+     * <p>If the request was previously completed via {@link #willNotProvideSurface()}, then
+     * {@code resultListener} will be invoked with a {@link Result} containing
+     * {@link Result#RESULT_WILL_NOT_PROVIDE_SURFACE}.
+     *
+     * <p>Upon returning from this method, the surface request is guaranteed to be complete.
+     * However, only the {@code resultListener} provided to the first invocation of this method
+     * should be used to track when the provided {@link Surface} is no longer in use by the
+     * camera, as subsequent invocations will always invoke the {@code resultListener} with a
+     * {@link Result} containing {@link Result#RESULT_SURFACE_ALREADY_PROVIDED}.
+     *
+     * @param surface        The surface which will complete the request.
+     * @param executor       Executor used to execute the {@code resultListener}.
+     * @param resultListener Listener used to track how the surface is used by the camera in
+     *                       response to being provided by this method.
+     *
+     */
+    void provideSurface(
+            @NonNull Surface surface,
+            @NonNull Executor executor,
+            @NonNull Consumer<Result> resultListener) {
+        if (mSurfaceCompleter.set(surface) || mSurfaceFuture.isCancelled()) {
+            // Session will be pending completion (or surface request was cancelled). Return the
+            // session future.
+            Futures.addCallback(mSessionStatusFuture, new FutureCallback<Void>() {
+                @Override
+                public void onSuccess(@Nullable Void result) {
+                    resultListener.accept(Result.of(Result.RESULT_SURFACE_USED_SUCCESSFULLY,
+                            surface));
+                }
+
+                @Override
+                public void onFailure(Throwable t) {
+                    Preconditions.checkState(t instanceof RequestCancelledException, "Camera "
+                            + "surface session should only fail with request "
+                            + "cancellation. Instead failed due to:\n" + t);
+                    resultListener.accept(Result.of(Result.RESULT_REQUEST_CANCELLED, surface));
+                }
+            }, executor);
+        } else {
+            // Surface request is already complete
+            Preconditions.checkState(mSurfaceFuture.isDone());
+            try {
+                mSurfaceFuture.get();
+                // Getting this far means the surface was already provided.
+                executor.execute(
+                        () -> resultListener.accept(
+                                Result.of(Result.RESULT_SURFACE_ALREADY_PROVIDED, surface)));
+            } catch (InterruptedException | ExecutionException e) {
+                executor.execute(
+                        () -> resultListener.accept(
+                                Result.of(Result.RESULT_WILL_NOT_PROVIDE_SURFACE, surface)));
+            }
+        }
+    }
+
+    /**
+     * Signals that the request will never be fulfilled.
+     *
+     * <p>This may be called in the case where the application may be shutting down and a
+     * surface will never be produced to fulfill the request.
+     *
+     * <p>This will be called by CameraPreviewView as soon as it is known that the request will not
+     * be fulfilled. Failure to complete the SurfaceRequest via {@code willNotProvideSurface()}
+     * or {@link #provideSurface(Surface, Executor, Consumer)} may cause long delays in shutting
+     * down the camera.
+     *
+     * <p>Upon returning from this method, the request is guaranteed to be complete, regardless
+     * of the return value. If the request was previously successfully completed by
+     * {@link #provideSurface(Surface, Executor, Consumer)}, invoking this method will return
+     * {@code false}, and will have no effect on how the surface is used by the camera.
+     *
+     * @return {@code true} if this call to {@code willNotProvideSurface()} successfully
+     * completes the request, i.e., the request has not already been completed via
+     * {@link #provideSurface(Surface, Executor, Consumer)} or by a previous call to
+     * {@code willNotProvideSurface()} and has not already been cancelled by the camera.
+     *
+     */
+    boolean willNotProvideSurface() {
+        return mSurfaceCompleter.setException(
+                new PreviewSurface.SurfaceUnavailableException("Surface request "
+                        + "will not complete."));
+    }
+
+    void setTransformationInfoListener(@NonNull Executor executor,
+            @NonNull TransformationInfoListener listener) {
+        mTransformationInfoListener = listener;
+        mTransformationInfoExecutor = executor;
+        TransformationInfo transformationInfo = mTransformationInfo;
+        if (transformationInfo != null) {
+            executor.execute(() -> listener.onTransformationInfoUpdate(
+                    transformationInfo));
+        }
+    }
+
+    void updateTransformationInfo(@NonNull TransformationInfo transformationInfo) {
+        mTransformationInfo = transformationInfo;
+        TransformationInfoListener listener = mTransformationInfoListener;
+        if (listener != null && mTransformationInfoExecutor != null) {
+            mTransformationInfoExecutor.execute(
+                    () -> listener.onTransformationInfoUpdate(
+                            transformationInfo));
+        }
+    }
+
+    @NonNull
+    private static TransformationInfo createTransformInfo(
+            @NonNull Size surfaceResolution,
+            @NonNull Display display,
+            boolean isFrontCamera,
+            int sensorOrientation) {
+        // For Camera2, cropRect is equal to full size of surface and targetRotation is default
+        // display rotation.
+        // For CameraX, targetRotation can be set by the user.
+        Rect cropRect = new Rect(0, 0,
+                surfaceResolution.getWidth(), surfaceResolution.getHeight());
+        // TODO: verify the preview working correctly when not in a locked portrait orientation,
+        //  for both the PERFORMANCE and the COMPATIBLE mode
+        int relativeRotationDegrees =
+                CameraOrientationUtil.surfaceRotationToDegrees(display.getRotation());
+        return TransformationInfo.of(cropRect,
+                CameraOrientationUtil.getRelativeImageRotation(
+                        relativeRotationDegrees,
+                        sensorOrientation,
+                        !isFrontCamera),
+                display.getRotation());
+    }
+
+    static final class RequestCancelledException extends RuntimeException {
+        RequestCancelledException(@NonNull String message, @NonNull Throwable cause) {
+            super(message, cause);
+        }
+    }
+
+    interface TransformationInfoListener {
+
+        /**
+         * Callback for transformation info update.
+         * @param transformationInfo transformation info.
+         */
+        void onTransformationInfoUpdate(@NonNull TransformationInfo transformationInfo);
+    }
+
+    /**
+     * Result of providing a surface to a {@link PreviewSurfaceRequest} via
+     * {@link #provideSurface(Surface, Executor, Consumer)}.
+     *
+     */
+    @AutoValue
+    abstract static class Result {
+
+        /**
+         * Possible result codes.
+         *
+         * @hide
+         */
+        @IntDef({RESULT_SURFACE_USED_SUCCESSFULLY, RESULT_REQUEST_CANCELLED, RESULT_INVALID_SURFACE,
+                RESULT_SURFACE_ALREADY_PROVIDED, RESULT_WILL_NOT_PROVIDE_SURFACE})
+        @Retention(RetentionPolicy.SOURCE)
+        @RestrictTo(Scope.LIBRARY)
+        public @interface ResultCode {
+        }
+
+        /**
+         * Provided surface was successfully used by the camera and eventually detached once no
+         * longer needed by the camera.
+         *
+         * <p>This result denotes that it is safe to release the {@link Surface} and any underlying
+         * resources.
+         *
+         * <p>For compatibility reasons, the {@link Surface} object should not be reused by
+         * future {@link PreviewSurfaceRequest SurfaceRequests}, and a new surface should be
+         * created instead.
+         */
+        public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0;
+
+        /**
+         * Provided surface was never attached to the camera due to the
+         * {@link PreviewSurfaceRequest} being cancelled by the camera.
+         *
+         * <p>It is safe to release or reuse {@link Surface}, assuming it was not previously
+         * attached to a camera via {@link #provideSurface(Surface, Executor, Consumer)}. If
+         * reusing the surface for a future surface request, it should be verified that the
+         * surface still matches the resolution specified by
+         * {@link PreviewSurfaceRequest#getResolution()}.
+         */
+        public static final int RESULT_REQUEST_CANCELLED = 1;
+
+        /**
+         * Provided surface could not be used by the camera.
+         *
+         * <p>This is likely due to the {@link Surface} being closed prematurely or the resolution
+         * of the surface not matching the resolution specified by
+         * {@link PreviewSurfaceRequest#getResolution()}.
+         */
+        public static final int RESULT_INVALID_SURFACE = 2;
+
+        /**
+         * Surface was not attached to the camera through this invocation of
+         * {@link #provideSurface(Surface, Executor, Consumer)} due to the {@link PreviewSurfaceRequest}
+         * already being complete with a surface.
+         *
+         * <p>The {@link PreviewSurfaceRequest} has already been completed by a previous invocation
+         * of {@link #provideSurface(Surface, Executor, Consumer)}.
+         *
+         * <p>It is safe to release or reuse the {@link Surface}, assuming it was not previously
+         * attached to a camera via {@link #provideSurface(Surface, Executor, Consumer)}.
+         */
+        public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3;
+
+        /**
+         * Surface was not attached to the camera through this invocation of
+         * {@link #provideSurface(Surface, Executor, Consumer)} due to the
+         * {@link PreviewSurfaceRequest} already being marked as "will not provide surface".
+         *
+         * <p>The {@link PreviewSurfaceRequest} has already been marked as 'will not provide
+         * surface' by a previous invocation of {@link #willNotProvideSurface()}.
+         *
+         * <p>It is safe to release or reuse the {@link Surface}, assuming it was not previously
+         * attached to a camera via {@link #provideSurface(Surface, Executor, Consumer)}.
+         */
+        public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4;
+
+        /**
+         * Creates a result from the given result code and surface.
+         *
+         * <p>Can be used to compare to results returned to {@code resultListener} in
+         * {@link #provideSurface(Surface, Executor, Consumer)}.
+         *
+         * @param code    One of {@link #RESULT_SURFACE_USED_SUCCESSFULLY},
+         *                {@link #RESULT_REQUEST_CANCELLED}, {@link #RESULT_INVALID_SURFACE},
+         *                {@link #RESULT_SURFACE_ALREADY_PROVIDED}, or
+         *                {@link #RESULT_WILL_NOT_PROVIDE_SURFACE}.
+         * @param surface The {@link Surface} used to complete the {@link PreviewSurfaceRequest}.
+         */
+        @NonNull
+        static Result of(@ResultCode int code, @NonNull Surface surface) {
+            return new AutoValue_PreviewSurfaceRequest_Result(code, surface);
+        }
+
+        /**
+         * Returns the result of invoking {@link #provideSurface(Surface, Executor, Consumer)}
+         * with the surface from {@link #getSurface()}.
+         *
+         * @return One of {@link #RESULT_SURFACE_USED_SUCCESSFULLY},
+         * {@link #RESULT_REQUEST_CANCELLED}, {@link #RESULT_INVALID_SURFACE}, or
+         * {@link #RESULT_SURFACE_ALREADY_PROVIDED}, {@link #RESULT_WILL_NOT_PROVIDE_SURFACE}.
+         */
+        @ResultCode
+        public abstract int getResultCode();
+
+        /**
+         * The surface used to complete a {@link PreviewSurfaceRequest} with
+         * {@link #provideSurface(Surface, Executor, Consumer)}.
+         *
+         * @return the surface.
+         */
+        @NonNull
+        public abstract Surface getSurface();
+
+        // Ensure Result can't be subclassed outside the package
+        Result() {
+        }
+    }
+
+    /**
+     * Callback for surface request.
+     */
+    public interface Callback {
+
+        /**
+         * Callback for success.
+         * @param surface surface.
+         */
+        void onSuccess(@Nullable Surface surface);
+
+        /**
+         * Callback for failure.
+         * @param t throwable.
+         */
+        void onFailure(@NonNull Throwable t);
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewTransformation.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewTransformation.java
index 8e280c0..3b73009 100644
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewTransformation.java
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewTransformation.java
@@ -16,9 +16,20 @@
 
 package androidx.camera.previewview;
 
-import android.annotation.SuppressLint;
+import static androidx.camera.previewview.CameraViewFinder.ScaleType.FIT_CENTER;
+import static androidx.camera.previewview.CameraViewFinder.ScaleType.FIT_END;
+import static androidx.camera.previewview.CameraViewFinder.ScaleType.FIT_START;
+import static androidx.camera.previewview.internal.utils.TransformUtils.getRectToRect;
+import static androidx.camera.previewview.internal.utils.TransformUtils.is90or270;
+import static androidx.camera.previewview.internal.utils.TransformUtils.isAspectRatioMatchingWithRoundingError;
+import static androidx.camera.previewview.internal.utils.TransformUtils.surfaceRotationToRotationDegrees;
+
+import android.graphics.Matrix;
 import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.LayoutDirection;
 import android.util.Size;
+import android.view.Display;
 import android.view.SurfaceView;
 import android.view.TextureView;
 import android.view.View;
@@ -26,13 +37,16 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
-import androidx.camera.previewview.surface.PreviewSurfaceRequest;
-import androidx.camera.previewview.transform.TransformationInfo;
+import androidx.annotation.VisibleForTesting;
+import androidx.camera.previewview.CameraViewFinder.ScaleType;
+import androidx.camera.previewview.internal.transform.TransformationInfo;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.core.util.Preconditions;
 
 /**
- * Handles {@link CameraPreviewView} transformation.
+ * Handles {@link CameraViewFinder} transformation.
  *
- * <p> This class transforms the camera output and display it in a {@link CameraPreviewView}.
+ * <p> This class transforms the camera output and display it in a {@link CameraViewFinder}.
  * The goal is to transform it in a way so that the entire area of
  * {@link TransformationInfo#getCropRect()} is 1) visible to end users, and 2)
  * displayed as large as possible.
@@ -67,33 +81,26 @@
  * <p> The transformed Surface is how the PreviewView's inner view should behave, to make the
  * crop rect matches the PreviewView.
  */
-@RequiresApi(21)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class PreviewTransformation {
 
     private static final String TAG = "PreviewTransform";
 
-    private static final CameraPreviewView.ScaleType DEFAULT_SCALE_TYPE =
-            CameraPreviewView.ScaleType.FILL_CENTER;
+    private static final ScaleType DEFAULT_SCALE_TYPE =
+            ScaleType.FILL_CENTER;
 
-    // SurfaceRequest.getResolution().
-    @SuppressWarnings("unused")
     @Nullable
     private Size mResolution;
     // This represents the area of the Surface that should be visible to end users. The area is
     // defined by the Viewport class.
     @Nullable
     private Rect mSurfaceCropRect;
-    // TransformationInfo.getRotationDegrees().
-    @SuppressWarnings("unused")
+
     private int mPreviewRotationDegrees;
-    // TransformationInfo.getTargetRotation.
-    @SuppressWarnings("unused")
     private int mTargetRotation;
-    // Whether the preview is using front camera.
-    @SuppressWarnings("unused")
     private boolean mIsFrontCamera;
 
-    private CameraPreviewView.ScaleType mScaleType = DEFAULT_SCALE_TYPE;
+    private ScaleType mScaleType = DEFAULT_SCALE_TYPE;
 
     PreviewTransformation() {
     }
@@ -101,10 +108,9 @@
     /**
      * Sets the inputs.
      *
-     * <p> All the values originally come from a {@link PreviewSurfaceRequest}.
+     * <p> All the values originally come from a
+     * {@link PreviewSurfaceRequest}.
      */
-    // TODO(b/185869869) Remove the UnsafeOptInUsageError once view's version matches core's.
-    @SuppressLint("UnsafeOptInUsageError")
     void setTransformationInfo(@NonNull TransformationInfo transformationInfo,
             Size resolution, boolean isFrontCamera) {
         mSurfaceCropRect = transformationInfo.getCropRect();
@@ -115,33 +121,192 @@
     }
 
     /**
-     * Calculates the transformation and applies it to the inner view of {@link CameraPreviewView}.
+     * Calculates the transformation and applies it to the inner view of {@link CameraViewFinder}.
      *
      * <p> The inner view could be {@link SurfaceView} or a {@link TextureView}.
      * {@link TextureView} needs a preliminary correction since it doesn't handle the
      * display rotation.
      */
-    void transformView(Size previewViewSize, int layoutDirection, @NonNull View preview) {}
+    void transformView(Size previewViewSize, int layoutDirection, @NonNull View preview) {
+        if (previewViewSize.getHeight() == 0 || previewViewSize.getWidth() == 0) {
+            Logger.w(TAG, "Transform not applied due to PreviewView size: " + previewViewSize);
+            return;
+        }
+        if (!isTransformationInfoReady()) {
+            return;
+        }
+
+        if (preview instanceof TextureView) {
+            // For TextureView, correct the orientation to match the target rotation.
+            ((TextureView) preview).setTransform(getTextureViewCorrectionMatrix());
+        } else {
+            // Logs an error if non-display rotation is used with SurfaceView.
+            Display display = preview.getDisplay();
+            if (display != null && display.getRotation() != mTargetRotation) {
+                Logger.e(TAG, "Non-display rotation not supported with SurfaceView / PERFORMANCE "
+                        + "mode.");
+            }
+        }
+
+        RectF surfaceRectInPreviewView = getTransformedSurfaceRect(previewViewSize,
+                layoutDirection);
+        preview.setPivotX(0);
+        preview.setPivotY(0);
+        preview.setScaleX(surfaceRectInPreviewView.width() / mResolution.getWidth());
+        preview.setScaleY(surfaceRectInPreviewView.height() / mResolution.getHeight());
+        preview.setTranslationX(surfaceRectInPreviewView.left - preview.getLeft());
+        preview.setTranslationY(surfaceRectInPreviewView.top - preview.getTop());
+    }
 
     /**
-     * Sets the {@link CameraPreviewView.ScaleType}.
+     * Sets the {@link ScaleType}.
      */
-    void setScaleType(CameraPreviewView.ScaleType scaleType) {
+    void setScaleType(ScaleType scaleType) {
         mScaleType = scaleType;
     }
 
     /**
-     * Gets the {@link CameraPreviewView.ScaleType}.
+     * Gets the {@link ScaleType}.
      */
-    CameraPreviewView.ScaleType getScaleType() {
+    ScaleType getScaleType() {
         return mScaleType;
     }
 
-    /**
-     * Return the crop rect of the preview surface.
-     */
-    @Nullable
-    Rect getSurfaceCropRect() {
-        return mSurfaceCropRect;
+    @VisibleForTesting
+    Matrix getTextureViewCorrectionMatrix() {
+        Preconditions.checkState(isTransformationInfoReady());
+        RectF surfaceRect = new RectF(0, 0, mResolution.getWidth(), mResolution.getHeight());
+        int rotationDegrees = -surfaceRotationToRotationDegrees(mTargetRotation);
+        return getRectToRect(surfaceRect, surfaceRect, rotationDegrees);
+    }
+
+    private boolean isTransformationInfoReady() {
+        return mSurfaceCropRect != null && mResolution != null;
+    }
+
+    private RectF getTransformedSurfaceRect(Size previewViewSize, int layoutDirection) {
+        Preconditions.checkState(isTransformationInfoReady());
+        Matrix surfaceToPreviewView =
+                getSurfaceToPreviewViewMatrix(previewViewSize, layoutDirection);
+        RectF rect = new RectF(0, 0, mResolution.getWidth(), mResolution.getHeight());
+        surfaceToPreviewView.mapRect(rect);
+        return rect;
+    }
+
+    private Matrix getSurfaceToPreviewViewMatrix(Size previewViewSize, int layoutDirection) {
+        Preconditions.checkState(isTransformationInfoReady());
+
+        // Get the target of the mapping, the coordinates of the crop rect in PreviewView.
+        RectF previewViewCropRect;
+        if (isViewportAspectRatioMatchPreviewView(previewViewSize)) {
+            // If crop rect has the same aspect ratio as PreviewView, scale the crop rect to fill
+            // the entire PreviewView. This happens if the scale type is FILL_* AND a
+            // PreviewView-based viewport is used.
+            previewViewCropRect = new RectF(0, 0, previewViewSize.getWidth(),
+                    previewViewSize.getHeight());
+        } else {
+            // If the aspect ratios don't match, it could be 1) scale type is FIT_*, 2) the
+            // Viewport is not based on the PreviewView or 3) both.
+            previewViewCropRect = getPreviewViewViewportRectForMismatchedAspectRatios(
+                    previewViewSize, layoutDirection);
+        }
+        Matrix matrix = getRectToRect(new RectF(mSurfaceCropRect), previewViewCropRect,
+                mPreviewRotationDegrees);
+        if (mIsFrontCamera) {
+            // SurfaceView/TextureView automatically mirrors the Surface for front camera, which
+            // needs to be compensated by mirroring the Surface around the upright direction of the
+            // output image.
+            if (is90or270(mPreviewRotationDegrees)) {
+                // If the rotation is 90/270, the Surface should be flipped vertically.
+                //   +---+     90 +---+  270 +---+
+                //   | ^ | -->    | < |      | > |
+                //   +---+        +---+      +---+
+                matrix.preScale(1F, -1F, mSurfaceCropRect.centerX(), mSurfaceCropRect.centerY());
+            } else {
+                // If the rotation is 0/180, the Surface should be flipped horizontally.
+                //   +---+      0 +---+  180 +---+
+                //   | ^ | -->    | ^ |      | v |
+                //   +---+        +---+      +---+
+                matrix.preScale(-1F, 1F, mSurfaceCropRect.centerX(), mSurfaceCropRect.centerY());
+            }
+        }
+        return matrix;
+    }
+
+    @VisibleForTesting
+    boolean isViewportAspectRatioMatchPreviewView(Size previewViewSize) {
+        // Using viewport rect to check if the viewport is based on the PreviewView.
+        Size rotatedViewportSize = getRotatedViewportSize();
+        return isAspectRatioMatchingWithRoundingError(
+                previewViewSize, /* isAccurate1= */ true,
+                rotatedViewportSize,  /* isAccurate2= */ false);
+    }
+
+    private Size getRotatedViewportSize() {
+        if (is90or270(mPreviewRotationDegrees)) {
+            return new Size(mSurfaceCropRect.height(), mSurfaceCropRect.width());
+        }
+        return new Size(mSurfaceCropRect.width(), mSurfaceCropRect.height());
+    }
+
+    private RectF getPreviewViewViewportRectForMismatchedAspectRatios(Size previewViewSize,
+            int layoutDirection) {
+        RectF previewViewRect = new RectF(0, 0, previewViewSize.getWidth(),
+                previewViewSize.getHeight());
+        Size rotatedViewportSize = getRotatedViewportSize();
+        RectF rotatedViewportRect = new RectF(0, 0, rotatedViewportSize.getWidth(),
+                rotatedViewportSize.getHeight());
+        Matrix matrix = new Matrix();
+        setMatrixRectToRect(matrix, rotatedViewportRect, previewViewRect, mScaleType);
+        matrix.mapRect(rotatedViewportRect);
+        if (layoutDirection == LayoutDirection.RTL) {
+            return flipHorizontally(rotatedViewportRect, (float) previewViewSize.getWidth() / 2);
+        }
+        return rotatedViewportRect;
+    }
+
+    private static void setMatrixRectToRect(Matrix matrix,
+            RectF source,
+            RectF destination,
+            ScaleType scaleType) {
+        Matrix.ScaleToFit matrixScaleType;
+        switch (scaleType) {
+            case FIT_CENTER:
+                // Fallthrough.
+            case FILL_CENTER:
+                matrixScaleType = Matrix.ScaleToFit.CENTER;
+                break;
+            case FIT_END:
+                // Fallthrough.
+            case FILL_END:
+                matrixScaleType = Matrix.ScaleToFit.END;
+                break;
+            case FIT_START:
+                // Fallthrough.
+            case FILL_START:
+                matrixScaleType = Matrix.ScaleToFit.START;
+                break;
+            default:
+                Logger.e(TAG, "Unexpected crop rect: " + scaleType);
+                matrixScaleType = Matrix.ScaleToFit.FILL;
+        }
+        boolean isFitTypes =
+                scaleType == FIT_CENTER || scaleType == FIT_START || scaleType == FIT_END;
+        if (isFitTypes) {
+            matrix.setRectToRect(source, destination, matrixScaleType);
+        } else {
+            // android.graphics.Matrix doesn't support fill scale types. The workaround is
+            // mapping inversely from destination to source, then invert the matrix.
+            matrix.setRectToRect(destination, source, matrixScaleType);
+            matrix.invert(matrix);
+        }
+    }
+
+    private static RectF flipHorizontally(RectF original, float flipLineX) {
+        return new RectF(
+                flipLineX + flipLineX - original.right,
+                original.top,
+                flipLineX + flipLineX - original.left,
+                original.bottom);
     }
 }
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewViewImplementation.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewViewImplementation.java
index c96ab64..8b5afe3 100644
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewViewImplementation.java
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/PreviewViewImplementation.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.previewview;
 
+import android.util.Size;
 import android.view.View;
 import android.widget.FrameLayout;
 
@@ -28,18 +29,16 @@
  * done using either a {@link android.view.TextureView} (see {@link TextureViewImplementation})
  * or a {@link android.view.SurfaceView} (see {@link SurfaceViewImplementation}).
  */
-@RequiresApi(21)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 abstract class PreviewViewImplementation {
 
-    @NonNull
-    FrameLayout mParent;
+    @NonNull protected final FrameLayout mParent;
 
-    @SuppressWarnings("unused")
-    @NonNull
-    private final PreviewTransformation mPreviewTransform;
+    @Nullable protected Size mResolution;
 
-    @Nullable
-    abstract View getPreview();
+    @NonNull private final PreviewTransformation mPreviewTransform;
+
+    private boolean mWasSurfaceProvided = false;
 
     PreviewViewImplementation(@NonNull FrameLayout parent,
             @NonNull PreviewTransformation previewTransform) {
@@ -47,13 +46,39 @@
         mPreviewTransform = previewTransform;
     }
 
+    abstract void initializePreview();
+
+    @Nullable
+    abstract View getPreview();
+
+    abstract void onSurfaceRequested(@NonNull PreviewSurfaceRequest surfaceRequest);
+
+    abstract void onAttachedToWindow();
+
+    abstract void onDetachedFromWindow();
+
+    void onSurfaceProvided() {
+        mWasSurfaceProvided = true;
+        redrawPreview();
+    }
+
     /**
      * Invoked when the preview needs to be adjusted, either because the layout bounds of the
-     * preview's container {@link CameraPreviewView} have changed, or the
-     * {@link CameraPreviewView.ScaleType} has changed.
+     * preview's container {@link CameraViewFinder} have changed, or the
+     * {@link CameraViewFinder.ScaleType} has changed.
      * <p>
-     * Corrects and adjusts the preview using the latest {@link CameraPreviewView.ScaleType} and
+     * Corrects and adjusts the preview using the latest {@link CameraViewFinder.ScaleType} and
      * display properties such as the display orientation and size.
      */
-    void redrawPreview() {}
+    void redrawPreview() {
+        View preview = getPreview();
+        // Only calls setScaleX/Y and setTranslationX/Y after the surface has been provided.
+        // Otherwise, it might cause some preview stretched issue when using PERFORMANCE mode
+        // together with Compose UI. For more details, please see b/183864890.
+        if (preview == null || !mWasSurfaceProvided) {
+            return;
+        }
+        mPreviewTransform.transformView(new Size(mParent.getWidth(),
+                mParent.getHeight()), mParent.getLayoutDirection(), preview);
+    }
 }
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/SurfaceViewImplementation.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/SurfaceViewImplementation.java
index 9a203d8..4558595 100644
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/SurfaceViewImplementation.java
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/SurfaceViewImplementation.java
@@ -16,6 +16,9 @@
 
 package androidx.camera.previewview;
 
+import android.util.Size;
+import android.view.Surface;
+import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 import android.view.View;
 import android.widget.FrameLayout;
@@ -23,27 +26,200 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.UiThread;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.core.content.ContextCompat;
+import androidx.core.util.Preconditions;
 
 /**
- * The SurfaceView implementation for {@link CameraPreviewView}.
+ * The SurfaceView implementation for {@link CameraViewFinder}.
  */
-@RequiresApi(21)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class SurfaceViewImplementation extends PreviewViewImplementation {
 
     private static final String TAG = "SurfaceViewImpl";
 
     // Synthetic Accessor
     @SuppressWarnings("WeakerAccess")
-    @Nullable private SurfaceView mSurfaceView;
+    @Nullable
+    SurfaceView mSurfaceView;
+
+    // Synthetic Accessor
+    @SuppressWarnings("WeakerAccess")
+    @NonNull
+    final SurfaceRequestCallback mSurfaceRequestCallback = new SurfaceRequestCallback();
 
     SurfaceViewImplementation(@NonNull FrameLayout parent,
             @NonNull PreviewTransformation previewTransform) {
         super(parent, previewTransform);
     }
 
+    @Override
+    void initializePreview() {
+        Preconditions.checkNotNull(mParent);
+        Preconditions.checkNotNull(mResolution);
+        mSurfaceView = new SurfaceView(mParent.getContext());
+        mSurfaceView.setLayoutParams(
+                new FrameLayout.LayoutParams(mResolution.getWidth(), mResolution.getHeight()));
+        mParent.removeAllViews();
+        mParent.addView(mSurfaceView);
+        mSurfaceView.getHolder().addCallback(mSurfaceRequestCallback);
+    }
+
+    @Override
+    void onSurfaceRequested(@NonNull PreviewSurfaceRequest surfaceRequest) {
+        mResolution = surfaceRequest.getResolution();
+        initializePreview();
+        surfaceRequest.addRequestCancellationListener(
+                ContextCompat.getMainExecutor(mSurfaceView.getContext()), () -> {});
+        mSurfaceView.post(() -> mSurfaceRequestCallback.setSurfaceRequest(surfaceRequest));
+    }
+
+    @Override
+    void onAttachedToWindow() {
+        // Do nothing currently.
+    }
+
+    @Override
+    void onDetachedFromWindow() {
+        // Do nothing currently.
+    }
+
     @Nullable
     @Override
     View getPreview() {
         return mSurfaceView;
     }
+
+    /**
+     * The {@link SurfaceHolder.Callback} on mSurfaceView.
+     *
+     * <p> SurfaceView creates Surface on its own before we can do anything. This class makes
+     * sure only the Surface with correct size will be returned to Preview.
+     */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+    class SurfaceRequestCallback implements SurfaceHolder.Callback {
+
+        // Target Surface size. Only complete the SurfaceRequest when the size of the Surface
+        // matches this value.
+        // Guarded by the UI thread.
+        @Nullable
+        private Size mTargetSize;
+
+        // SurfaceRequest to set when the target size is met.
+        // Guarded by the UI thread.
+        @Nullable
+        private PreviewSurfaceRequest mSurfaceRequest;
+
+        // The cached size of the current Surface.
+        // Guarded by the UI thread.
+        @Nullable
+        private Size mCurrentSurfaceSize;
+
+        // Guarded by the UI thread.
+        private boolean mWasSurfaceProvided = false;
+
+        @Override
+        public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
+            Logger.d(TAG, "Surface created.");
+            // No-op. Handling surfaceChanged() is enough because it's always called afterwards.
+        }
+
+        @Override
+        public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int format, int width,
+                int height) {
+            Logger.d(TAG, "Surface changed. Size: " + width + "x" + height);
+            mCurrentSurfaceSize = new Size(width, height);
+            tryToComplete();
+        }
+
+        @Override
+        public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
+            Logger.d(TAG, "Surface destroyed.");
+
+            // If a surface was already provided to the camera, invalidate it so that it requests
+            // a new valid one. Otherwise, cancel the surface request.
+            if (mWasSurfaceProvided) {
+                invalidateSurface();
+            } else {
+                cancelPreviousRequest();
+            }
+
+            // Reset state
+            mWasSurfaceProvided = false;
+            mSurfaceRequest = null;
+            mCurrentSurfaceSize = null;
+            mTargetSize = null;
+        }
+
+        /**
+         * Sets the completer and the size. The completer will only be set if the current size of
+         * the Surface matches the target size.
+         */
+        @UiThread
+        void setSurfaceRequest(@NonNull PreviewSurfaceRequest surfaceRequest) {
+            // Cancel the previous request, if any
+            cancelPreviousRequest();
+
+            mSurfaceRequest = surfaceRequest;
+            Size targetSize = surfaceRequest.getResolution();
+            mTargetSize = targetSize;
+            mWasSurfaceProvided = false;
+
+            if (!tryToComplete()) {
+                // The current size is incorrect. Wait for it to change.
+                Logger.d(TAG, "Wait for new Surface creation.");
+                mSurfaceView.getHolder().setFixedSize(targetSize.getWidth(),
+                        targetSize.getHeight());
+            }
+        }
+
+        /**
+         * Sets the completer if size matches.
+         *
+         * @return true if the completer is set.
+         */
+        @UiThread
+        private boolean tryToComplete() {
+            if (mSurfaceView == null || mSurfaceRequest == null) {
+                return false;
+            }
+            final Surface surface = mSurfaceView.getHolder().getSurface();
+            if (canProvideSurface()) {
+                Logger.d(TAG, "Surface set on Preview.");
+                mSurfaceRequest.provideSurface(surface,
+                        ContextCompat.getMainExecutor(mSurfaceView.getContext()),
+                        (result) -> {
+                            Logger.d(TAG, "provide surface result = " + result);
+                        });
+                mWasSurfaceProvided = true;
+                onSurfaceProvided();
+                return true;
+            }
+            return false;
+        }
+
+        private boolean canProvideSurface() {
+            return !mWasSurfaceProvided && mSurfaceRequest != null && mTargetSize != null
+                    && mTargetSize.equals(mCurrentSurfaceSize);
+        }
+
+        @UiThread
+        @SuppressWarnings("ObjectToString")
+        private void cancelPreviousRequest() {
+            if (mSurfaceRequest != null) {
+                Logger.d(TAG, "Request canceled: " + mSurfaceRequest);
+                mSurfaceRequest.willNotProvideSurface();
+            }
+        }
+
+        @UiThread
+        @SuppressWarnings("ObjectToString")
+        private void invalidateSurface() {
+            if (mSurfaceRequest != null) {
+                Logger.d(TAG, "Surface invalidated " + mSurfaceRequest);
+                mSurfaceRequest.getPreviewSurface().close();
+            }
+        }
+    }
 }
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/TextureViewImplementation.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/TextureViewImplementation.java
index 8f8c2f6..28690f4 100644
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/TextureViewImplementation.java
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/TextureViewImplementation.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.previewview;
 
+import android.graphics.SurfaceTexture;
+import android.view.Surface;
 import android.view.TextureView;
 import android.view.View;
 import android.widget.FrameLayout;
@@ -23,26 +25,225 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.PreviewSurfaceRequest.Result;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.camera.previewview.internal.utils.executor.CameraExecutors;
+import androidx.camera.previewview.internal.utils.futures.FutureCallback;
+import androidx.camera.previewview.internal.utils.futures.Futures;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.content.ContextCompat;
+import androidx.core.util.Consumer;
+import androidx.core.util.Preconditions;
+
+import com.google.common.util.concurrent.ListenableFuture;
 
 /**
- * The {@link TextureView} implementation for {@link CameraPreviewView}
+ * The {@link TextureView} implementation for {@link CameraViewFinder}
  */
-@RequiresApi(21)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 final class TextureViewImplementation extends PreviewViewImplementation {
 
     private static final String TAG = "TextureViewImpl";
 
+    @SuppressWarnings("WeakerAccess")
     @Nullable
-    private TextureView mTextureView;
+    PreviewSurfaceRequest mSurfaceRequest;
+
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    SurfaceTexture mDetachedSurfaceTexture;
+
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    SurfaceTexture mSurfaceTexture;
+
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    ListenableFuture<Result> mSurfaceReleaseFuture;
+
+    boolean mIsSurfaceTextureDetachedFromView = false;
+
+    // Synthetic Accessor
+    @SuppressWarnings("WeakerAccess")
+    @Nullable
+    TextureView mTextureView;
 
     TextureViewImplementation(@NonNull FrameLayout parent,
             @NonNull PreviewTransformation previewTransform) {
         super(parent, previewTransform);
     }
 
+    @Override
+    void initializePreview() {
+        Preconditions.checkNotNull(mParent);
+        Preconditions.checkNotNull(mResolution);
+        mTextureView = new TextureView(mParent.getContext());
+        mTextureView.setLayoutParams(
+                new FrameLayout.LayoutParams(mResolution.getWidth(), mResolution.getHeight()));
+        mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
+            @Override
+            public void onSurfaceTextureAvailable(@NonNull final SurfaceTexture surfaceTexture,
+                    final int width, final int height) {
+                Logger.d(TAG, "SurfaceTexture available. Size: "
+                        + width + "x" + height);
+                mSurfaceTexture = surfaceTexture;
+
+                // If a new SurfaceTexture becomes available yet the camera is still using a
+                // previous SurfaceTexture, invalidate its surface to notify the camera to
+                // request a new surface.
+                if (mSurfaceReleaseFuture != null && mSurfaceRequest != null) {
+                    Preconditions.checkNotNull(mSurfaceRequest);
+                    Logger.d(TAG, "Surface invalidated " + mSurfaceRequest);
+                    mSurfaceRequest.getPreviewSurface().close();
+                } else {
+                    tryToProvidePreviewSurface();
+                }
+            }
+
+            @Override
+            public void onSurfaceTextureSizeChanged(@NonNull final SurfaceTexture surfaceTexture,
+                    final int width, final int height) {
+                Logger.d(TAG, "SurfaceTexture size changed: " + width + "x" + height);
+            }
+
+            @Override
+            public boolean onSurfaceTextureDestroyed(@NonNull final SurfaceTexture surfaceTexture) {
+                mSurfaceTexture = null;
+
+                // If the camera is still using the surface, prevent the TextureView from
+                // releasing the SurfaceTexture, and instead manually handle it once the camera's
+                // no longer using the Surface.
+                if (mSurfaceReleaseFuture != null && mTextureView != null) {
+                    Futures.addCallback(mSurfaceReleaseFuture,
+                            new FutureCallback<Result>() {
+                                @Override
+                                public void onSuccess(Result result) {
+                                    Preconditions.checkState(result.getResultCode()
+                                                    != Result.RESULT_SURFACE_ALREADY_PROVIDED,
+                                            "Unexpected result from SurfaceRequest. Surface was "
+                                                    + "provided twice.");
+
+                                    Logger.d(TAG, "SurfaceTexture about to manually be destroyed");
+                                    surfaceTexture.release();
+
+                                    if (mDetachedSurfaceTexture != null) {
+                                        mDetachedSurfaceTexture = null;
+                                    }
+                                }
+
+                                @Override
+                                public void onFailure(Throwable t) {
+                                    throw new IllegalStateException("SurfaceReleaseFuture did not "
+                                            + "complete nicely.", t);
+                                }
+                            }, ContextCompat.getMainExecutor(mTextureView.getContext()));
+
+                    mDetachedSurfaceTexture = surfaceTexture;
+                    return false;
+                } else {
+                    return true;
+                }
+            }
+
+            @Override
+            public void onSurfaceTextureUpdated(@NonNull final SurfaceTexture surfaceTexture) {}
+        });
+
+        mParent.removeAllViews();
+        mParent.addView(mTextureView);
+    }
+
+    @Override
+    void onSurfaceRequested(@NonNull PreviewSurfaceRequest surfaceRequest) {
+        mResolution = surfaceRequest.getResolution();
+        initializePreview();
+        if (mSurfaceRequest != null) {
+            mSurfaceRequest.willNotProvideSurface();
+        }
+
+        mSurfaceRequest = surfaceRequest;
+        surfaceRequest.addRequestCancellationListener(
+                ContextCompat.getMainExecutor(mTextureView.getContext()), () -> {
+                    if (mSurfaceRequest != null && mSurfaceRequest == surfaceRequest) {
+                        mSurfaceRequest = null;
+                        mSurfaceReleaseFuture = null;
+                    }
+                });
+
+        tryToProvidePreviewSurface();
+    }
+
+    @Override
+    void onAttachedToWindow() {
+        reattachSurfaceTexture();
+    }
+
+    @Override
+    void onDetachedFromWindow() {
+        mIsSurfaceTextureDetachedFromView = true;
+    }
+
     @Nullable
     @Override
     View getPreview() {
         return mTextureView;
     }
+
+    /**
+     * Provides a {@link Surface} for preview to the camera only if the {@link TextureView}'s
+     * {@link SurfaceTexture} is available, and the {@link PreviewSurfaceRequest} was received from
+     * the
+     * camera.
+     */
+    @SuppressWarnings({"WeakerAccess", "ObjectToString"})
+    void tryToProvidePreviewSurface() {
+        if (mResolution == null || mSurfaceTexture == null || mSurfaceRequest == null) {
+            return;
+        }
+
+        mSurfaceTexture.setDefaultBufferSize(mResolution.getWidth(), mResolution.getHeight());
+        final Surface surface = new Surface(mSurfaceTexture);
+
+        final PreviewSurfaceRequest surfaceRequest = mSurfaceRequest;
+        final ListenableFuture<Result> surfaceReleaseFuture = CallbackToFutureAdapter.getFuture(
+                completer -> {
+                    Logger.d(TAG, "Surface set on Preview.");
+                    mSurfaceRequest.provideSurface(surface,
+                            CameraExecutors.directExecutor(), new Consumer<Result>() {
+                                @Override
+                                public void accept(Result result) {
+                                    Logger.d(TAG, "provide surface result = "
+                                            + result);
+                                    completer.set(result);
+                                }
+                            });
+                    return "provideSurface[request=" + mSurfaceRequest + " surface=" + surface
+                            + "]";
+                });
+
+        mSurfaceReleaseFuture = surfaceReleaseFuture;
+
+        mSurfaceReleaseFuture.addListener(() -> {
+            Logger.d(TAG, "Safe to release surface.");
+            surface.release();
+            if (mSurfaceReleaseFuture == surfaceReleaseFuture) {
+                mSurfaceReleaseFuture = null;
+            }
+            if (mSurfaceRequest == surfaceRequest) {
+                mSurfaceRequest = null;
+            }
+        }, ContextCompat.getMainExecutor(mTextureView.getContext()));
+
+        onSurfaceProvided();
+    }
+
+    private void reattachSurfaceTexture() {
+        if (mIsSurfaceTextureDetachedFromView
+                && mDetachedSurfaceTexture != null
+                && mTextureView.getSurfaceTexture() != mDetachedSurfaceTexture) {
+            mTextureView.setSurfaceTexture(mDetachedSurfaceTexture);
+            mDetachedSurfaceTexture = null;
+            mIsSurfaceTextureDetachedFromView = false;
+        }
+    }
 }
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/package-info.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/package-info.java
new file mode 100644
index 0000000..1d50833
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.previewview.internal;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/DeviceQuirks.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/DeviceQuirks.java
new file mode 100644
index 0000000..579efe3
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/DeviceQuirks.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+
+/**
+ * Provider of device specific quirks for the view module, which are used for device specific
+ * workarounds.
+ * <p>
+ * Device specific quirks depend on device properties, including the manufacturer
+ * ({@link android.os.Build#MANUFACTURER}), model ({@link android.os.Build#MODEL}) and OS
+ * level ({@link android.os.Build.VERSION#SDK_INT}).
+ * <p>
+ * Device specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class DeviceQuirks {
+
+    @NonNull
+    private static final Quirks QUIRKS;
+
+    static {
+        QUIRKS = new Quirks(DeviceQuirksLoader.loadQuirks());
+    }
+
+    private DeviceQuirks() {
+    }
+
+    /**
+     * Retrieves a specific device {@link Quirk} instance given its type.
+     *
+     * @param quirkClass The type of device quirk to retrieve.
+     * @return A device {@link Quirk} instance of the provided type, or {@code null} if it isn't
+     * found.
+     */
+    @Nullable
+    public static <T extends Quirk> T get(@NonNull final Class<T> quirkClass) {
+        return QUIRKS.get(quirkClass);
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/DeviceQuirksLoader.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/DeviceQuirksLoader.java
new file mode 100644
index 0000000..5f1fb33
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/DeviceQuirksLoader.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Loads all device specific quirks required for the current device
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class DeviceQuirksLoader {
+
+    private DeviceQuirksLoader() {
+    }
+
+    /**
+     * Goes through all defined device-specific quirks, and returns those that should be loaded
+     * on the current device.
+     */
+    @NonNull
+    static List<Quirk> loadQuirks() {
+        final List<Quirk> quirks = new ArrayList<>();
+
+        if (SurfaceViewStretchedQuirk.load()) {
+            quirks.add(new SurfaceViewStretchedQuirk());
+        }
+
+        if (SurfaceViewNotCroppedByParentQuirk.load()) {
+            quirks.add(new SurfaceViewNotCroppedByParentQuirk());
+        }
+
+        return quirks;
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/Quirk.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/Quirk.java
new file mode 100644
index 0000000..09c17e7
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/Quirk.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * Defines an inconsistency, a limitation, or any behavior that deviates from the standard behavior.
+ *
+ * <p> This class is used to define both device specific and camera specific quirks. Device
+ * specific quirks depend on device related information, such as the device's brand, model and OS
+ * level. Whereas camera related quirks depend on the camera id and/or camera characteristics.
+ *
+ * @see Quirks
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public interface Quirk {
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/Quirks.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/Quirks.java
new file mode 100644
index 0000000..3ec2086
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/Quirks.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Wraps a list of {@link Quirk}s, allowing to easily retrieve a {@link Quirk} instance by its
+ * class.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class Quirks {
+
+    @NonNull
+    private final List<Quirk> mQuirks;
+
+    /** Wraps the provided list of quirks. */
+    public Quirks(@NonNull final List<Quirk> quirks) {
+        mQuirks = new ArrayList<>(quirks);
+    }
+
+    /**
+     * Retrieves a {@link Quirk} instance given its type.
+     *
+     * <p>Unlike {@link #contains(Class)}, a quirk can only be retrieved by the exact class. If a
+     * superclass or superinterface is provided, {@code null} will be returned, even if a quirk
+     * with the provided superclass or superinterface exists in this collection.
+     *
+     * @param quirkClass The type of quirk to retrieve.
+     * @return A {@link Quirk} instance of the provided type, or {@code null} if it isn't found.
+     */
+    @SuppressWarnings("unchecked")
+    @Nullable
+    public <T extends Quirk> T get(@NonNull final Class<T> quirkClass) {
+        for (final Quirk quirk : mQuirks) {
+            if (quirk.getClass() == quirkClass) {
+                return (T) quirk;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns whether this collection of quirks contains a quirk with the provided type.
+     *
+     * <p>This checks whether the provided quirk type is the exact class, a superclass, or a
+     * superinterface of any of the contained quirks, and will return true in all cases.
+     * @param quirkClass The type of quirk to check for existence in this container.
+     * @return {@code true} if this container contains a quirk with the given type, {@code false}
+     * otherwise.
+     */
+    public boolean contains(@NonNull Class<? extends Quirk> quirkClass) {
+        for (Quirk quirk : mQuirks) {
+            if (quirkClass.isAssignableFrom(quirk.getClass())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/SurfaceViewNotCroppedByParentQuirk.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/SurfaceViewNotCroppedByParentQuirk.java
new file mode 100644
index 0000000..9f837ea
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/SurfaceViewNotCroppedByParentQuirk.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import android.os.Build;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * A quirk where a scaled up SurfaceView is not cropped by the parent View.
+ *
+ * <p> On certain Xiaomi devices, when the scale type is FILL_* and the preview is scaled up
+ * to be larger than its parent, the SurfaceView is not cropped by its parent. As the result, the
+ * preview incorrectly covers the neighboring UI elements. b/211370840
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class SurfaceViewNotCroppedByParentQuirk implements Quirk {
+
+    private static final String XIAOMI = "XIAOMI";
+    private static final String RED_MI_NOTE_10_MODEL = "M2101K7AG";
+
+    static boolean load() {
+        return XIAOMI.equalsIgnoreCase(Build.MANUFACTURER)
+                && RED_MI_NOTE_10_MODEL.equalsIgnoreCase(Build.MODEL);
+    }
+
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/SurfaceViewStretchedQuirk.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/SurfaceViewStretchedQuirk.java
new file mode 100644
index 0000000..f510a9b
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/SurfaceViewStretchedQuirk.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import android.os.Build;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * A quirk where SurfaceView is stretched.
+ *
+ * <p> On certain Samsung devices, transform APIs (e.g. View#setScaleX) do not work as intended.
+ * b/129403806
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class SurfaceViewStretchedQuirk implements Quirk {
+
+    // Samsung Galaxy Z Fold2 b/129403806
+    private static final String SAMSUNG = "SAMSUNG";
+    private static final String GALAXY_Z_FOLD_2 = "F2Q";
+    private static final String GALAXY_Z_FOLD_3 = "Q2Q";
+
+    static boolean load() {
+        return SAMSUNG.equalsIgnoreCase(Build.MANUFACTURER) && isFold2OrFold3();
+    }
+
+    static boolean isFold2OrFold3() {
+        return GALAXY_Z_FOLD_2.equalsIgnoreCase(Build.DEVICE)
+                || GALAXY_Z_FOLD_3.equalsIgnoreCase(Build.DEVICE);
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/package-info.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/package-info.java
new file mode 100644
index 0000000..e0d3471
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/quirk/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.previewview.internal.quirk;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/PreviewSurface.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/PreviewSurface.java
new file mode 100644
index 0000000..f3df8d0
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/PreviewSurface.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.surface;
+
+import android.view.Surface;
+import android.view.SurfaceView;
+import android.view.TextureView;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.camera.previewview.internal.utils.futures.Futures;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * A class for creating and tracking use of a {@link Surface} in an asynchronous manner.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public abstract class PreviewSurface {
+
+    private static final String TAG = "PreviewSurface";
+
+    @NonNull private final Object mLock = new Object();
+    @NonNull private final ListenableFuture<Void> mTerminationFuture;
+
+    @GuardedBy("mLock")
+    private boolean mClosed = false;
+
+    @Nullable
+    @GuardedBy("mLock")
+    private CallbackToFutureAdapter.Completer<Void> mTerminationCompleter;
+
+    public PreviewSurface() {
+        mTerminationFuture = CallbackToFutureAdapter.getFuture(completer -> {
+            synchronized (mLock) {
+                mTerminationCompleter = completer;
+            }
+            return "PreviewSurface-termination(" + PreviewSurface.this + ")";
+        });
+    }
+
+    @NonNull
+    public final ListenableFuture<Surface> getSurface() {
+        return provideSurfaceAsync();
+    }
+
+    @NonNull
+    public ListenableFuture<Void> getTerminationFuture() {
+        return Futures.nonCancellationPropagating(mTerminationFuture);
+    }
+
+    /**
+     * Close the surface.
+     *
+     * <p> After closing, the underlying surface resources can be safely released by
+     * {@link SurfaceView} or {@link TextureView} implementation.
+     */
+    public void close() {
+        CallbackToFutureAdapter.Completer<Void> terminationCompleter = null;
+        synchronized (mLock) {
+            if (!mClosed) {
+                mClosed = true;
+                terminationCompleter = mTerminationCompleter;
+                mTerminationCompleter = null;
+                Logger.d(TAG,
+                        "surface closed,  closed=true " + this);
+            }
+        }
+
+        if (terminationCompleter != null) {
+            terminationCompleter.set(null);
+        }
+    }
+
+    @NonNull
+    protected abstract ListenableFuture<Surface> provideSurfaceAsync();
+
+    /**
+     * The exception that is returned by the ListenableFuture of {@link #getSurface()} if the
+     * deferrable surface is unable to produce a {@link Surface}.
+     */
+    public static final class SurfaceUnavailableException extends Exception {
+        public SurfaceUnavailableException(@NonNull String message) {
+            super(message);
+        }
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurfaceProvider.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/PreviewSurfaceProvider.java
similarity index 88%
rename from camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurfaceProvider.java
rename to camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/PreviewSurfaceProvider.java
index 825b45480..7938cc3 100644
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurfaceProvider.java
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/PreviewSurfaceProvider.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package androidx.camera.previewview.surface;
+package androidx.camera.previewview.internal.surface;
 
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
+import androidx.camera.previewview.PreviewSurfaceRequest;
 
 /**
  * A interface implemented by the application to provide a {@link Surface} for preview.
@@ -28,11 +28,8 @@
  * <p> This interface is implemented by the application to provide a {@link Surface}. This
  * will be called by application when it needs a Surface for Preview. It also signals when the
  * Surface is no longer in use.
- *
- * @hide
  */
-@RequiresApi(21)
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface PreviewSurfaceProvider {
     /**
      * Called when a new {@link Surface} has been requested by the camera.
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/package-info.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/package-info.java
new file mode 100644
index 0000000..06b37b4
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/surface/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.previewview.internal.surface;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/transform/Rotation.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/Rotation.java
similarity index 87%
rename from camera/camera-previewview/src/main/java/androidx/camera/previewview/transform/Rotation.java
rename to camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/Rotation.java
index 25912a6..998c068 100644
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/transform/Rotation.java
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/Rotation.java
@@ -14,25 +14,20 @@
  * limitations under the License.
  */
 
-package androidx.camera.previewview.transform;
+package androidx.camera.previewview.internal.transform;
 
 import android.view.Surface;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.RestrictTo.Scope;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 /**
  * Configuration containing options for configuring the output image data of a pipeline.
- *
- * @hide
  */
-@RequiresApi(21)
-@RestrictTo(Scope.LIBRARY_GROUP)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public interface Rotation {
     /**
      * Valid integer rotation values.
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/transform/TransformationInfo.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/TransformationInfo.java
similarity index 90%
rename from camera/camera-previewview/src/main/java/androidx/camera/previewview/transform/TransformationInfo.java
rename to camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/TransformationInfo.java
index 7368dbd..373481e 100644
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/transform/TransformationInfo.java
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/TransformationInfo.java
@@ -14,23 +14,18 @@
  * limitations under the License.
  */
 
-package androidx.camera.previewview.transform;
+package androidx.camera.previewview.internal.transform;
 
 import android.graphics.Rect;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.RestrictTo.Scope;
 
 import com.google.auto.value.AutoValue;
 
 /**
  * Transformation associated the preview output.
- *
- * @hide
  */
 @AutoValue
-@RestrictTo(Scope.LIBRARY_GROUP)
 public abstract class TransformationInfo {
 
     /**
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/package-info.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/package-info.java
new file mode 100644
index 0000000..a07a0a9
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/transform/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.previewview.internal.transform;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/CameraOrientationUtil.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/CameraOrientationUtil.java
new file mode 100644
index 0000000..1ee878f
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/CameraOrientationUtil.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils;
+
+import android.view.Surface;
+
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.internal.transform.Rotation.RotationValue;
+
+/**
+ * Contains utility methods related to camera orientation.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class CameraOrientationUtil {
+    private static final String TAG = "CameraOrientationUtil";
+
+    // Do not allow instantiation
+    private CameraOrientationUtil() {
+    }
+
+    /**
+     * Calculates the delta between a source rotation and destination rotation.
+     *
+     * <p>A typical use of this method would be calculating the angular difference between the
+     * display orientation (destRotationDegrees) and camera sensor orientation
+     * (sourceRotationDegrees).
+     *
+     * @param destRotationDegrees   The destination rotation relative to the device's natural
+     *                              rotation.
+     * @param sourceRotationDegrees The source rotation relative to the device's natural rotation.
+     * @param isOppositeFacing      Whether the source and destination planes are facing opposite
+     *                              directions.
+     */
+    public static int getRelativeImageRotation(
+            int destRotationDegrees, int sourceRotationDegrees, boolean isOppositeFacing) {
+        int result;
+        if (isOppositeFacing) {
+            result = (sourceRotationDegrees - destRotationDegrees + 360) % 360;
+        } else {
+            result = (sourceRotationDegrees + destRotationDegrees) % 360;
+        }
+        if (Logger.isDebugEnabled(TAG)) {
+            Logger.d(
+                    TAG,
+                    String.format(
+                            "getRelativeImageRotation: destRotationDegrees=%s, "
+                                    + "sourceRotationDegrees=%s, isOppositeFacing=%s, "
+                                    + "result=%s",
+                            destRotationDegrees, sourceRotationDegrees, isOppositeFacing, result));
+        }
+        return result;
+    }
+
+    /**
+     * Converts rotation constant values defined in {@link Surface} to their equivalent in
+     * degrees.
+     *
+     * <p>Valid values for the relative rotation are {@link Surface#ROTATION_0}, {@link
+     * Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
+     *
+     * @param rotation One of the rotation constant values from {@link Surface}.
+     * @return The equivalent rotation value in degrees.
+     * @throws IllegalArgumentException If the provided rotation value is not one of those
+     * defined in {@link Surface}.
+     */
+    public static int surfaceRotationToDegrees(@RotationValue int rotation) {
+        int rotationDegrees;
+        switch (rotation) {
+            case Surface.ROTATION_0:
+                rotationDegrees = 0;
+                break;
+            case Surface.ROTATION_90:
+                rotationDegrees = 90;
+                break;
+            case Surface.ROTATION_180:
+                rotationDegrees = 180;
+                break;
+            case Surface.ROTATION_270:
+                rotationDegrees = 270;
+                break;
+            default:
+                throw new IllegalArgumentException("Unsupported surface rotation: " + rotation);
+        }
+
+        return rotationDegrees;
+    }
+
+    /**
+     * Converts rotation degrees to their equivalent in values defined in {@link Surface}.
+     *
+     * <p>Valid values for the relative rotation are {@link Surface#ROTATION_0}, {@link
+     * Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
+     *
+     * @param degrees The rotation value in degrees.
+     * @return One of the constant rotation values defined in {@link Surface}.
+     * @throws IllegalArgumentException If the provided rotation degrees doesn't fall into any
+     *                                  one of those defined in {@link Surface}.
+     */
+    @RotationValue
+    public static int degreesToSurfaceRotation(int degrees) {
+        int surfaceRotation = Surface.ROTATION_0;
+        switch (degrees) {
+            case 0:
+                surfaceRotation = Surface.ROTATION_0;
+                break;
+            case 90:
+                surfaceRotation = Surface.ROTATION_90;
+                break;
+            case 180:
+                surfaceRotation = Surface.ROTATION_180;
+                break;
+            case 270:
+                surfaceRotation = Surface.ROTATION_270;
+                break;
+            default:
+                throw new IllegalStateException("Invalid sensor rotation: " + degrees);
+        }
+
+        return surfaceRotation;
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/CameraThreads.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/CameraThreads.java
new file mode 100644
index 0000000..6cc58a3
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/CameraThreads.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils;
+
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+
+/**
+ * Static tag for creating Camera threads. TODO(b/115747543): Remove this class when migration from
+ * threads to executors is complete.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class CameraThreads {
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public static final String TAG = "CameraX-";
+
+    private CameraThreads() {
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/Logger.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/Logger.java
new file mode 100644
index 0000000..a9ad16d
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/Logger.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils;
+
+import android.os.Build;
+import android.util.Log;
+
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+/**
+ * Handles logging requests inside CameraX. Log messages are output only if:
+ * - The minimum logging level allows for it. The minimum logging level is set via
+ * {@link #setMinLogLevel(int)}, which should typically be called during the process of configuring
+ * CameraX.
+ * - The log tag is {@linkplain Log#isLoggable(String, int) loggable}. This can be configured
+ * by setting the system property `setprop log.tag.TAG LEVEL`, where TAG is the log tag, and
+ * LEVEL is {@link Log#DEBUG}, {@link Log#INFO}, {@link Log#WARN} or {@link Log#ERROR}.
+ * <p> A typical usage of the Logger looks as follows:
+ * <pre>
+ *     try {
+ *         int quotient = dividend / divisor;
+ *     } catch (ArithmeticException exception) {
+ *         Logger.e(TAG, "Divide operation error", exception);
+ *     }
+ * </pre>
+ * <p> If an action has to be performed alongside logging, or if building the log message is costly,
+ * perform a log level check before attempting to log.
+ * <pre>
+ *     try {
+ *         int quotient = dividend / divisor;
+ *     } catch (ArithmeticException exception) {
+ *         if (Logger.isErrorEnabled(TAG)) {
+ *             Logger.e(TAG, "Divide operation error", exception);
+ *             doSomething();
+ *         }
+ *     }
+ * </pre>
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class Logger {
+
+    /** On API levels strictly below 24, the log tag's length must not exceed 23 characters. */
+    private static final int MAX_TAG_LENGTH = 23;
+
+    static final int DEFAULT_MIN_LOG_LEVEL = Log.DEBUG;
+    private static int sMinLogLevel = DEFAULT_MIN_LOG_LEVEL;
+
+    private Logger() {
+    }
+
+    /**
+     * Returns {@code true} if logging with the truncated tag {@code truncatedTag} is
+     * enabled at the {@code logLevel} level.
+     */
+    private static boolean isLogLevelEnabled(@NonNull String truncatedTag, int logLevel) {
+        return sMinLogLevel <= logLevel || Log.isLoggable(truncatedTag, logLevel);
+    }
+
+    /**
+     * Sets the minimum logging level to use in {@link Logger}. After calling this method, only logs
+     * at the level {@code logLevel} and above are output.
+     */
+    static void setMinLogLevel(@IntRange(from = Log.DEBUG, to = Log.ERROR) int logLevel) {
+        sMinLogLevel = logLevel;
+    }
+
+    /**
+     * Returns current minimum logging level.
+     */
+    static int getMinLogLevel() {
+        return sMinLogLevel;
+    }
+
+    /**
+     * Resets the minimum logging level to use in {@link Logger} to the default minimum logging
+     * level. After calling this method, only logs at the default level and above are output.
+     */
+    static void resetMinLogLevel() {
+        sMinLogLevel = DEFAULT_MIN_LOG_LEVEL;
+    }
+
+    /**
+     * Returns {@code true} if logging with the tag {@code tag} is enabled at the {@link Log#DEBUG}
+     * level. This is true when the minimum logging level is less than or equal to
+     * {@link Log#DEBUG}, or if the log level of {@code tag} was explicitly set to
+     * {@link Log#DEBUG} at least.
+     */
+    public static boolean isDebugEnabled(@NonNull String tag) {
+        return isLogLevelEnabled(truncateTag(tag), Log.DEBUG);
+    }
+
+    /**
+     * Returns {@code true} if logging with the tag {@code tag} is enabled at the {@link Log#INFO}
+     * level. This is true when the minimum logging level is less than or equal to
+     * {@link Log#INFO}, or if the log level of {@code tag} was explicitly set to
+     * {@link Log#INFO} at least.
+     */
+    public static boolean isInfoEnabled(@NonNull String tag) {
+        return isLogLevelEnabled(truncateTag(tag), Log.INFO);
+    }
+
+    /**
+     * Returns {@code true} if logging with the tag {@code tag} is enabled at the {@link Log#WARN}
+     * level. This is true when the minimum logging level is less than or equal to
+     * {@link Log#WARN}, or if the log level of {@code tag} was explicitly set to
+     * {@link Log#WARN} at least.
+     */
+    public static boolean isWarnEnabled(@NonNull String tag) {
+        return isLogLevelEnabled(truncateTag(tag), Log.WARN);
+    }
+
+    /**
+     * Returns {@code true} if logging with the tag {@code tag} is enabled at the {@link Log#ERROR}
+     * level. This is true when the minimum logging level is less than or equal to
+     * {@link Log#ERROR}, or if the log level of {@code tag} was explicitly set to
+     * {@link Log#ERROR} at least.
+     */
+    public static boolean isErrorEnabled(@NonNull String tag) {
+        return isLogLevelEnabled(truncateTag(tag), Log.ERROR);
+    }
+
+    /**
+     * Logs the given {@link Log#DEBUG} message if the tag is
+     * {@linkplain #isDebugEnabled(String) loggable}.
+     */
+    public static void d(@NonNull String tag, @NonNull String message) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.DEBUG)) {
+            Log.d(truncatedTag, message);
+        }
+    }
+
+    /**
+     * Logs the given {@link Log#DEBUG} message and the exception's stacktrace if the tag is
+     * {@linkplain #isDebugEnabled(String) loggable}.
+     */
+    public static void d(@NonNull String tag, @NonNull String message,
+            @NonNull final Throwable throwable) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.DEBUG)) {
+            Log.d(truncatedTag, message, throwable);
+        }
+    }
+
+    /**
+     * Logs the given {@link Log#INFO} message if the tag is
+     * {@linkplain #isInfoEnabled(String) loggable}.
+     */
+    public static void i(@NonNull String tag, @NonNull String message) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.INFO)) {
+            Log.i(truncatedTag, message);
+        }
+    }
+
+    /**
+     * Logs the given {@link Log#INFO} message and the exception's stacktrace if the tag is
+     * {@linkplain #isInfoEnabled(String) loggable}.
+     */
+    public static void i(@NonNull String tag, @NonNull String message,
+            @NonNull final Throwable throwable) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.INFO)) {
+            Log.i(truncatedTag, message, throwable);
+        }
+    }
+
+    /**
+     * Logs the given {@link Log#WARN} message if the tag is
+     * {@linkplain #isWarnEnabled(String) loggable}.
+     */
+    public static void w(@NonNull String tag, @NonNull String message) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.WARN)) {
+            Log.w(truncatedTag, message);
+        }
+    }
+
+    /**
+     * Logs the given {@link Log#WARN} message and the exception's stacktrace if the tag is
+     * {@linkplain #isWarnEnabled(String) loggable}.
+     */
+    public static void w(@NonNull String tag, @NonNull String message,
+            @NonNull final Throwable throwable) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.WARN)) {
+            Log.w(truncatedTag, message, throwable);
+        }
+    }
+
+    /**
+     * Logs the given {@link Log#ERROR} message if the tag is
+     * {@linkplain #isErrorEnabled(String) loggable}.
+     */
+    public static void e(@NonNull String tag, @NonNull String message) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.ERROR)) {
+            Log.e(truncatedTag, message);
+        }
+    }
+
+    /**
+     * Logs the given {@link Log#ERROR} message and the exception's stacktrace if the tag is
+     * {@linkplain #isErrorEnabled(String) loggable}.
+     */
+    public static void e(@NonNull String tag, @NonNull String message,
+            @NonNull final Throwable throwable) {
+        final String truncatedTag = truncateTag(tag);
+        if (isLogLevelEnabled(truncatedTag, Log.ERROR)) {
+            Log.e(truncatedTag, message, throwable);
+        }
+    }
+
+    /**
+     * Truncates the tag so it can be used to log.
+     * <p>
+     * On API 24, the tag length limit of 23 characters was removed.
+     */
+    @NonNull
+    private static String truncateTag(@NonNull String tag) {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N && MAX_TAG_LENGTH < tag.length()) {
+            return tag.substring(0, MAX_TAG_LENGTH);
+        }
+        return tag;
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/Threads.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/Threads.java
new file mode 100644
index 0000000..23c3855
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/Threads.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils;
+
+import android.os.Looper;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * Helpers for {@link Thread}s.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class Threads {
+
+    // Prevent instantiation.
+    private Threads() {
+    }
+
+    /** Returns true if we're currently running in the application's main thread. */
+    public static boolean isMainThread() {
+        return Looper.getMainLooper().getThread() == Thread.currentThread();
+    }
+}
+
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/TransformUtils.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/TransformUtils.java
new file mode 100644
index 0000000..da2cce4
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/TransformUtils.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils;
+
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.util.Size;
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.CameraViewFinder;
+
+/**
+ * Utility class for transform.
+ *
+ * <p> The vertices representation uses a float array to represent a rectangle with arbitrary
+ * rotation and rotation-direction. It could be otherwise represented by a triple of a
+ * {@link RectF}, a rotation degrees integer and a boolean flag for the rotation-direction
+ * (clockwise v.s. counter-clockwise).
+ *
+ * TODO(b/179827713): merge this with {@link androidx.camera.core.internal.utils.ImageUtil}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class TransformUtils {
+
+    // Normalized space (-1, -1) - (1, 1).
+    public static final RectF NORMALIZED_RECT = new RectF(-1, -1, 1, 1);
+
+    private TransformUtils() {
+    }
+
+    /**
+     * Converts {@link Surface} rotation to rotation degrees: 90, 180, 270 or 0.
+     */
+    public static int surfaceRotationToRotationDegrees(int rotationValue) {
+        switch (rotationValue) {
+            case Surface.ROTATION_0:
+                return 0;
+            case Surface.ROTATION_90:
+                return 90;
+            case Surface.ROTATION_180:
+                return 180;
+            case Surface.ROTATION_270:
+                return 270;
+            default:
+                throw new IllegalStateException("Unexpected rotation value " + rotationValue);
+        }
+    }
+
+    /**
+     * Returns true if the rotation degrees is 90 or 270.
+     */
+    public static boolean is90or270(int rotationDegrees) {
+        if (rotationDegrees == 90 || rotationDegrees == 270) {
+            return true;
+        }
+        if (rotationDegrees == 0 || rotationDegrees == 180) {
+            return false;
+        }
+        throw new IllegalArgumentException("Invalid rotation degrees: " + rotationDegrees);
+    }
+
+    /**
+     * Converts a {@link Size} to a float array of vertices.
+     */
+    @NonNull
+    public static float[] sizeToVertices(@NonNull Size size) {
+        return new float[]{0, 0, size.getWidth(), 0, size.getWidth(), size.getHeight(), 0,
+                size.getHeight()};
+    }
+
+    /**
+     * Checks if aspect ratio matches while tolerating rounding error.
+     *
+     * <p> One example of the usage is comparing the viewport-based crop rect from different use
+     * cases. The crop rect is rounded because pixels are integers, which may introduce an error
+     * when we check if the aspect ratio matches. For example, when {@link CameraViewFinder}'s
+     * width/height are prime numbers 601x797, the crop rect from other use cases cannot have a
+     * matching aspect ratio even if they are based on the same viewport. This method checks the
+     * aspect ratio while tolerating a rounding error.
+     *
+     * @param size1       the rounded size1
+     * @param isAccurate1 if size1 is accurate. e.g. it's true if it's the PreviewView's
+     *                    dimension which viewport is based on
+     * @param size2       the rounded size2
+     * @param isAccurate2 if size2 is accurate.
+     */
+    public static boolean isAspectRatioMatchingWithRoundingError(
+            @NonNull Size size1, boolean isAccurate1, @NonNull Size size2, boolean isAccurate2) {
+        // The crop rect coordinates are rounded values. Each value is at most .5 away from their
+        // true values. So the width/height, which is the difference of 2 coordinates, are at most
+        // 1.0 away from their true value.
+        // First figure out the possible range of the aspect ratio's true value.
+        float ratio1UpperBound;
+        float ratio1LowerBound;
+        if (isAccurate1) {
+            ratio1UpperBound = (float) size1.getWidth() / size1.getHeight();
+            ratio1LowerBound = ratio1UpperBound;
+        } else {
+            ratio1UpperBound = (size1.getWidth() + 1F) / (size1.getHeight() - 1F);
+            ratio1LowerBound = (size1.getWidth() - 1F) / (size1.getHeight() + 1F);
+        }
+        float ratio2UpperBound;
+        float ratio2LowerBound;
+        if (isAccurate2) {
+            ratio2UpperBound = (float) size2.getWidth() / size2.getHeight();
+            ratio2LowerBound = ratio2UpperBound;
+        } else {
+            ratio2UpperBound = (size2.getWidth() + 1F) / (size2.getHeight() - 1F);
+            ratio2LowerBound = (size2.getWidth() - 1F) / (size2.getHeight() + 1F);
+        }
+        // Then we check if the true value range overlaps.
+        return ratio1UpperBound >= ratio2LowerBound && ratio2UpperBound >= ratio1LowerBound;
+    }
+
+    /**
+     * Gets the transform from one {@link Rect} to another with rotation degrees.
+     *
+     * <p> Following is how the source is mapped to the target with a 90° rotation. The rect
+     * <a, b, c, d> is mapped to <a', b', c', d'>.
+     *
+     * <pre>
+     *  a----------b               d'-----------a'
+     *  |  source  |    -90°->     |            |
+     *  d----------c               |   target   |
+     *                             |            |
+     *                             c'-----------b'
+     * </pre>
+     */
+    @NonNull
+    public static Matrix getRectToRect(
+            @NonNull RectF source, @NonNull RectF target, int rotationDegrees) {
+        // Map source to normalized space.
+        Matrix matrix = new Matrix();
+        matrix.setRectToRect(source, NORMALIZED_RECT, Matrix.ScaleToFit.FILL);
+        // Add rotation.
+        matrix.postRotate(rotationDegrees);
+        // Restore the normalized space to target's coordinates.
+        matrix.postConcat(getNormalizedToBuffer(target));
+        return matrix;
+    }
+    /**
+     * Gets the transform from a normalized space (-1, -1) - (1, 1) to the given rect.
+     */
+    @NonNull
+    private static Matrix getNormalizedToBuffer(@NonNull RectF viewPortRect) {
+        Matrix normalizedToBuffer = new Matrix();
+        normalizedToBuffer.setRectToRect(NORMALIZED_RECT, viewPortRect, Matrix.ScaleToFit.FILL);
+        return normalizedToBuffer;
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/CameraExecutors.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/CameraExecutors.java
new file mode 100644
index 0000000..5de0271
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/CameraExecutors.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.executor;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
+
+/**
+ * Utility class for generating specific implementations of {@link Executor}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class CameraExecutors {
+
+    // Should not be instantiated
+    private CameraExecutors() {
+    }
+
+    /** Returns a cached {@link ScheduledExecutorService} which posts to the main thread. */
+    @NonNull
+    public static ScheduledExecutorService mainThreadExecutor() {
+        return MainThreadExecutor.getInstance();
+    }
+
+    /** Returns a cached executor that runs tasks directly from the calling thread. */
+    @NonNull
+    public static Executor directExecutor() {
+        return DirectExecutor.getInstance();
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/DirectExecutor.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/DirectExecutor.java
new file mode 100644
index 0000000..a12aad8
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/DirectExecutor.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.executor;
+
+import androidx.annotation.RequiresApi;
+
+import java.util.concurrent.Executor;
+
+/**
+ * An {@link Executor} that runs each task in the thread that invokes {@link Executor#execute
+ * execute}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+final class DirectExecutor implements Executor {
+    private static volatile DirectExecutor sDirectExecutor;
+
+    static Executor getInstance() {
+        if (sDirectExecutor != null) {
+            return sDirectExecutor;
+        }
+        synchronized (DirectExecutor.class) {
+            if (sDirectExecutor == null) {
+                sDirectExecutor = new DirectExecutor();
+            }
+        }
+
+        return sDirectExecutor;
+    }
+
+    @Override
+    public void execute(Runnable command) {
+        command.run();
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/HandlerScheduledExecutorService.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/HandlerScheduledExecutorService.java
new file mode 100644
index 0000000..8cfe472
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/HandlerScheduledExecutorService.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.executor;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.internal.utils.futures.Futures;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.List;
+import java.util.concurrent.AbstractExecutorService;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Delayed;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.RunnableScheduledFuture;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * An implementation of {@link ScheduledExecutorService} which delegates all scheduled task to
+ * the given {@link Handler}.
+ *
+ * <p>Currently, can only be used to schedule future non-repeating tasks.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+final class HandlerScheduledExecutorService extends AbstractExecutorService implements
+        ScheduledExecutorService {
+
+    private static ThreadLocal<ScheduledExecutorService> sThreadLocalInstance =
+            new ThreadLocal<ScheduledExecutorService>() {
+                @Override
+                public ScheduledExecutorService initialValue() {
+                    if (Looper.myLooper() == Looper.getMainLooper()) {
+                        return CameraExecutors.mainThreadExecutor();
+                    } else if (Looper.myLooper() != null) {
+                        Handler handler = new Handler(Looper.myLooper());
+                        return new HandlerScheduledExecutorService(handler);
+                    }
+
+                    return null;
+                }
+            };
+
+    private final Handler mHandler;
+
+    HandlerScheduledExecutorService(@NonNull Handler handler) {
+        mHandler = handler;
+    }
+
+    /**
+     * Retrieves a cached executor derived from the current thread's looper.
+     */
+    static ScheduledExecutorService currentThreadExecutor() {
+        ScheduledExecutorService executor = sThreadLocalInstance.get();
+        if (executor == null) {
+            Looper looper = Looper.myLooper();
+            if (looper == null) {
+                throw new IllegalStateException("Current thread has no looper!");
+            }
+
+            executor = new HandlerScheduledExecutorService(new Handler(looper));
+            sThreadLocalInstance.set(executor);
+        }
+
+        return executor;
+    }
+
+    @Override
+    public ScheduledFuture<?> schedule(
+            @NonNull final Runnable command,
+            long delay,
+            @NonNull TimeUnit unit) {
+        Callable<Void> wrapper = new Callable<Void>() {
+            @Override
+            public Void call() {
+                command.run();
+                return null;
+            }
+        };
+        return schedule(wrapper, delay, unit);
+    }
+
+    @Override
+    @NonNull
+    public <V> ScheduledFuture<V> schedule(
+            @NonNull Callable<V> callable,
+            long delay,
+            @NonNull TimeUnit unit) {
+        long runAtMillis = SystemClock.uptimeMillis() + TimeUnit.MILLISECONDS.convert(delay, unit);
+        HandlerScheduledFuture<V> future = new HandlerScheduledFuture<>(mHandler, runAtMillis,
+                callable);
+        if (mHandler.postAtTime(future, runAtMillis)) {
+            return future;
+        }
+
+        return Futures.immediateFailedScheduledFuture(createPostFailedException());
+    }
+
+    @Override
+    @NonNull
+    public ScheduledFuture<?> scheduleAtFixedRate(
+            @NonNull Runnable command,
+            long initialDelay,
+            long period,
+            @NonNull TimeUnit unit) {
+        throw new UnsupportedOperationException(
+                HandlerScheduledExecutorService.class.getSimpleName()
+                        + " does not yet support fixed-rate scheduling.");
+    }
+
+    @Override
+    @NonNull
+    public ScheduledFuture<?> scheduleWithFixedDelay(@NonNull Runnable command, long initialDelay,
+            long delay, @NonNull TimeUnit unit) {
+        throw new UnsupportedOperationException(
+                HandlerScheduledExecutorService.class.getSimpleName()
+                        + " does not yet support fixed-delay scheduling.");
+    }
+
+    @Override
+    public void shutdown() {
+        throw new UnsupportedOperationException(
+                HandlerScheduledExecutorService.class.getSimpleName()
+                        + " cannot be shut down. Use Looper.quitSafely().");
+    }
+
+    @Override
+    @NonNull
+    public List<Runnable> shutdownNow() {
+        throw new UnsupportedOperationException(
+                HandlerScheduledExecutorService.class.getSimpleName()
+                        + " cannot be shut down. Use Looper.quitSafely().");
+    }
+
+    @Override
+    public boolean isShutdown() {
+        return false;
+    }
+
+    @Override
+    public boolean isTerminated() {
+        return false;
+    }
+
+    @Override
+    public boolean awaitTermination(long timeout, @NonNull TimeUnit unit) {
+        throw new UnsupportedOperationException(
+                HandlerScheduledExecutorService.class.getSimpleName()
+                        + " cannot be shut down. Use Looper.quitSafely().");
+    }
+
+    @Override
+    public void execute(@NonNull Runnable command) {
+        if (!mHandler.post(command)) {
+            throw createPostFailedException();
+        }
+    }
+
+    private RejectedExecutionException createPostFailedException() {
+        return new RejectedExecutionException(mHandler + " is shutting down");
+    }
+
+    private static class HandlerScheduledFuture<V> implements RunnableScheduledFuture<V> {
+
+        final AtomicReference<CallbackToFutureAdapter.Completer<V>>
+                mCompleter = new AtomicReference<>(null);
+        private final long mRunAtMillis;
+        private final Callable<V> mTask;
+        private final ListenableFuture<V> mDelegate;
+
+        HandlerScheduledFuture(final Handler handler, long runAtMillis, final Callable<V> task) {
+            mRunAtMillis = runAtMillis;
+            mTask = task;
+            mDelegate = CallbackToFutureAdapter.getFuture(
+                    new CallbackToFutureAdapter.Resolver<V>() {
+
+                        @Override
+                        public Object attachCompleter(
+                                @NonNull CallbackToFutureAdapter.Completer<V> completer) throws
+                                RejectedExecutionException {
+
+                            completer.addCancellationListener(new Runnable() {
+                                @Override
+                                public void run() {
+                                    // Remove the completer if we're cancelled so the task won't
+                                    // run.
+                                    if (mCompleter.getAndSet(null) != null) {
+                                        handler.removeCallbacks(HandlerScheduledFuture.this);
+                                    }
+                                }
+                            }, CameraExecutors.directExecutor());
+
+                            mCompleter.set(completer);
+                            return "HandlerScheduledFuture-" + task.toString();
+                        }
+                    });
+        }
+
+        @Override
+        public boolean isPeriodic() {
+            return false;
+        }
+
+        @Override
+        public long getDelay(TimeUnit unit) {
+            return unit.convert(mRunAtMillis - System.currentTimeMillis(),
+                    TimeUnit.MILLISECONDS);
+        }
+
+        @Override
+        public int compareTo(Delayed o) {
+            return Long.compare(getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
+        }
+
+        @Override
+        public void run() {
+            // If completer is null, it has already run or is cancelled.
+            CallbackToFutureAdapter.Completer<V> completer = mCompleter.getAndSet(null);
+            if (completer != null) {
+                try {
+                    completer.set(mTask.call());
+                } catch (Exception e) {
+                    completer.setException(e);
+                }
+            }
+        }
+
+        @Override
+        public boolean cancel(boolean mayInterruptIfRunning) {
+            return mDelegate.cancel(mayInterruptIfRunning);
+        }
+
+        @Override
+        public boolean isCancelled() {
+            return mDelegate.isCancelled();
+        }
+
+        @Override
+        public boolean isDone() {
+            return mDelegate.isDone();
+        }
+
+        @Override
+        public V get() throws ExecutionException, InterruptedException {
+            return mDelegate.get();
+        }
+
+        @Override
+        public V get(long timeout, @NonNull TimeUnit unit)
+                throws ExecutionException, InterruptedException, TimeoutException {
+            return mDelegate.get(timeout, unit);
+        }
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/MainThreadExecutor.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/MainThreadExecutor.java
new file mode 100644
index 0000000..3aed734
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/MainThreadExecutor.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.executor;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.RequiresApi;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
+
+/**
+ * Helper class for retrieving an {@link ScheduledExecutorService} which will post to the main
+ * thread.
+ *
+ * <p>Since {@link ScheduledExecutorService} implements {@link Executor}, this can also be used
+ * as a simple Executor.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+final class MainThreadExecutor {
+    private static volatile ScheduledExecutorService sInstance;
+
+    private MainThreadExecutor() {
+    }
+
+    static ScheduledExecutorService getInstance() {
+        if (sInstance != null) {
+            return sInstance;
+        }
+        synchronized (MainThreadExecutor.class) {
+            if (sInstance == null) {
+                sInstance = new HandlerScheduledExecutorService(
+                        new Handler(Looper.getMainLooper()));
+            }
+        }
+
+        return sInstance;
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/package-info.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/package-info.java
new file mode 100644
index 0000000..102a8c8
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/executor/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.previewview.internal.utils.executor;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/AsyncFunction.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/AsyncFunction.java
new file mode 100644
index 0000000..1480207
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/AsyncFunction.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.futures;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+
+/**
+ * Cloned from concurrent-futures package in Guava to AndroidX namespace since we would need
+ * ListenableFuture related implementation but not want to include whole Guava library.
+ *
+ * Transforms a value, possibly asynchronously. For an example usage and more information, see
+ * {@link Futures#transformAsync(ListenableFuture, AsyncFunction, Executor)}.
+ *
+ * @author Chris Povirk
+ * @since 11.0
+ * @param <I>
+ * @param <O>
+ *
+ */
+@FunctionalInterface
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public interface AsyncFunction<I, O> {
+    /**
+     * Returns an output {@code Future} to use in place of the given {@code input}. The output
+     * {@code Future} need not be {@linkplain Future#isDone done}, making {@code AsyncFunction}
+     * suitable for asynchronous derivations.
+     *
+     * <p>Throwing an exception from this method is equivalent to returning a failing {@code
+     * Future}.
+     */
+    ListenableFuture<O> apply(@Nullable I input) throws Exception;
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ChainingListenableFuture.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ChainingListenableFuture.java
new file mode 100644
index 0000000..1f0fef7
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ChainingListenableFuture.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.futures;
+
+import static androidx.camera.previewview.internal.utils.futures.Futures.getUninterruptibly;
+import static androidx.core.util.Preconditions.checkNotNull;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.internal.utils.executor.CameraExecutors;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ *  The Class is based on the ChainingListenableFuture in Guava, the constructor of FutureChain
+ *  will use the CallbackToFutureAdapter instead of the AbstractFuture.
+ *
+ * An implementation of {@code ListenableFuture} that also implements
+ * {@code Runnable} so that it can be used to nest ListenableFutures.
+ * Once the passed-in {@code ListenableFuture} is complete, it calls the
+ * passed-in {@code Function} to generate the result.
+ *
+ * <p>If the Function throws any checked exceptions, they should be wrapped
+ * in a {@code UndeclaredThrowableException} so that this class can get access to the cause.
+ *
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+class ChainingListenableFuture<I, O> extends FutureChain<O> implements Runnable {
+    @Nullable
+    private AsyncFunction<? super I, ? extends O> mFunction;
+    private final BlockingQueue<Boolean> mMayInterruptIfRunningChannel =
+            new LinkedBlockingQueue<>(1);
+    private final CountDownLatch mOutputCreated = new CountDownLatch(1);
+    @Nullable
+    private ListenableFuture<? extends I> mInputFuture;
+    @Nullable
+    volatile ListenableFuture<? extends O> mOutputFuture;
+
+    ChainingListenableFuture(
+            @NonNull AsyncFunction<? super I, ? extends O> function,
+            @NonNull ListenableFuture<? extends I> inputFuture) {
+        super();
+        mFunction = checkNotNull(function);
+        mInputFuture = checkNotNull(inputFuture);
+    }
+
+    /**
+     * Delegate the get() to the input and output mFutures, in case
+     * their implementations defer starting computation until their
+     * own get() is invoked.
+     */
+    @Override
+    @Nullable
+    public O get() throws InterruptedException, ExecutionException {
+        if (!isDone()) {
+            // Invoking get on the mInputFuture will ensure our own run()
+            // method below is invoked as a listener when mInputFuture sets
+            // its value.  Therefore when get() returns we should then see
+            // the mOutputFuture be created.
+            ListenableFuture<? extends I> inputFuture = mInputFuture;
+            if (inputFuture != null) {
+                inputFuture.get();
+            }
+
+            // If our listener was scheduled to run on an executor we may
+            // need to wait for our listener to finish running before the
+            // mOutputFuture has been constructed by the mFunction.
+            mOutputCreated.await();
+
+            // Like above with the mInputFuture, we have a listener on
+            // the mOutputFuture that will set our own value when its
+            // value is set.  Invoking get will ensure the output can
+            // complete and invoke our listener, so that we can later
+            // get the mResult.
+            ListenableFuture<? extends O> outputFuture = mOutputFuture;
+            if (outputFuture != null) {
+                outputFuture.get();
+            }
+        }
+        return super.get();
+    }
+
+    /**
+     * Delegate the get() to the input and output mFutures, in case
+     * their implementations defer starting computation until their
+     * own get() is invoked.
+     */
+    @Override
+    @Nullable
+    public O get(long timeout, @NonNull TimeUnit unit) throws TimeoutException,
+            ExecutionException, InterruptedException {
+        if (!isDone()) {
+            // Use a single time unit so we can decrease mRemaining timeout
+            // as we wait for various phases to complete.
+            if (unit != NANOSECONDS) {
+                timeout = NANOSECONDS.convert(timeout, unit);
+                unit = NANOSECONDS;
+            }
+
+            // Invoking get on the mInputFuture will ensure our own run()
+            // method below is invoked as a listener when mInputFuture sets
+            // its value.  Therefore when get() returns we should then see
+            // the mOutputFuture be created.
+            ListenableFuture<? extends I> inputFuture = mInputFuture;
+            if (inputFuture != null) {
+                long start = System.nanoTime();
+                inputFuture.get(timeout, unit);
+                timeout -= Math.max(0, System.nanoTime() - start);
+            }
+
+            // If our listener was scheduled to run on an executor we may
+            // need to wait for our listener to finish running before the
+            // mOutputFuture has been constructed by the mFunction.
+            long start = System.nanoTime();
+            if (!mOutputCreated.await(timeout, unit)) {
+                throw new TimeoutException();
+            }
+            timeout -= Math.max(0, System.nanoTime() - start);
+
+            // Like above with the mInputFuture, we have a listener on
+            // the mOutputFuture that will set our own value when its
+            // value is set.  Invoking get will ensure the output can
+            // complete and invoke our listener, so that we can later
+            // get the mResult.
+            ListenableFuture<? extends O> outputFuture = mOutputFuture;
+            if (outputFuture != null) {
+                outputFuture.get(timeout, unit);
+            }
+        }
+        return super.get(timeout, unit);
+    }
+
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+        /*
+         * Our additional cancellation work needs to occur even if
+         * !mayInterruptIfRunning, so we can't move it into interruptTask().
+         */
+        if (super.cancel(mayInterruptIfRunning)) {
+            // This should never block since only one thread is allowed to cancel
+            // this Future.
+            putUninterruptibly(mMayInterruptIfRunningChannel, mayInterruptIfRunning);
+            cancel(mInputFuture, mayInterruptIfRunning);
+            cancel(mOutputFuture, mayInterruptIfRunning);
+            return true;
+        }
+        return false;
+    }
+
+    private void cancel(@Nullable Future<?> future,
+            boolean mayInterruptIfRunning) {
+        if (future != null) {
+            future.cancel(mayInterruptIfRunning);
+        }
+    }
+
+    @Override
+    public void run() {
+        try {
+            I sourceResult;
+            try {
+                sourceResult = getUninterruptibly(mInputFuture);
+            } catch (CancellationException e) {
+                // Cancel this future and return.
+                // At this point, mInputFuture is cancelled and mOutputFuture doesn't
+                // exist, so the value of mayInterruptIfRunning is irrelevant.
+                cancel(false);
+                return;
+            } catch (ExecutionException e) {
+                // Set the cause of the exception as this future's exception
+                setException(e.getCause());
+                return;
+            }
+
+            final ListenableFuture<? extends O> outputFuture = mOutputFuture =
+                    mFunction.apply(sourceResult);
+            if (isCancelled()) {
+                // Handles the case where cancel was called while the mFunction was
+                // being applied.
+                // There is a gap in cancel(boolean) between calling sync.cancel()
+                // and storing the value of mayInterruptIfRunning, so this thread
+                // needs to block, waiting for that value.
+                outputFuture.cancel(takeUninterruptibly(mMayInterruptIfRunningChannel));
+                mOutputFuture = null;
+                return;
+            }
+            outputFuture.addListener(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        // Here it would have been nice to have had an
+                        // UninterruptibleListenableFuture, but we don't want to start a
+                        // combinatorial explosion of interfaces, so we have to make do.
+                        set(getUninterruptibly(outputFuture));
+                    } catch (CancellationException e) {
+                        // Cancel this future and return.
+                        // At this point, mInputFuture and mOutputFuture are done, so the
+                        // value of mayInterruptIfRunning is irrelevant.
+                        cancel(false);
+                        return;
+                    } catch (ExecutionException e) {
+                        // Set the cause of the exception as this future's exception
+                        setException(e.getCause());
+                    } finally {
+                        // Don't pin inputs beyond completion
+                        ChainingListenableFuture.this.mOutputFuture = null;
+                    }
+                }
+            }, CameraExecutors.directExecutor());
+        } catch (UndeclaredThrowableException e) {
+            // Set the cause of the exception as this future's exception
+            setException(e.getCause());
+        } catch (Exception e) {
+            // This exception is irrelevant in this thread, but useful for the
+            // client
+            setException(e);
+        } catch (Error e) {
+            // Propagate errors up ASAP - our superclass will rethrow the error
+            setException(e);
+        } finally {
+            // Don't pin inputs beyond completion
+            mFunction = null;
+            mInputFuture = null;
+            // Allow our get routines to examine mOutputFuture now.
+            mOutputCreated.countDown();
+        }
+    }
+
+    /**
+     * Invokes {@code queue.}{@link BlockingQueue#take() take()} uninterruptibly.
+     */
+    private <E> E takeUninterruptibly(@NonNull BlockingQueue<E> queue) {
+        boolean interrupted = false;
+        try {
+            while (true) {
+                try {
+                    return queue.take();
+                } catch (InterruptedException e) {
+                    interrupted = true;
+                }
+            }
+        } finally {
+            if (interrupted) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    /**
+     * Invokes {@code queue.}{@link BlockingQueue#put(Object) put(element)}
+     * uninterruptibly.
+     */
+    private <E> void putUninterruptibly(@NonNull BlockingQueue<E> queue, @NonNull E element) {
+        boolean interrupted = false;
+        try {
+            while (true) {
+                try {
+                    queue.put(element);
+                    return;
+                } catch (InterruptedException e) {
+                    interrupted = true;
+                }
+            }
+        } finally {
+            if (interrupted) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/FutureCallback.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/FutureCallback.java
new file mode 100644
index 0000000..901b0aa
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/FutureCallback.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.futures;
+
+import androidx.annotation.RequiresApi;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+/**
+ * Cloned from concurrent-futures package in Guava to AndroidX namespace since we would need
+ * ListenableFuture related implementation but not want to include whole Guava library.
+ *
+ * A callback for accepting the results of a {@link Future} computation
+ * asynchronously.
+ *
+ * <p>To attach to a {@link ListenableFuture} use {@link Futures#addCallback}.
+ *
+ * @author Anthony Zana
+ * @since 10.0
+ * @param <V>
+ *
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public interface FutureCallback<V> {
+    /** Invoked with the result of the {@code Future} computation when it is successful. */
+    void onSuccess(V result);
+
+    /**
+     * Invoked when a {@code Future} computation fails or is canceled.
+     *
+     * <p>If the future's {@link Future#get() get} method throws an {@link ExecutionException}, then
+     * the cause is passed to this method. Any other thrown object is passed unaltered.
+     */
+    void onFailure(Throwable t);
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/FutureChain.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/FutureChain.java
new file mode 100644
index 0000000..397549d
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/FutureChain.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.futures;
+
+import static androidx.core.util.Preconditions.checkNotNull;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.arch.core.util.Function;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.util.Preconditions;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * A {@link ListenableFuture} that supports chains of operations. For example:
+ *
+ * <pre>{@code
+ * ListenableFuture<Boolean> adminIsLoggedIn =
+ *     FutureChain.from(usersDatabase.getAdminUser())
+ *         .transform(User::getId, directExecutor())
+ *         .transform(ActivityService::isLoggedIn, threadPool);
+ * }</pre>
+ * @param <V>
+ *
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class FutureChain<V> implements ListenableFuture<V> {
+    @NonNull
+    private final ListenableFuture<V> mDelegate;
+    @Nullable
+    CallbackToFutureAdapter.Completer<V> mCompleter;
+
+    /**
+     * Converts the given {@code ListenableFuture} to an equivalent {@code FutureChain}.
+     *
+     * <p>If the given {@code ListenableFuture} is already a {@code FutureChain}, it is returned
+     * directly. If not, it is wrapped in a {@code FutureChain} that delegates all calls to the
+     * original {@code ListenableFuture}.
+     *
+     * @return directly if input a FutureChain or a ListenableFuture wrapped by FutureChain.
+     */
+    @NonNull
+    public static <V> FutureChain<V> from(@NonNull ListenableFuture<V> future) {
+        return future instanceof FutureChain
+                ? (FutureChain<V>) future : new FutureChain<V>(future);
+    }
+
+    /**
+     * Returns a new {@code Future} whose result is derived from the result of this {@code
+     * Future}.
+     * If this input {@code Future} fails, the returned {@code Future} fails with the same
+     * exception (and the function is not invoked).
+     *
+     * @param function A Function to transform the results of this future to the results of the
+     *                 returned future.
+     * @param executor Executor to run the function in.
+     * @return A future that holds result of the transformation.
+     */
+    @NonNull
+    public final <T> FutureChain<T> transform(@NonNull Function<? super V, T> function,
+            @NonNull Executor executor) {
+        return (FutureChain<T>) Futures.transform(this, function, executor);
+    }
+
+    FutureChain(@NonNull ListenableFuture<V> delegate) {
+        mDelegate = checkNotNull(delegate);
+    }
+
+    FutureChain() {
+        mDelegate = CallbackToFutureAdapter.getFuture(
+                new CallbackToFutureAdapter.Resolver<V>() {
+                    @Override
+                    public Object attachCompleter(
+                            @NonNull CallbackToFutureAdapter.Completer<V> completer) {
+                        Preconditions.checkState(mCompleter == null,
+                                "The result can only set once!");
+                        mCompleter = completer;
+                        return "FutureChain[" + FutureChain.this + "]";
+                    }
+                });
+    }
+
+    @Override
+    public void addListener(@NonNull Runnable listener, @NonNull Executor executor) {
+        mDelegate.addListener(listener, executor);
+    }
+
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+        return mDelegate.cancel(mayInterruptIfRunning);
+    }
+
+    @Override
+    public boolean isCancelled() {
+        return mDelegate.isCancelled();
+    }
+
+    @Override
+    public boolean isDone() {
+        return mDelegate.isDone();
+    }
+
+
+    @Nullable
+    @Override
+    public V get() throws InterruptedException, ExecutionException {
+        return mDelegate.get();
+    }
+
+    @Nullable
+    @Override
+    public V get(long timeout, @NonNull TimeUnit unit)
+            throws InterruptedException, ExecutionException, TimeoutException {
+        return mDelegate.get(timeout, unit);
+    }
+
+    boolean set(@Nullable V value) {
+        if (mCompleter != null) {
+            return mCompleter.set(value);
+        }
+
+        return false;
+    }
+
+    boolean setException(@NonNull Throwable throwable) {
+        if (mCompleter != null) {
+            return mCompleter.setException(throwable);
+        }
+
+        return false;
+    }
+
+}
+
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/Futures.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/Futures.java
new file mode 100644
index 0000000..1e0c82d
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/Futures.java
@@ -0,0 +1,398 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.futures;
+
+import static androidx.core.util.Preconditions.checkNotNull;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.arch.core.util.Function;
+import androidx.camera.previewview.internal.utils.executor.CameraExecutors;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.util.Preconditions;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledFuture;
+
+/**
+ * Utility class for generating specific implementations of {@link ListenableFuture}.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class Futures {
+
+    /**
+     * Returns an implementation of {@link ListenableFuture} which immediately contains a result.
+     *
+     * @param value The result that is immediately set on the future.
+     * @param <V>   The type of the result.
+     * @return A future which immediately contains the result.
+     */
+    @NonNull
+    public static <V> ListenableFuture<V> immediateFuture(@Nullable V value) {
+        if (value == null) {
+            return ImmediateFuture.nullFuture();
+        }
+
+        return new ImmediateFuture.ImmediateSuccessfulFuture<>(value);
+    }
+
+    /**
+     * Returns an implementation of {@link ScheduledFuture} which immediately contains an
+     * exception that will be thrown by {@link Future#get()}.
+     *
+     * @param cause The cause of the {@link ExecutionException} that will be thrown by
+     * {@link Future#get()}.
+     * @param <V>   The type of the result.
+     * @return A future which immediately contains an exception.
+     */
+    @NonNull
+    public static <V> ScheduledFuture<V> immediateFailedScheduledFuture(@NonNull Throwable cause) {
+        return new ImmediateFuture.ImmediateFailedScheduledFuture<>(cause);
+    }
+
+    /**
+     * Returns a new {@code Future} whose result is asynchronously derived from the result
+     * of the given {@code Future}. If the given {@code Future} fails, the returned {@code Future}
+     * fails with the same exception (and the function is not invoked).
+     *
+     * @param input    The future to transform
+     * @param function A function to transform the result of the input future to the result of the
+     *                 output future
+     * @param executor Executor to run the function in.
+     * @return A future that holds result of the function (if the input succeeded) or the original
+     * input's failure (if not)
+     */
+    @NonNull
+    public static <I, O> ListenableFuture<O> transformAsync(
+            @NonNull ListenableFuture<I> input,
+            @NonNull AsyncFunction<? super I, ? extends O> function,
+            @NonNull Executor executor) {
+        ChainingListenableFuture<I, O> output = new ChainingListenableFuture<I, O>(function, input);
+        input.addListener(output, executor);
+        return output;
+    }
+
+    /**
+     * Returns a new {@code Future} whose result is derived from the result of the given {@code
+     * Future}. If {@code input} fails, the returned {@code Future} fails with the same
+     * exception (and the function is not invoked)
+     *
+     * @param input    The future to transform
+     * @param function A function to transform the results of the provided future to the results of
+     *                 the returned future.
+     * @param executor Executor to run the function in.
+     * @return A future that holds result of the transformation.
+     */
+    @NonNull
+    public static <I, O> ListenableFuture<O> transform(
+            @NonNull ListenableFuture<I> input,
+            @NonNull Function<? super I, ? extends O> function,
+            @NonNull Executor executor) {
+        checkNotNull(function);
+        return transformAsync(input, new AsyncFunction<I, O>() {
+
+            @Override
+            public ListenableFuture<O> apply(I input) {
+                return immediateFuture(function.apply(input));
+            }
+        }, executor);
+    }
+
+    private static final Function<?, ?> IDENTITY_FUNCTION = new Function<Object, Object>() {
+        @Override
+        public Object apply(Object input) {
+            return input;
+        }
+    };
+
+    /**
+     * Propagates the result of the given {@code ListenableFuture} to the given {@link
+     * CallbackToFutureAdapter.Completer} directly.
+     *
+     * <p>If {@code input} fails, the failure will be propagated to the {@code completer}.
+     *
+     * @param input     The future being propagated.
+     * @param completer The completer which will receive the result of the provided future.
+     */
+    @SuppressWarnings("LambdaLast") // ListenableFuture not needed for SAM conversion
+    public static <V> void propagate(
+            @NonNull ListenableFuture<V> input,
+            @NonNull final CallbackToFutureAdapter.Completer<V> completer) {
+        @SuppressWarnings({"unchecked"}) // Input of function is same as output
+                Function<? super V, ? extends V> identityTransform =
+                (Function<? super V, ? extends V>) IDENTITY_FUNCTION;
+        // Use direct executor here since function is just unpacking the output and should be quick
+        propagateTransform(input, identityTransform, completer, CameraExecutors.directExecutor());
+    }
+
+    /**
+     * Propagates the result of the given {@code ListenableFuture} to the given {@link
+     * CallbackToFutureAdapter.Completer} by applying the provided transformation function.
+     *
+     * <p>If {@code input} fails, the failure will be propagated to the {@code completer} (and the
+     * function is not invoked)
+     *
+     * @param input     The future to transform.
+     * @param function  A function to transform the results of the provided future to the results of
+     *                  the provided completer.
+     * @param completer The completer which will receive the result of the provided future.
+     * @param executor  Executor to run the function in.
+     */
+    public static <I, O> void propagateTransform(
+            @NonNull final ListenableFuture<I> input,
+            @NonNull final Function<? super I, ? extends O> function,
+            @NonNull final CallbackToFutureAdapter.Completer<O> completer,
+            @NonNull Executor executor) {
+        propagateTransform(true, input, function, completer, executor);
+    }
+
+    /**
+     * Propagates the result of the given {@code ListenableFuture} to the given {@link
+     * CallbackToFutureAdapter.Completer} by applying the provided transformation function.
+     *
+     * <p>If {@code input} fails, the failure will be propagated to the {@code completer} (and the
+     * function is not invoked)
+     *
+     * @param propagateCancellation {@code true} to propagate the cancellation from completer to
+     *                              input future.
+     * @param input                 The future to transform.
+     * @param function              A function to transform the results of the provided future to
+     *                              the results of the provided completer.
+     * @param completer             The completer which will receive the result of the provided
+     *                              future.
+     * @param executor              Executor to run the function in.
+     */
+    private static <I, O> void propagateTransform(
+            boolean propagateCancellation,
+            @NonNull final ListenableFuture<I> input,
+            @NonNull final Function<? super I, ? extends O> function,
+            @NonNull final CallbackToFutureAdapter.Completer<O> completer,
+            @NonNull Executor executor) {
+        Preconditions.checkNotNull(input);
+        Preconditions.checkNotNull(function);
+        Preconditions.checkNotNull(completer);
+        Preconditions.checkNotNull(executor);
+
+        addCallback(input, new FutureCallback<I>() {
+            @Override
+            public void onSuccess(@Nullable I result) {
+                try {
+                    completer.set(function.apply(result));
+                } catch (Throwable t) {
+                    completer.setException(t);
+                }
+            }
+
+            @Override
+            public void onFailure(Throwable t) {
+                completer.setException(t);
+            }
+        }, executor);
+
+        if (propagateCancellation) {
+            // Propagate cancellation from completer to input future
+            completer.addCancellationListener(new Runnable() {
+                @Override
+                public void run() {
+                    input.cancel(true);
+                }
+            }, CameraExecutors.directExecutor());
+        }
+    }
+
+    /**
+     * Returns a {@code ListenableFuture} whose result is set from the supplied future when it
+     * completes.
+     *
+     * <p>Cancelling the supplied future will also cancel the returned future, but
+     * cancelling the returned future will have no effect on the supplied future.
+     */
+    @NonNull
+    public static <V> ListenableFuture<V> nonCancellationPropagating(
+            @NonNull ListenableFuture<V> future) {
+        Preconditions.checkNotNull(future);
+
+        if (future.isDone()) {
+            return future;
+        }
+
+        ListenableFuture<V> output = CallbackToFutureAdapter.getFuture(
+                completer -> {
+                    @SuppressWarnings({"unchecked"}) // Input of function is same as output
+                            Function<? super V, ? extends V> identityTransform =
+                            (Function<? super V, ? extends V>) IDENTITY_FUNCTION;
+                    propagateTransform(false, future, identityTransform, completer,
+                            CameraExecutors.directExecutor());
+                    return "nonCancellationPropagating[" + future + "]";
+                });
+        return output;
+    }
+
+    /**
+     * Creates a new {@code ListenableFuture} whose value is a list containing the values of all its
+     * successful input futures. The list of results is in the same order as the input list, and if
+     * any of the provided futures fails or is canceled, its corresponding position will contain
+     * {@code null} (which is indistinguishable from the future having a successful value of {@code
+     * null}).
+     *
+     * <p>Canceling this future will attempt to cancel all the component futures.
+     *
+     * @param futures futures to combine
+     * @return a future that provides a list of the results of the component futures
+     */
+    @NonNull
+    public static <V> ListenableFuture<List<V>> successfulAsList(
+            @NonNull Collection<? extends ListenableFuture<? extends V>> futures) {
+        return new ListFuture<V>(new ArrayList<>(futures), false,
+                CameraExecutors.directExecutor());
+    }
+
+    /**
+     * Creates a new {@code ListenableFuture} whose value is a list containing the values of all its
+     * input futures, if all succeed.
+     *
+     * <p>The list of results is in the same order as the input list.
+     *
+     * <p>Canceling this future will attempt to cancel all the component futures, and if any of the
+     * provided futures fails or is canceled, this one is, too.
+     *
+     * @param futures futures to combine
+     * @return a future that provides a list of the results of the component futures
+     */
+    @NonNull
+    public static <V> ListenableFuture<List<V>> allAsList(
+            @NonNull Collection<? extends ListenableFuture<? extends V>> futures) {
+        return new ListFuture<V>(new ArrayList<>(futures), true, CameraExecutors.directExecutor());
+    }
+
+    /**
+     * Registers separate success and failure callbacks to be run when the {@code Future}'s
+     * computation is {@linkplain Future#isDone() complete} or, if the
+     * computation is already complete, immediately.
+     *
+     * @param future   The future attach the callback to.
+     * @param callback The callback to invoke when {@code future} is completed.
+     * @param executor The executor to run {@code callback} when the future completes.
+     */
+    public static <V> void addCallback(
+            @NonNull final ListenableFuture<V> future,
+            @NonNull final FutureCallback<? super V> callback,
+            @NonNull Executor executor) {
+        Preconditions.checkNotNull(callback);
+        future.addListener(new CallbackListener<V>(future, callback), executor);
+    }
+
+    /**
+     * See {@link #addCallback(ListenableFuture, FutureCallback, Executor)} for behavioral notes.
+     */
+    private static final class CallbackListener<V> implements Runnable {
+        final Future<V> mFuture;
+        final FutureCallback<? super V> mCallback;
+
+        CallbackListener(Future<V> future, FutureCallback<? super V> callback) {
+            mFuture = future;
+            mCallback = callback;
+        }
+
+        @Override
+        public void run() {
+            final V value;
+            try {
+                value = getDone(mFuture);
+            } catch (ExecutionException e) {
+                mCallback.onFailure(e.getCause());
+                return;
+            } catch (RuntimeException | Error e) {
+                mCallback.onFailure(e);
+                return;
+            }
+            mCallback.onSuccess(value);
+        }
+
+        @NonNull
+        @Override
+        public String toString() {
+            return getClass().getSimpleName() + "," + mCallback;
+        }
+    }
+
+    /**
+     * Returns the result of the input {@code Future}, which must have already completed.
+     *
+     * <p>The benefits of this method are twofold. First, the name "getDone" suggests to readers
+     * that the {@code Future} is already done. Second, if buggy code calls {@code getDone} on a
+     * {@code Future} that is still pending, the program will throw instead of block.
+     *
+     * @throws ExecutionException    if the {@code Future} failed with an exception
+     * @throws CancellationException if the {@code Future} was cancelled
+     * @throws IllegalStateException if the {@code Future} is not done
+     */
+    @Nullable
+    public static <V> V getDone(@NonNull Future<V> future) throws ExecutionException {
+        /*
+         * We throw IllegalStateException, since the call could succeed later. Perhaps we
+         * "should" throw IllegalArgumentException, since the call could succeed with a different
+         * argument. Those exceptions' docs suggest that either is acceptable. Google's Java
+         * Practices page recommends IllegalArgumentException here, in part to keep its
+         * recommendation simple: Static methods should throw IllegalStateException only when
+         * they use static state.
+         *
+         * Why do we deviate here? The answer: We want for fluentFuture.getDone() to throw the same
+         * exception as Futures.getDone(fluentFuture).
+         */
+        Preconditions.checkState(future.isDone(), "Future was expected to be done, " + future);
+        return getUninterruptibly(future);
+    }
+
+    /**
+     * Invokes {@code Future.}{@link Future#get() get()} uninterruptibly.
+     *
+     * @throws ExecutionException    if the computation threw an exception
+     * @throws CancellationException if the computation was cancelled
+     */
+    @Nullable
+    public static <V> V getUninterruptibly(@NonNull Future<V> future) throws ExecutionException {
+        boolean interrupted = false;
+        try {
+            while (true) {
+                try {
+                    return future.get();
+                } catch (InterruptedException e) {
+                    interrupted = true;
+                }
+            }
+        } finally {
+            if (interrupted) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    /**
+     * Should not be instantiated.
+     */
+    private Futures() {}
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ImmediateFuture.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ImmediateFuture.java
new file mode 100644
index 0000000..8d4154c
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ImmediateFuture.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.futures;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.internal.utils.Logger;
+import androidx.core.util.Preconditions;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.Delayed;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * An implementation of {@link ListenableFuture} which immediately contains a result.
+ *
+ * <p>This implementation is based off of the Guava ImmediateSuccessfulFuture class.
+ * @param <V> The type of the value stored in the future.
+ *
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+abstract class ImmediateFuture<V> implements ListenableFuture<V> {
+
+    private static final String TAG = "ImmediateFuture";
+
+    /**
+     * Returns a future that contains a null value.
+     *
+     * <p>This should be used any time a null value is needed as it uses a static ListenableFuture
+     * that contains null, and thus will not allocate.
+     */
+    public static <V> ListenableFuture<V> nullFuture() {
+        @SuppressWarnings({"unchecked", "rawtypes"}) // Safe since null can be cast to any type
+        ListenableFuture<V> typedNull = (ListenableFuture) ImmediateSuccessfulFuture.NULL_FUTURE;
+        return typedNull;
+    }
+
+    @Override
+    public void addListener(@NonNull Runnable listener, @NonNull Executor executor) {
+        Preconditions.checkNotNull(listener);
+        Preconditions.checkNotNull(executor);
+
+        try {
+            executor.execute(listener);
+        } catch (RuntimeException e) {
+            // ListenableFuture does not throw runtime exceptions, so swallow the exception and
+            // log it here.
+            Logger.e(TAG, "Experienced RuntimeException while attempting to notify " + listener
+                    + " on Executor " + executor, e);
+        }
+
+    }
+
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+        return false;
+    }
+
+    @Override
+    public boolean isCancelled() {
+        return false;
+    }
+
+    @Override
+    public boolean isDone() {
+        return true;
+    }
+
+    @Override
+    @Nullable
+    public abstract V get() throws ExecutionException;
+
+    @Override
+    @Nullable
+    public V get(long timeout, @NonNull TimeUnit unit) throws ExecutionException {
+        Preconditions.checkNotNull(unit);
+        return get();
+    }
+
+    static final class ImmediateSuccessfulFuture<V> extends ImmediateFuture<V> {
+
+        static final ImmediateFuture<Object> NULL_FUTURE =
+                new ImmediateSuccessfulFuture<>(null);
+
+        @Nullable
+        private final V mValue;
+
+        ImmediateSuccessfulFuture(@Nullable V value) {
+            mValue = value;
+        }
+
+
+        @Nullable
+        @Override
+        public V get() {
+            return mValue;
+        }
+
+        @NonNull
+        @Override
+        public String toString() {
+            // Behaviour analogous to AbstractResolvableFuture#toString().
+            return super.toString() + "[status=SUCCESS, result=[" + mValue + "]]";
+        }
+    }
+
+    static class ImmediateFailedFuture<V> extends ImmediateFuture<V> {
+
+        @NonNull
+        private final Throwable mCause;
+
+        ImmediateFailedFuture(@NonNull Throwable cause) {
+            mCause = cause;
+        }
+
+        @Nullable
+        @Override
+        public V get() throws ExecutionException {
+            throw new ExecutionException(mCause);
+        }
+
+        @Override
+        @NonNull
+        public String toString() {
+            // Behaviour analogous to AbstractResolvableFuture#toString().
+            return super.toString() + "[status=FAILURE, cause=[" + mCause + "]]";
+        }
+    }
+
+    static final class ImmediateFailedScheduledFuture<V> extends ImmediateFailedFuture<V> implements
+            ScheduledFuture<V> {
+
+        ImmediateFailedScheduledFuture(@NonNull Throwable cause) {
+            super(cause);
+        }
+
+        @Override
+        public long getDelay(@NonNull TimeUnit timeUnit) {
+            return 0;
+        }
+
+        @Override
+        public int compareTo(@NonNull Delayed delayed) {
+            return -1;
+        }
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ListFuture.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ListFuture.java
new file mode 100644
index 0000000..8387d7b
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/ListFuture.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.utils.futures;
+
+import static androidx.camera.previewview.internal.utils.futures.Futures.getUninterruptibly;
+import static androidx.core.util.Preconditions.checkNotNull;
+import static androidx.core.util.Preconditions.checkState;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.previewview.internal.utils.executor.CameraExecutors;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.util.Preconditions;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * The Class is based on the ListFuture in Guava and to use the CallbackToFutureAdapter instead
+ * of the AbstractFuture.
+ *
+ * Class that implements {@link Futures#allAsList(Collection)} and
+ * {@link Futures#successfulAsList(Collection)}.
+ * The idea is to create a (null-filled) List and register a listener with
+ * each component future to fill out the value in the List when that future
+ * completes.
+ *
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+class ListFuture<V> implements ListenableFuture<List<V>> {
+    @Nullable
+    List<? extends ListenableFuture<? extends V>> mFutures;
+    @Nullable
+    List<V> mValues;
+    private final boolean mAllMustSucceed;
+    @NonNull
+    private final AtomicInteger mRemaining;
+    @NonNull
+    private final ListenableFuture<List<V>> mResult;
+    CallbackToFutureAdapter.Completer<List<V>> mResultNotifier;
+
+    /**
+     * Constructor.
+     *
+     * @param futures          all the futures to build the list from
+     * @param allMustSucceed   whether a single failure or cancellation should
+     *                         propagate to this future
+     * @param listenerExecutor used to run listeners on all the passed in futures.
+     */
+    ListFuture(
+            @NonNull List<? extends ListenableFuture<? extends V>> futures,
+            boolean allMustSucceed, @NonNull Executor listenerExecutor) {
+        mFutures = checkNotNull(futures);
+        mValues = new ArrayList<>(futures.size());
+        mAllMustSucceed = allMustSucceed;
+        mRemaining = new AtomicInteger(futures.size());
+        mResult = CallbackToFutureAdapter.getFuture(
+                new CallbackToFutureAdapter.Resolver<List<V>>() {
+                    @Override
+                    public Object attachCompleter(
+                            @NonNull CallbackToFutureAdapter.Completer<List<V>> completer) {
+                        Preconditions.checkState(mResultNotifier == null,
+                                "The result can only set once!");
+                        mResultNotifier = completer;
+                        return "ListFuture[" + this + "]";
+                    }
+                });
+
+        init(listenerExecutor);
+    }
+
+    private void init(@NonNull Executor listenerExecutor) {
+        // First, schedule cleanup to execute when the Future is done.
+        addListener(new Runnable() {
+            @Override
+            public void run() {
+                // By now the mValues array has either been set as the Future's value,
+                // or (in case of failure) is no longer useful.
+                ListFuture.this.mValues = null;
+
+                // Let go of the memory held by other mFutures
+                ListFuture.this.mFutures = null;
+            }
+        }, CameraExecutors.directExecutor());
+
+        // Now begin the "real" initialization.
+
+        // Corner case: List is empty.
+        if (mFutures.isEmpty()) {
+            mResultNotifier.set(new ArrayList<>(mValues));
+            return;
+        }
+
+        // Populate the results list with null initially.
+        for (int i = 0; i < mFutures.size(); ++i) {
+            mValues.add(null);
+        }
+
+        // Register a listener on each Future in the list to update
+        // the state of this future.
+        // Note that if all the mFutures on the list are done prior to completing
+        // this loop, the last call to addListener() will callback to
+        // setOneValue(), transitively call our cleanup listener, and set
+        // mFutures to null.
+        // We store a reference to mFutures to avoid the NPE.
+        List<? extends ListenableFuture<? extends V>> localFutures = mFutures;
+        for (int i = 0; i < localFutures.size(); i++) {
+            final ListenableFuture<? extends V> listenable = localFutures.get(i);
+            final int index = i;
+            listenable.addListener(new Runnable() {
+                @Override
+                public void run() {
+                    setOneValue(index, listenable);
+                }
+            }, listenerExecutor);
+        }
+    }
+
+    /**
+     * Sets the value at the given index to that of the given future.
+     */
+    void setOneValue(int index, @NonNull Future<? extends V> future) {
+        List<V> localValues = mValues;
+        if (isDone() || localValues == null) {
+            // Some other future failed or has been cancelled, causing this one to
+            // also be cancelled or have an exception set. This should only happen
+            // if mAllMustSucceed is true.
+            checkState(mAllMustSucceed,
+                    "Future was done before all dependencies completed");
+            return;
+        }
+
+        try {
+            checkState(future.isDone(),
+                    "Tried to set value from future which is not done");
+            localValues.set(index, getUninterruptibly(future));
+        } catch (CancellationException e) {
+            if (mAllMustSucceed) {
+                // Set ourselves as cancelled. Let the input futures keep running
+                // as some of them may be used elsewhere.
+                // (Currently we don't override interruptTask, so
+                // mayInterruptIfRunning==false isn't technically necessary.)
+                cancel(false);
+            }
+        } catch (ExecutionException e) {
+            if (mAllMustSucceed) {
+                // As soon as the first one fails, throw the exception up.
+                // The mResult of all other inputs is then ignored.
+                mResultNotifier.setException(e.getCause());
+            }
+        } catch (RuntimeException e) {
+            if (mAllMustSucceed) {
+                mResultNotifier.setException(e);
+            }
+        } catch (Error e) {
+            // Propagate errors up ASAP - our superclass will rethrow the error
+            mResultNotifier.setException(e);
+        } finally {
+            int newRemaining = mRemaining.decrementAndGet();
+            checkState(newRemaining >= 0, "Less than 0 remaining futures");
+            if (newRemaining == 0) {
+                localValues = mValues;
+                if (localValues != null) {
+                    mResultNotifier.set(new ArrayList<>(localValues));
+                } else {
+                    checkState(isDone());
+                }
+            }
+        }
+    }
+
+    @Override
+    public void addListener(@NonNull Runnable listener, @NonNull Executor executor) {
+        mResult.addListener(listener, executor);
+    }
+
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+        if (mFutures != null) {
+            for (ListenableFuture<? extends V> f : mFutures) {
+                f.cancel(mayInterruptIfRunning);
+            }
+        }
+
+        return mResult.cancel(mayInterruptIfRunning);
+    }
+
+    @Override
+    public boolean isCancelled() {
+        return mResult.isCancelled();
+    }
+
+    @Override
+    public boolean isDone() {
+        return mResult.isDone();
+    }
+
+    @Override
+    @Nullable
+    public List<V> get() throws InterruptedException, ExecutionException {
+        callAllGets();
+
+        // This may still block in spite of the calls above, as the listeners may
+        // be scheduled for execution in other threads.
+        return mResult.get();
+    }
+
+    @Override
+    public List<V> get(long timeout, @NonNull TimeUnit unit)
+            throws InterruptedException, ExecutionException, TimeoutException {
+        return mResult.get(timeout, unit);
+    }
+
+    /**
+     * Calls the get method of all dependency futures to work around a bug in
+     * some ListenableFutures where the listeners aren't called until get() is
+     * called.
+     */
+    private void callAllGets() throws InterruptedException {
+        List<? extends ListenableFuture<? extends V>> oldFutures = mFutures;
+        if (oldFutures != null && !isDone()) {
+            for (ListenableFuture<? extends V> future : oldFutures) {
+                // We wait for a little while for the future, but if it's not done,
+                // we check that no other futures caused a cancellation or failure.
+                // This can introduce a delay of up to 10ms in reporting an exception.
+                while (!future.isDone()) {
+                    try {
+                        future.get();
+                    } catch (Error e) {
+                        throw e;
+                    } catch (InterruptedException e) {
+                        throw e;
+                    } catch (Throwable e) {
+                        // ExecutionException / CancellationException / RuntimeException
+                        if (mAllMustSucceed) {
+                            return;
+                        } else {
+                            continue;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/package-info.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/package-info.java
new file mode 100644
index 0000000..afa6af3
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/futures/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.previewview.internal.utils.futures;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/package-info.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/package-info.java
new file mode 100644
index 0000000..163ed87
--- /dev/null
+++ b/camera/camera-previewview/src/main/java/androidx/camera/previewview/internal/utils/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.previewview.internal.utils;
+
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurface.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurface.java
deleted file mode 100644
index 4cc98ac..0000000
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurface.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * 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 androidx.camera.previewview.surface;
-
-import android.view.Surface;
-import android.view.SurfaceView;
-import android.view.TextureView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.RestrictTo.Scope;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * A class for creating and tracking use of a {@link Surface} in an asynchronous manner.
- *
- * @hide
- */
-@RequiresApi(21)
-@RestrictTo(Scope.LIBRARY_GROUP)
-public abstract class PreviewSurface {
-
-    private static final String TAG = "PreviewSurface";
-
-    @NonNull
-    public final ListenableFuture<Surface> getSurface() {
-        return provideSurfaceAsync();
-    }
-
-    /**
-     * Close the surface.
-     *
-     * <p> After closing, the underlying surface resources can be safely released by
-     * {@link SurfaceView} or {@link TextureView} implementation.
-     */
-    public void close() {}
-
-    @NonNull
-    protected abstract ListenableFuture<Surface> provideSurfaceAsync();
-}
diff --git a/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurfaceRequest.java b/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurfaceRequest.java
deleted file mode 100644
index c7c92f2..0000000
--- a/camera/camera-previewview/src/main/java/androidx/camera/previewview/surface/PreviewSurfaceRequest.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright 2022 The Android Open Source Project
- *
- * 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 androidx.camera.previewview.surface;
-
-import android.annotation.SuppressLint;
-import android.graphics.SurfaceTexture;
-import android.util.Size;
-import android.view.Surface;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.RestrictTo.Scope;
-import androidx.concurrent.futures.CallbackToFutureAdapter;
-import androidx.core.util.Consumer;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * A completable, single-use request of a {@link Surface}.
- *
- * <p>Contains requirements for surface characteristics along with methods for completing the
- * request and listening for request cancellation.
- */
-@RequiresApi(21)
-public class PreviewSurfaceRequest {
-
-    private final boolean mIsFrontCamera;
-    @NonNull
-    private final Size mResolution;
-    @NonNull
-    private final PreviewSurface mInternalPreviewSurface;
-
-    @SuppressWarnings("WeakerAccess") /*synthetic accessor */
-    final ListenableFuture<Surface> mSurfaceFuture;
-
-    @SuppressWarnings("unused")
-    @Nullable
-    private Callback mCallback;
-
-    /**
-     * Creates a new surface request with the given resolution, the {@link Callback}.
-     */
-    public PreviewSurfaceRequest(
-            boolean isFrontCamera,
-            @NonNull Size resolution) {
-        super();
-        mResolution = resolution;
-        mIsFrontCamera = isFrontCamera;
-
-        // To ensure concurrency and ordering, operations are chained. Completion can only be
-        // triggered externally by the top-level completer (mSurfaceCompleter). The other future
-        // completers are only completed by callbacks set up within the constructor of this class
-        // to ensure correct ordering of events.
-
-        // Cancellation listener must be called last to ensure the result can be retrieved from
-        // the session listener.
-        String surfaceRequestString =
-                "SurfaceRequest[size: " + resolution + ", id: " + this.hashCode() + "]";
-        AtomicReference<CallbackToFutureAdapter.Completer<Surface>> surfaceCompleterRef =
-                new AtomicReference<>(null);
-        mSurfaceFuture = CallbackToFutureAdapter.getFuture(completer -> {
-            surfaceCompleterRef.set(completer);
-            return surfaceRequestString + "-Surface";
-        });
-        mInternalPreviewSurface = new PreviewSurface() {
-            @SuppressLint("SyntheticAccessor")
-            @NonNull
-            @Override
-            protected ListenableFuture<Surface> provideSurfaceAsync() {
-                return mSurfaceFuture;
-            }
-        };
-    }
-
-    /**
-     * Returns the resolution of the requested {@link Surface}.
-     *
-     * The surface which fulfills this request must have the resolution specified here in
-     * order to fulfill the resource requirements of the camera.
-     *
-     * @return The guaranteed supported resolution.
-     * @see SurfaceTexture#setDefaultBufferSize(int, int)
-     */
-    @NonNull
-    public Size getResolution() {
-        return mResolution;
-    }
-
-    /**
-     * Returns the status of camera lens facing.
-     *
-     * @return true if front camera, otherwise false.
-     */
-    public boolean isFrontCamera() {
-        return mIsFrontCamera;
-    }
-
-    /**
-     * Set surface request callback.
-     *
-     * @param callback {@link Callback}.
-     */
-    @SuppressLint("ExecutorRegistration")
-    public void setCallback(@NonNull Callback callback) {
-        mCallback = callback;
-    }
-
-    /**
-     * Clear surface request callback.
-     */
-    public void clearCallback() {
-        mCallback = null;
-    }
-
-    /**
-     * Returns the {@link PreviewSurface}.
-     * @return The surface returned for the request.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public PreviewSurface getPreviewSurface() {
-        return mInternalPreviewSurface;
-    }
-
-    /**
-     * Closes the {@link PreviewSurface} for safe release.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public void closePreviewSurface() {
-        mInternalPreviewSurface.close();
-    }
-
-    /**
-     * Completes the request for a {@link Surface} if it has not already been
-     * completed or cancelled.
-     *
-     * <p>Once the camera no longer needs the provided surface, the {@code resultListener} will be
-     * invoked with a {@link Result} containing {@link Result#RESULT_SURFACE_USED_SUCCESSFULLY}.
-     * At this point it is safe to release the surface and any underlying resources. Releasing
-     * the surface before receiving this signal may cause undesired behavior on lower API levels.
-     *
-     * <p>If the request is cancelled by the camera before successfully attaching the
-     * provided surface to the camera, then the {@code resultListener} will be invoked with a
-     * {@link Result} containing {@link Result#RESULT_REQUEST_CANCELLED}.
-     *
-     * <p>If the request was previously completed via {@link #willNotProvideSurface()}, then
-     * {@code resultListener} will be invoked with a {@link Result} containing
-     * {@link Result#RESULT_WILL_NOT_PROVIDE_SURFACE}.
-     *
-     * <p>Upon returning from this method, the surface request is guaranteed to be complete.
-     * However, only the {@code resultListener} provided to the first invocation of this method
-     * should be used to track when the provided {@link Surface} is no longer in use by the
-     * camera, as subsequent invocations will always invoke the {@code resultListener} with a
-     * {@link Result} containing {@link Result#RESULT_SURFACE_ALREADY_PROVIDED}.
-     *
-     * @param surface        The surface which will complete the request.
-     * @param executor       Executor used to execute the {@code resultListener}.
-     * @param resultListener Listener used to track how the surface is used by the camera in
-     *                       response to being provided by this method.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public void provideSurface(
-            @NonNull Surface surface,
-            @NonNull Executor executor,
-            @NonNull Consumer<Result> resultListener) {
-    }
-
-    /**
-     * Signals that the request will never be fulfilled.
-     *
-     * <p>This may be called in the case where the application may be shutting down and a
-     * surface will never be produced to fulfill the request.
-     *
-     * <p>This should always be called as soon as it is known that the request will not
-     * be fulfilled. Failure to complete the SurfaceRequest via {@code willNotProvideSurface()}
-     * or {@link #provideSurface(Surface, Executor, Consumer)} may cause long delays in shutting
-     * down the camera.
-     *
-     * <p>Upon returning from this method, the request is guaranteed to be complete, regardless
-     * of the return value. If the request was previously successfully completed by
-     * {@link #provideSurface(Surface, Executor, Consumer)}, invoking this method will return
-     * {@code false}, and will have no effect on how the surface is used by the camera.
-     *
-     * @return {@code true} if this call to {@code willNotProvideSurface()} successfully
-     * completes the request, i.e., the request has not already been completed via
-     * {@link #provideSurface(Surface, Executor, Consumer)} or by a previous call to
-     * {@code willNotProvideSurface()} and has not already been cancelled by the camera.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public boolean willNotProvideSurface() {
-        return true;
-    }
-
-    /**
-     * Result of providing a surface to a {@link PreviewSurfaceRequest} via
-     * {@link #provideSurface(Surface, Executor, Consumer)}.
-     *
-     * @hide
-     */
-    @AutoValue
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public abstract static class Result {
-
-        /**
-         * Possible result codes.
-         *
-         * @hide
-         */
-        @IntDef({RESULT_SURFACE_USED_SUCCESSFULLY, RESULT_REQUEST_CANCELLED, RESULT_INVALID_SURFACE,
-                RESULT_SURFACE_ALREADY_PROVIDED, RESULT_WILL_NOT_PROVIDE_SURFACE})
-        @Retention(RetentionPolicy.SOURCE)
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        public @interface ResultCode {
-        }
-
-        /**
-         * Provided surface was successfully used by the camera and eventually detached once no
-         * longer needed by the camera.
-         *
-         * <p>This result denotes that it is safe to release the {@link Surface} and any underlying
-         * resources.
-         *
-         * <p>For compatibility reasons, the {@link Surface} object should not be reused by
-         * future {@link PreviewSurfaceRequest SurfaceRequests}, and a new surface should be
-         * created instead.
-         */
-        public static final int RESULT_SURFACE_USED_SUCCESSFULLY = 0;
-
-        /**
-         * Provided surface was never attached to the camera due to the
-         * {@link PreviewSurfaceRequest} being cancelled by the camera.
-         *
-         * <p>It is safe to release or reuse {@link Surface}, assuming it was not previously
-         * attached to a camera via {@link #provideSurface(Surface, Executor, Consumer)}. If
-         * reusing the surface for a future surface request, it should be verified that the
-         * surface still matches the resolution specified by
-         * {@link PreviewSurfaceRequest#getResolution()}.
-         */
-        public static final int RESULT_REQUEST_CANCELLED = 1;
-
-        /**
-         * Provided surface could not be used by the camera.
-         *
-         * <p>This is likely due to the {@link Surface} being closed prematurely or the resolution
-         * of the surface not matching the resolution specified by
-         * {@link PreviewSurfaceRequest#getResolution()}.
-         */
-        public static final int RESULT_INVALID_SURFACE = 2;
-
-        /**
-         * Surface was not attached to the camera through this invocation of
-         * {@link #provideSurface(Surface, Executor, Consumer)} due to the {@link PreviewSurfaceRequest}
-         * already being complete with a surface.
-         *
-         * <p>The {@link PreviewSurfaceRequest} has already been completed by a previous invocation
-         * of {@link #provideSurface(Surface, Executor, Consumer)}.
-         *
-         * <p>It is safe to release or reuse the {@link Surface}, assuming it was not previously
-         * attached to a camera via {@link #provideSurface(Surface, Executor, Consumer)}.
-         */
-        public static final int RESULT_SURFACE_ALREADY_PROVIDED = 3;
-
-        /**
-         * Surface was not attached to the camera through this invocation of
-         * {@link #provideSurface(Surface, Executor, Consumer)} due to the
-         * {@link PreviewSurfaceRequest} already being marked as "will not provide surface".
-         *
-         * <p>The {@link PreviewSurfaceRequest} has already been marked as 'will not provide
-         * surface' by a previous invocation of {@link #willNotProvideSurface()}.
-         *
-         * <p>It is safe to release or reuse the {@link Surface}, assuming it was not previously
-         * attached to a camera via {@link #provideSurface(Surface, Executor, Consumer)}.
-         */
-        public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4;
-
-        /**
-         * Creates a result from the given result code and surface.
-         *
-         * <p>Can be used to compare to results returned to {@code resultListener} in
-         * {@link #provideSurface(Surface, Executor, Consumer)}.
-         *
-         * @param code    One of {@link #RESULT_SURFACE_USED_SUCCESSFULLY},
-         *                {@link #RESULT_REQUEST_CANCELLED}, {@link #RESULT_INVALID_SURFACE},
-         *                {@link #RESULT_SURFACE_ALREADY_PROVIDED}, or
-         *                {@link #RESULT_WILL_NOT_PROVIDE_SURFACE}.
-         * @param surface The {@link Surface} used to complete the {@link PreviewSurfaceRequest}.
-         */
-        @NonNull
-        static Result of(@ResultCode int code, @NonNull Surface surface) {
-            return new AutoValue_PreviewSurfaceRequest_Result(code, surface);
-        }
-
-        /**
-         * Returns the result of invoking {@link #provideSurface(Surface, Executor, Consumer)}
-         * with the surface from {@link #getSurface()}.
-         *
-         * @return One of {@link #RESULT_SURFACE_USED_SUCCESSFULLY},
-         * {@link #RESULT_REQUEST_CANCELLED}, {@link #RESULT_INVALID_SURFACE}, or
-         * {@link #RESULT_SURFACE_ALREADY_PROVIDED}, {@link #RESULT_WILL_NOT_PROVIDE_SURFACE}.
-         */
-        @ResultCode
-        public abstract int getResultCode();
-
-        /**
-         * The surface used to complete a {@link PreviewSurfaceRequest} with
-         * {@link #provideSurface(Surface, Executor, Consumer)}.
-         *
-         * @return the surface.
-         */
-        @NonNull
-        public abstract Surface getSurface();
-
-        // Ensure Result can't be subclassed outside the package
-        Result() {
-        }
-    }
-
-    /**
-     * Callback for surface request.
-     */
-    public interface Callback {
-
-        /**
-         * Callback for success.
-         * @param surface surface.
-         */
-        void onSuccess(@NonNull Surface surface);
-
-        /**
-         * Callback for failure.
-         * @param t throwable.
-         */
-        void onFailure(@NonNull Throwable t);
-    }
-}
diff --git a/camera/camera-previewview/src/test/java/androidx/camera/previewview/CameraViewFinderTest.java b/camera/camera-previewview/src/test/java/androidx/camera/previewview/CameraViewFinderTest.java
new file mode 100644
index 0000000..0a68e3f
--- /dev/null
+++ b/camera/camera-previewview/src/test/java/androidx/camera/previewview/CameraViewFinderTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Build;
+
+import androidx.camera.previewview.internal.quirk.QuirkInjector;
+import androidx.camera.previewview.internal.quirk.SurfaceViewNotCroppedByParentQuirk;
+import androidx.camera.previewview.internal.quirk.SurfaceViewStretchedQuirk;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+public class CameraViewFinderTest {
+
+    @After
+    public void tearDown() {
+        QuirkInjector.clear();
+    }
+
+    @Test
+    @Config(minSdk = Build.VERSION_CODES.N_MR1)
+    public void surfaceViewNormal_useSurfaceView() {
+        // Assert: SurfaceView is used.
+        assertThat(CameraViewFinder.shouldUseTextureView(
+                /* isLegacyDevice = */ false,
+                CameraViewFinder.ImplementationMode.PERFORMANCE)).isFalse();
+    }
+
+    @Test
+    public void surfaceViewStretchedQuirk_useTextureView() {
+        // Arrange:
+        QuirkInjector.inject(new SurfaceViewStretchedQuirk());
+
+        // Assert: TextureView is used even the SurfaceRequest is compatible with SurfaceView.
+        assertThat(CameraViewFinder.shouldUseTextureView(
+                /* isLegacyDevice = */ false,
+                CameraViewFinder.ImplementationMode.PERFORMANCE)).isTrue();
+    }
+
+    @Test
+    public void surfaceViewNotCroppedQuirk_useTextureView() {
+        // Arrange:
+        QuirkInjector.inject(new SurfaceViewNotCroppedByParentQuirk());
+
+        // Assert: TextureView is used even the SurfaceRequest is compatible with SurfaceView.
+        assertThat(CameraViewFinder.shouldUseTextureView(
+                /* isLegacyDevice = */ false,
+                CameraViewFinder.ImplementationMode.PERFORMANCE)).isTrue();
+    }
+
+    @Test
+    public void legacyDevice_useTextureView() {
+        // Arrange:
+        QuirkInjector.inject(new SurfaceViewNotCroppedByParentQuirk());
+
+        // Assert: TextureView is used even the SurfaceRequest is compatible with SurfaceView.
+        assertThat(CameraViewFinder.shouldUseTextureView(
+                /* isLegacyDevice = */ true,
+                CameraViewFinder.ImplementationMode.COMPATIBLE)).isTrue();
+    }
+}
diff --git a/camera/camera-previewview/src/test/java/androidx/camera/previewview/PreviewTransformationTest.kt b/camera/camera-previewview/src/test/java/androidx/camera/previewview/PreviewTransformationTest.kt
new file mode 100644
index 0000000..fbc39e7
--- /dev/null
+++ b/camera/camera-previewview/src/test/java/androidx/camera/previewview/PreviewTransformationTest.kt
@@ -0,0 +1,447 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview
+
+import android.graphics.Rect
+import android.os.Build
+import android.util.LayoutDirection
+import android.util.Size
+import android.view.Surface
+import android.view.View
+import androidx.camera.previewview.CameraViewFinder.ScaleType
+import androidx.camera.previewview.internal.utils.TransformUtils.sizeToVertices
+import androidx.camera.previewview.internal.transform.Rotation.RotationValue
+import androidx.camera.previewview.internal.transform.TransformationInfo
+import androidx.test.core.app.ApplicationProvider
+import com.google.common.truth.Truth.assertThat
+import kotlin.math.roundToInt
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+// Size of the PreviewView. Aspect ratio 2:1.
+private val PREVIEW_VIEW_SIZE = Size(400, 200)
+private val PIVOTED_PREVIEW_VIEW_SIZE = Size(PREVIEW_VIEW_SIZE.height, PREVIEW_VIEW_SIZE.width)
+
+// Size of the Surface. Aspect ratio 3:2.
+private val SURFACE_SIZE = Size(60, 40)
+
+// 2:1 crop rect.
+private val CROP_RECT = Rect(20, 0, 40, 40)
+
+private val FULL_CROP_RECT = Rect(0, 0, 60, 40)
+
+// Off-center crop rect with 0 rotation.
+private val CROP_RECT_0 = Rect(0, 15, 20, 25)
+
+// Off-center crop rect with 90 rotation.
+private val CROP_RECT_90 = Rect(10, 0, 50, 20)
+
+// 1:1 crop rect.
+private val FIT_SURFACE_SIZE = Size(60, 60)
+private val MISMATCHED_CROP_RECT = Rect(0, 0, 60, 60)
+private const val FLOAT_ERROR = 1e-3f
+
+private const val FRONT_CAMERA = true
+private const val BACK_CAMERA = false
+
+private const val ARBITRARY_ROTATION = Surface.ROTATION_0
+
+/**
+ * Instrument tests for [PreviewTransformation].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class PreviewTransformationTest {
+
+    private lateinit var mPreviewTransform: PreviewTransformation
+    private lateinit var mView: View
+
+    @Before
+    fun setUp() {
+        mPreviewTransform = PreviewTransformation()
+        mView = View(ApplicationProvider.getApplicationContext())
+    }
+
+    @Test
+    fun cropRectWidthOffByOnePixel_match() {
+        assertThat(
+            isCropRectAspectRatioMatchPreviewView(
+                Rect(
+                    0,
+                    0,
+                    PREVIEW_VIEW_SIZE.height + 1,
+                    PREVIEW_VIEW_SIZE.width - 1
+                )
+            )
+        ).isTrue()
+    }
+
+    @Test
+    fun cropRectWidthOffByTwoPixels_mismatch() {
+        assertThat(
+            isCropRectAspectRatioMatchPreviewView(
+                Rect(
+                    0,
+                    0,
+                    PREVIEW_VIEW_SIZE.height + 2,
+                    PREVIEW_VIEW_SIZE.width - 2
+                )
+            )
+        ).isFalse()
+    }
+
+    private fun isCropRectAspectRatioMatchPreviewView(cropRect: Rect): Boolean {
+        mPreviewTransform.setTransformationInfo(
+            // Height and width is swapped because rotation is 90°.
+            TransformationInfo.of(cropRect, 90, ARBITRARY_ROTATION),
+            SURFACE_SIZE,
+            BACK_CAMERA
+        )
+        return mPreviewTransform.isViewportAspectRatioMatchPreviewView(PREVIEW_VIEW_SIZE)
+    }
+
+    @Test
+    fun correctTextureViewWith0Rotation() {
+        assertThat(getTextureViewCorrection(Surface.ROTATION_0)).isEqualTo(
+            intArrayOf(
+                0,
+                0,
+                SURFACE_SIZE.width,
+                0,
+                SURFACE_SIZE.width,
+                SURFACE_SIZE.height,
+                0,
+                SURFACE_SIZE.height
+            )
+        )
+    }
+
+    @Test
+    fun correctTextureViewWith90Rotation() {
+        assertThat(getTextureViewCorrection(Surface.ROTATION_90)).isEqualTo(
+            intArrayOf(
+                0,
+                SURFACE_SIZE.height,
+                0,
+                0,
+                SURFACE_SIZE.width,
+                0,
+                SURFACE_SIZE.width,
+                SURFACE_SIZE.height
+            )
+        )
+    }
+
+    @Test
+    fun correctTextureViewWith180Rotation() {
+        assertThat(getTextureViewCorrection(Surface.ROTATION_180)).isEqualTo(
+            intArrayOf(
+                SURFACE_SIZE.width,
+                SURFACE_SIZE.height,
+                0,
+                SURFACE_SIZE.height,
+                0,
+                0,
+                SURFACE_SIZE.width,
+                0
+            )
+        )
+    }
+
+    @Test
+    fun correctTextureViewWith270Rotation() {
+        assertThat(getTextureViewCorrection(Surface.ROTATION_270)).isEqualTo(
+            intArrayOf(
+                SURFACE_SIZE.width,
+                0,
+                SURFACE_SIZE.width,
+                SURFACE_SIZE.height,
+                0,
+                SURFACE_SIZE.height,
+                0,
+                0
+            )
+        )
+    }
+
+    private fun getTextureViewCorrection(@RotationValue rotation: Int): IntArray {
+        return getTextureViewCorrection(rotation, BACK_CAMERA)
+    }
+
+    /**
+     * Corrects TextureView based on target rotation and return the corrected vertices.
+     */
+    private fun getTextureViewCorrection(
+        @RotationValue rotation: Int,
+        isFrontCamera: Boolean
+    ): IntArray {
+        // Arrange.
+        mPreviewTransform.setTransformationInfo(
+            TransformationInfo.of(CROP_RECT, 90, rotation),
+            SURFACE_SIZE,
+            isFrontCamera
+        )
+
+        // Act.
+        val surfaceVertexes = sizeToVertices(SURFACE_SIZE)
+        mPreviewTransform.textureViewCorrectionMatrix.mapPoints(surfaceVertexes)
+        return convertToIntArray(surfaceVertexes)
+    }
+
+    private fun convertToIntArray(elements: FloatArray): IntArray {
+        var result = IntArray(elements.size)
+
+        for ((index, element) in elements.withIndex()) {
+            result[index] = element.roundToInt()
+        }
+
+        return result
+    }
+
+    @Test
+    fun ratioMatch_surfaceIsScaledToFillPreviewView() {
+        // Arrange.
+        mPreviewTransform.setTransformationInfo(
+            TransformationInfo.of(
+                CROP_RECT,
+                90,
+                ARBITRARY_ROTATION
+            ),
+            SURFACE_SIZE, BACK_CAMERA
+        )
+
+        // Act.
+        mPreviewTransform.transformView(PREVIEW_VIEW_SIZE, LayoutDirection.LTR, mView)
+
+        // Assert.
+        val correctCropRectWidth =
+            CROP_RECT.height().toFloat() / SURFACE_SIZE.height * SURFACE_SIZE.width
+        assertThat(mView.scaleX).isWithin(FLOAT_ERROR)
+            .of(PREVIEW_VIEW_SIZE.width / correctCropRectWidth)
+        val correctCropRectHeight: Float =
+            CROP_RECT.width().toFloat() / SURFACE_SIZE.width * SURFACE_SIZE.height
+        assertThat(mView.scaleY).isWithin(FLOAT_ERROR).of(
+            PREVIEW_VIEW_SIZE.height / correctCropRectHeight
+        )
+        assertThat(mView.translationX).isWithin(FLOAT_ERROR).of(0f)
+        assertThat(mView.translationY).isWithin(FLOAT_ERROR).of(-200f)
+    }
+
+    @Test
+    fun mismatchedCropRect_fitStart() {
+        assertForMismatchedCropRect(
+            ScaleType.FIT_START,
+            LayoutDirection.LTR,
+            PREVIEW_VIEW_SIZE.height.toFloat() / MISMATCHED_CROP_RECT.height(),
+            0f,
+            0f,
+            BACK_CAMERA
+        )
+    }
+
+    @Test
+    fun mismatchedCropRect_fitCenter() {
+        assertForMismatchedCropRect(
+            ScaleType.FIT_CENTER,
+            LayoutDirection.LTR,
+            PREVIEW_VIEW_SIZE.height.toFloat() / MISMATCHED_CROP_RECT.height(),
+            100f,
+            0f,
+            BACK_CAMERA
+        )
+    }
+
+    @Test
+    fun mismatchedCropRect_fitEnd() {
+        assertForMismatchedCropRect(
+            ScaleType.FIT_END,
+            LayoutDirection.LTR,
+            PREVIEW_VIEW_SIZE.height.toFloat() / MISMATCHED_CROP_RECT.height(),
+            200f,
+            0f,
+            BACK_CAMERA
+        )
+    }
+
+    @Test
+    fun mismatchedCropRectFrontCamera_fitStart() {
+        assertForMismatchedCropRect(
+            ScaleType.FIT_START,
+            LayoutDirection.LTR,
+            PREVIEW_VIEW_SIZE.height.toFloat() / MISMATCHED_CROP_RECT.height(),
+            0f,
+            0f,
+            FRONT_CAMERA
+        )
+    }
+
+    @Test
+    fun mismatchedCropRect_fillStart() {
+        assertForMismatchedCropRect(
+            ScaleType.FILL_START,
+            LayoutDirection.LTR,
+            PREVIEW_VIEW_SIZE.width.toFloat() / MISMATCHED_CROP_RECT.width(),
+            0f,
+            0f,
+            BACK_CAMERA
+        )
+    }
+
+    @Test
+    fun mismatchedCropRect_fillCenter() {
+        assertForMismatchedCropRect(
+            ScaleType.FILL_CENTER,
+            LayoutDirection.LTR,
+            PREVIEW_VIEW_SIZE.width.toFloat() / MISMATCHED_CROP_RECT.width(),
+            0f,
+            -100f,
+            BACK_CAMERA
+        )
+    }
+
+    @Test
+    fun mismatchedCropRect_fillEnd() {
+        assertForMismatchedCropRect(
+            ScaleType.FILL_END,
+            LayoutDirection.LTR,
+            PREVIEW_VIEW_SIZE.width.toFloat() / MISMATCHED_CROP_RECT.width(),
+            0f,
+            -200f,
+            BACK_CAMERA
+        )
+    }
+
+    @Test
+    fun mismatchedCropRect_fitStartWithRtl_actsLikeFitEnd() {
+        assertForMismatchedCropRect(
+            ScaleType.FIT_START,
+            LayoutDirection.RTL,
+            PREVIEW_VIEW_SIZE.height.toFloat() / MISMATCHED_CROP_RECT.height(),
+            200f,
+            0f,
+            BACK_CAMERA
+        )
+    }
+
+    private fun assertForMismatchedCropRect(
+        scaleType: ScaleType,
+        layoutDirection: Int,
+        scale: Float,
+        translationX: Float,
+        translationY: Float,
+        isFrontCamera: Boolean
+    ) {
+        // Arrange.
+        mPreviewTransform.setTransformationInfo(
+            TransformationInfo.of(MISMATCHED_CROP_RECT, 90, ARBITRARY_ROTATION),
+            FIT_SURFACE_SIZE,
+            isFrontCamera
+        )
+        mPreviewTransform.scaleType = scaleType
+
+        // Act.
+        mPreviewTransform.transformView(PREVIEW_VIEW_SIZE, layoutDirection, mView)
+
+        // Assert.
+        assertThat(mView.scaleX).isWithin(FLOAT_ERROR).of(scale)
+        assertThat(mView.scaleY).isWithin(FLOAT_ERROR).of(scale)
+        assertThat(mView.translationX).isWithin(FLOAT_ERROR).of(translationX)
+        assertThat(mView.translationY).isWithin(FLOAT_ERROR).of(translationY)
+    }
+
+    @Test
+    fun frontCamera0_transformationIsMirrored() {
+        testOffCenterCropRectMirroring(FRONT_CAMERA, CROP_RECT_0, PREVIEW_VIEW_SIZE, 0)
+
+        // Assert:
+        assertThat(mView.scaleX).isWithin(FLOAT_ERROR).of(20F)
+        assertThat(mView.scaleY).isWithin(FLOAT_ERROR).of(20F)
+        assertThat(mView.translationX).isWithin(FLOAT_ERROR).of(-800F)
+        assertThat(mView.translationY).isWithin(FLOAT_ERROR).of(-300F)
+    }
+
+    @Test
+    fun backCamera0_transformationIsNotMirrored() {
+        testOffCenterCropRectMirroring(BACK_CAMERA, CROP_RECT_0, PREVIEW_VIEW_SIZE, 0)
+
+        // Assert:
+        assertThat(mView.scaleX).isWithin(FLOAT_ERROR).of(20F)
+        assertThat(mView.scaleY).isWithin(FLOAT_ERROR).of(20F)
+        assertThat(mView.translationX).isWithin(FLOAT_ERROR).of(0F)
+        assertThat(mView.translationY).isWithin(FLOAT_ERROR).of(-300F)
+    }
+
+    @Test
+    fun frontCameraRotated90_transformationIsMirrored() {
+        testOffCenterCropRectMirroring(
+            FRONT_CAMERA, CROP_RECT_90, PIVOTED_PREVIEW_VIEW_SIZE, 90
+        )
+
+        // Assert:
+        assertThat(mView.scaleX).isWithin(FLOAT_ERROR).of(6.666F)
+        assertThat(mView.scaleY).isWithin(FLOAT_ERROR).of(15F)
+        assertThat(mView.translationX).isWithin(FLOAT_ERROR).of(0F)
+        assertThat(mView.translationY).isWithin(FLOAT_ERROR).of(-100F)
+    }
+
+    @Test
+    fun previewViewSizeIs0_noOps() {
+        testOffCenterCropRectMirroring(
+            FRONT_CAMERA, CROP_RECT_90, Size(0, 0), 90
+        )
+
+        // Assert: no transform applied.
+        assertThat(mView.scaleX).isWithin(FLOAT_ERROR).of(1F)
+        assertThat(mView.scaleY).isWithin(FLOAT_ERROR).of(1F)
+        assertThat(mView.translationX).isWithin(FLOAT_ERROR).of(0F)
+        assertThat(mView.translationY).isWithin(FLOAT_ERROR).of(0F)
+    }
+
+    @Test
+    fun backCameraRotated90_transformationIsNotMirrored() {
+        testOffCenterCropRectMirroring(BACK_CAMERA, CROP_RECT_90, PIVOTED_PREVIEW_VIEW_SIZE, 90)
+
+        // Assert:
+        assertThat(mView.scaleX).isWithin(FLOAT_ERROR).of(6.666F)
+        assertThat(mView.scaleY).isWithin(FLOAT_ERROR).of(15F)
+        assertThat(mView.translationX).isWithin(FLOAT_ERROR).of(-200F)
+        assertThat(mView.translationY).isWithin(FLOAT_ERROR).of(-100F)
+    }
+
+    private fun testOffCenterCropRectMirroring(
+        isFrontCamera: Boolean,
+        cropRect: Rect,
+        previewViewSize: Size,
+        rotationDegrees: Int
+    ) {
+        mPreviewTransform.setTransformationInfo(
+            TransformationInfo.of(
+                cropRect,
+                rotationDegrees,
+                ARBITRARY_ROTATION
+            ),
+            SURFACE_SIZE,
+            isFrontCamera
+        )
+        mPreviewTransform.transformView(previewViewSize, LayoutDirection.LTR, mView)
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/DeviceQuirks.java b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/DeviceQuirks.java
new file mode 100644
index 0000000..2d48be4
--- /dev/null
+++ b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/DeviceQuirks.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.List;
+
+/**
+ * Tests version of main/.../DeviceQuirks.java, which provides device specific quirks, used for
+ * device specific workarounds.
+ * <p>
+ * In main/.../DeviceQuirks, Device quirks are loaded the first time a device workaround is
+ * encountered, and remain in memory until the process is killed. When running tests, this means
+ * that the same device quirks are used for all the tests. This causes an issue when tests modify
+ * device properties (using Robolectric for instance). Instead of force-reloading the device
+ * quirks in every test that uses a device workaround, this class internally reloads the quirks
+ * every time a device workaround is needed.
+ */
+public class DeviceQuirks {
+
+    private DeviceQuirks() {
+    }
+
+    /**
+     * Retrieves a specific device {@link Quirk} instance given its type.
+     *
+     * @param quirkClass The type of device quirk to retrieve.
+     * @return A device {@link Quirk} instance of the provided type, or {@code null} if it isn't
+     * found.
+     */
+    @SuppressWarnings("unchecked")
+    @Nullable
+    public static <T extends Quirk> T get(@NonNull final Class<T> quirkClass) {
+        final List<Quirk> quirks = DeviceQuirksLoader.loadQuirks();
+        quirks.addAll(QuirkInjector.INJECTED_QUIRKS);
+        for (final Quirk quirk : quirks) {
+            if (quirk.getClass() == quirkClass) {
+                return (T) quirk;
+            }
+        }
+        return null;
+    }
+}
diff --git a/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/QuirkInjector.java b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/QuirkInjector.java
new file mode 100644
index 0000000..27ae1ec
--- /dev/null
+++ b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/QuirkInjector.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import androidx.annotation.NonNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Inject quirks for unit tests.
+ *
+ * <p> Used with the test version of {@link DeviceQuirks} to test the behavior of quirks.
+ */
+public class QuirkInjector {
+
+    static final List<Quirk> INJECTED_QUIRKS = new ArrayList<>();
+
+    /**
+     * Inject a quirk. The injected quirk will be loaded by {@link DeviceQuirks}.
+     */
+    public static void inject(@NonNull Quirk quirk) {
+        INJECTED_QUIRKS.add(quirk);
+    }
+
+    /**
+     * Clears all injected quirks.
+     */
+    public static void clear() {
+        INJECTED_QUIRKS.clear();
+    }
+}
diff --git a/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/SurfaceViewNotCroppedByParentQuirkTest.kt b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/SurfaceViewNotCroppedByParentQuirkTest.kt
new file mode 100644
index 0000000..4b5f2a0
--- /dev/null
+++ b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/SurfaceViewNotCroppedByParentQuirkTest.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import org.robolectric.util.ReflectionHelpers
+
+/**
+ * Instrument tests for [SurfaceViewNotCroppedByParentQuirk].
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class SurfaceViewNotCroppedByParentQuirkTest {
+
+    @Test
+    fun quirkExistsOnRedMiNote10() {
+        // Arrange.
+        ReflectionHelpers.setStaticField(Build::class.java, "MODEL", "M2101K7AG")
+        ReflectionHelpers.setStaticField(Build::class.java, "MANUFACTURER", "Xiaomi")
+
+        // Act.
+        val quirk = DeviceQuirks.get(
+            SurfaceViewNotCroppedByParentQuirk::class.java
+        )
+
+        // Assert.
+        assertThat(quirk).isNotNull()
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/SurfaceViewStretchedQuirkTest.java b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/SurfaceViewStretchedQuirkTest.java
new file mode 100644
index 0000000..f50f217
--- /dev/null
+++ b/camera/camera-previewview/src/test/java/androidx/camera/previewview/internal/quirk/SurfaceViewStretchedQuirkTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.camera.previewview.internal.quirk;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Build;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.internal.DoNotInstrument;
+import org.robolectric.util.ReflectionHelpers;
+
+/**
+ * Unit test for {@link SurfaceViewStretchedQuirk}.
+ */
+@RunWith(RobolectricTestRunner.class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+public class SurfaceViewStretchedQuirkTest {
+
+    @Test
+    public void quirkExistsOnSamsungGalaxyZFold2() {
+        quirkExistsOnDevice("f2q");
+    }
+
+    @Test
+    public void quirkExistsOnSamsungGalaxyZFold3() {
+        quirkExistsOnDevice("q2q");
+    }
+
+    public void quirkExistsOnDevice(String device) {
+        // Arrange.
+        ReflectionHelpers.setStaticField(Build.class, "DEVICE", device);
+        ReflectionHelpers.setStaticField(Build.class, "MANUFACTURER", "SAMSUNG");
+
+        // Act.
+        final SurfaceViewStretchedQuirk quirk = DeviceQuirks.get(SurfaceViewStretchedQuirk.class);
+
+        // Assert.
+        assertThat(quirk).isNotNull();
+    }
+}
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index 36994d3..500be37 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -66,7 +66,7 @@
     externalNativeBuild {
         cmake {
             path "src/main/cpp/CMakeLists.txt"
-            version "3.22.1"
+            version libs.versions.cmake.get()
         }
     }
 }
diff --git a/camera/camera-video/api/1.1.0-beta02.txt b/camera/camera-video/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..94e5745
--- /dev/null
+++ b/camera/camera-video/api/1.1.0-beta02.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+    method public abstract int getAudioState();
+    method public abstract Throwable? getErrorCause();
+    method public boolean hasAudio();
+    method public boolean hasError();
+    field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+    field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+    field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+    field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+  }
+
+  @RequiresApi(21) public class FallbackStrategy {
+    method public static androidx.camera.video.FallbackStrategy higherQualityOrLowerThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy higherQualityThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityOrHigherThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityThan(androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+    method public long getFileSizeLimit();
+    method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+  }
+
+  @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+    ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+    method public androidx.camera.video.FileDescriptorOutputOptions build();
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+    method public java.io.File getFile();
+    method public long getFileSizeLimit();
+  }
+
+  @RequiresApi(21) public static final class FileOutputOptions.Builder {
+    ctor public FileOutputOptions.Builder(java.io.File);
+    method public androidx.camera.video.FileOutputOptions build();
+    method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.net.Uri getCollectionUri();
+    method public android.content.ContentResolver getContentResolver();
+    method public android.content.ContentValues getContentValues();
+    method public long getFileSizeLimit();
+    field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+  }
+
+  public static final class MediaStoreOutputOptions.Builder {
+    ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+    method public androidx.camera.video.MediaStoreOutputOptions build();
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public abstract class OutputOptions {
+    method public abstract long getFileSizeLimit();
+    field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+    ctor public OutputResults();
+    method public abstract android.net.Uri getOutputUri();
+  }
+
+  @RequiresApi(21) public final class PendingRecording {
+    method @CheckResult public androidx.camera.video.Recording start(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+  }
+
+  @RequiresApi(21) public class Quality {
+    field public static final androidx.camera.video.Quality FHD;
+    field public static final androidx.camera.video.Quality HD;
+    field public static final androidx.camera.video.Quality HIGHEST;
+    field public static final androidx.camera.video.Quality LOWEST;
+    field public static final androidx.camera.video.Quality SD;
+    field public static final androidx.camera.video.Quality UHD;
+  }
+
+  @RequiresApi(21) public final class QualitySelector {
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality);
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality, androidx.camera.video.FallbackStrategy);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>, androidx.camera.video.FallbackStrategy);
+    method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+    method public static java.util.List<androidx.camera.video.Quality!> getSupportedQualities(androidx.camera.core.CameraInfo);
+    method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+    method public java.util.concurrent.Executor? getExecutor();
+    method public androidx.camera.video.QualitySelector getQualitySelector();
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+    method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+    field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+  }
+
+  @RequiresApi(21) public static final class Recorder.Builder {
+    ctor public Recorder.Builder();
+    method public androidx.camera.video.Recorder build();
+    method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+  }
+
+  @RequiresApi(21) public final class Recording implements java.lang.AutoCloseable {
+    method public void close();
+    method public void pause();
+    method public void resume();
+    method public void stop();
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+    method public abstract androidx.camera.video.AudioStats getAudioStats();
+    method public abstract long getNumBytesRecorded();
+    method public abstract long getRecordedDurationNanos();
+  }
+
+  @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+    method public T getOutput();
+    method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+  }
+
+  @RequiresApi(21) public interface VideoOutput {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) public abstract class VideoRecordEvent {
+    method public androidx.camera.video.OutputOptions getOutputOptions();
+    method public androidx.camera.video.RecordingStats getRecordingStats();
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+    method public Throwable? getCause();
+    method public int getError();
+    method public androidx.camera.video.OutputResults getOutputResults();
+    method public boolean hasError();
+    field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+    field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+    field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+    field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+    field public static final int ERROR_NONE = 0; // 0x0
+    field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+    field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+    field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+  }
+
+}
+
diff --git a/camera/camera-video/api/public_plus_experimental_1.1.0-beta02.txt b/camera/camera-video/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..94e5745
--- /dev/null
+++ b/camera/camera-video/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+    method public abstract int getAudioState();
+    method public abstract Throwable? getErrorCause();
+    method public boolean hasAudio();
+    method public boolean hasError();
+    field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+    field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+    field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+    field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+  }
+
+  @RequiresApi(21) public class FallbackStrategy {
+    method public static androidx.camera.video.FallbackStrategy higherQualityOrLowerThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy higherQualityThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityOrHigherThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityThan(androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+    method public long getFileSizeLimit();
+    method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+  }
+
+  @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+    ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+    method public androidx.camera.video.FileDescriptorOutputOptions build();
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+    method public java.io.File getFile();
+    method public long getFileSizeLimit();
+  }
+
+  @RequiresApi(21) public static final class FileOutputOptions.Builder {
+    ctor public FileOutputOptions.Builder(java.io.File);
+    method public androidx.camera.video.FileOutputOptions build();
+    method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.net.Uri getCollectionUri();
+    method public android.content.ContentResolver getContentResolver();
+    method public android.content.ContentValues getContentValues();
+    method public long getFileSizeLimit();
+    field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+  }
+
+  public static final class MediaStoreOutputOptions.Builder {
+    ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+    method public androidx.camera.video.MediaStoreOutputOptions build();
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public abstract class OutputOptions {
+    method public abstract long getFileSizeLimit();
+    field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+    ctor public OutputResults();
+    method public abstract android.net.Uri getOutputUri();
+  }
+
+  @RequiresApi(21) public final class PendingRecording {
+    method @CheckResult public androidx.camera.video.Recording start(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+  }
+
+  @RequiresApi(21) public class Quality {
+    field public static final androidx.camera.video.Quality FHD;
+    field public static final androidx.camera.video.Quality HD;
+    field public static final androidx.camera.video.Quality HIGHEST;
+    field public static final androidx.camera.video.Quality LOWEST;
+    field public static final androidx.camera.video.Quality SD;
+    field public static final androidx.camera.video.Quality UHD;
+  }
+
+  @RequiresApi(21) public final class QualitySelector {
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality);
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality, androidx.camera.video.FallbackStrategy);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>, androidx.camera.video.FallbackStrategy);
+    method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+    method public static java.util.List<androidx.camera.video.Quality!> getSupportedQualities(androidx.camera.core.CameraInfo);
+    method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+    method public java.util.concurrent.Executor? getExecutor();
+    method public androidx.camera.video.QualitySelector getQualitySelector();
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+    method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+    field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+  }
+
+  @RequiresApi(21) public static final class Recorder.Builder {
+    ctor public Recorder.Builder();
+    method public androidx.camera.video.Recorder build();
+    method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+  }
+
+  @RequiresApi(21) public final class Recording implements java.lang.AutoCloseable {
+    method public void close();
+    method public void pause();
+    method public void resume();
+    method public void stop();
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+    method public abstract androidx.camera.video.AudioStats getAudioStats();
+    method public abstract long getNumBytesRecorded();
+    method public abstract long getRecordedDurationNanos();
+  }
+
+  @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+    method public T getOutput();
+    method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+  }
+
+  @RequiresApi(21) public interface VideoOutput {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) public abstract class VideoRecordEvent {
+    method public androidx.camera.video.OutputOptions getOutputOptions();
+    method public androidx.camera.video.RecordingStats getRecordingStats();
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+    method public Throwable? getCause();
+    method public int getError();
+    method public androidx.camera.video.OutputResults getOutputResults();
+    method public boolean hasError();
+    field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+    field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+    field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+    field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+    field public static final int ERROR_NONE = 0; // 0x0
+    field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+    field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+    field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/camera/camera-video/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to camera/camera-video/api/res-1.1.0-beta02.txt
diff --git a/camera/camera-video/api/restricted_1.1.0-beta02.txt b/camera/camera-video/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..94e5745
--- /dev/null
+++ b/camera/camera-video/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+    method public abstract int getAudioState();
+    method public abstract Throwable? getErrorCause();
+    method public boolean hasAudio();
+    method public boolean hasError();
+    field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+    field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+    field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+    field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+  }
+
+  @RequiresApi(21) public class FallbackStrategy {
+    method public static androidx.camera.video.FallbackStrategy higherQualityOrLowerThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy higherQualityThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityOrHigherThan(androidx.camera.video.Quality);
+    method public static androidx.camera.video.FallbackStrategy lowerQualityThan(androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+    method public long getFileSizeLimit();
+    method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+  }
+
+  @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+    ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+    method public androidx.camera.video.FileDescriptorOutputOptions build();
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+    method public java.io.File getFile();
+    method public long getFileSizeLimit();
+  }
+
+  @RequiresApi(21) public static final class FileOutputOptions.Builder {
+    ctor public FileOutputOptions.Builder(java.io.File);
+    method public androidx.camera.video.FileOutputOptions build();
+    method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+    method public android.net.Uri getCollectionUri();
+    method public android.content.ContentResolver getContentResolver();
+    method public android.content.ContentValues getContentValues();
+    method public long getFileSizeLimit();
+    field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+  }
+
+  public static final class MediaStoreOutputOptions.Builder {
+    ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+    method public androidx.camera.video.MediaStoreOutputOptions build();
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+  }
+
+  @RequiresApi(21) public abstract class OutputOptions {
+    method public abstract long getFileSizeLimit();
+    field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+    ctor public OutputResults();
+    method public abstract android.net.Uri getOutputUri();
+  }
+
+  @RequiresApi(21) public final class PendingRecording {
+    method @CheckResult public androidx.camera.video.Recording start(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+    method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+  }
+
+  @RequiresApi(21) public class Quality {
+    field public static final androidx.camera.video.Quality FHD;
+    field public static final androidx.camera.video.Quality HD;
+    field public static final androidx.camera.video.Quality HIGHEST;
+    field public static final androidx.camera.video.Quality LOWEST;
+    field public static final androidx.camera.video.Quality SD;
+    field public static final androidx.camera.video.Quality UHD;
+  }
+
+  @RequiresApi(21) public final class QualitySelector {
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality);
+    method public static androidx.camera.video.QualitySelector from(androidx.camera.video.Quality, androidx.camera.video.FallbackStrategy);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>);
+    method public static androidx.camera.video.QualitySelector fromOrderedList(java.util.List<androidx.camera.video.Quality!>, androidx.camera.video.FallbackStrategy);
+    method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+    method public static java.util.List<androidx.camera.video.Quality!> getSupportedQualities(androidx.camera.core.CameraInfo);
+    method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, androidx.camera.video.Quality);
+  }
+
+  @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+    method public java.util.concurrent.Executor? getExecutor();
+    method public androidx.camera.video.QualitySelector getQualitySelector();
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+    method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+    method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+    field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+  }
+
+  @RequiresApi(21) public static final class Recorder.Builder {
+    ctor public Recorder.Builder();
+    method public androidx.camera.video.Recorder build();
+    method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+  }
+
+  @RequiresApi(21) public final class Recording implements java.lang.AutoCloseable {
+    method public void close();
+    method public void pause();
+    method public void resume();
+    method public void stop();
+  }
+
+  @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+    method public abstract androidx.camera.video.AudioStats getAudioStats();
+    method public abstract long getNumBytesRecorded();
+    method public abstract long getRecordedDurationNanos();
+  }
+
+  @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+    method public T getOutput();
+    method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+  }
+
+  @RequiresApi(21) public interface VideoOutput {
+    method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+  }
+
+  @RequiresApi(21) public abstract class VideoRecordEvent {
+    method public androidx.camera.video.OutputOptions getOutputOptions();
+    method public androidx.camera.video.RecordingStats getRecordingStats();
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+    method public Throwable? getCause();
+    method public int getError();
+    method public androidx.camera.video.OutputResults getOutputResults();
+    method public boolean hasError();
+    field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+    field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+    field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+    field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+    field public static final int ERROR_NONE = 0; // 0x0
+    field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+    field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+    field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+    field public static final int ERROR_UNKNOWN = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+  }
+
+  @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+  }
+
+}
+
diff --git a/camera/camera-view/api/1.1.0-beta02.txt b/camera/camera-view/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..847583ea
--- /dev/null
+++ b/camera/camera-view/api/1.1.0-beta02.txt
@@ -0,0 +1,118 @@
+// Signature format: 4.0
+package androidx.camera.view {
+
+  @RequiresApi(21) public abstract class CameraController {
+    method @MainThread public void clearImageAnalysisAnalyzer();
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
+    method @MainThread public androidx.camera.core.CameraInfo? getCameraInfo();
+    method @MainThread public androidx.camera.core.CameraSelector getCameraSelector();
+    method @MainThread public java.util.concurrent.Executor? getImageAnalysisBackgroundExecutor();
+    method @MainThread public int getImageAnalysisBackpressureStrategy();
+    method @MainThread public int getImageAnalysisImageQueueDepth();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageAnalysisTargetSize();
+    method @MainThread public int getImageCaptureFlashMode();
+    method @MainThread public java.util.concurrent.Executor? getImageCaptureIoExecutor();
+    method @MainThread public int getImageCaptureMode();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageCaptureTargetSize();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> getInitializationFuture();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getPreviewTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTapToFocusState();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method @MainThread public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method @MainThread public boolean hasCamera(androidx.camera.core.CameraSelector);
+    method @MainThread public boolean isImageAnalysisEnabled();
+    method @MainThread public boolean isImageCaptureEnabled();
+    method @MainThread public boolean isPinchToZoomEnabled();
+    method @MainThread public boolean isTapToFocusEnabled();
+    method @MainThread public void setCameraSelector(androidx.camera.core.CameraSelector);
+    method @MainThread public void setEnabledUseCases(int);
+    method @MainThread public void setImageAnalysisAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method @MainThread public void setImageAnalysisBackgroundExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageAnalysisBackpressureStrategy(int);
+    method @MainThread public void setImageAnalysisImageQueueDepth(int);
+    method @MainThread public void setImageAnalysisTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setImageCaptureFlashMode(int);
+    method @MainThread public void setImageCaptureIoExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageCaptureMode(int);
+    method @MainThread public void setImageCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method @MainThread public void setPinchToZoomEnabled(boolean);
+    method @MainThread public void setPreviewTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setTapToFocusEnabled(boolean);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method @MainThread public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method @MainThread public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    field public static final int IMAGE_ANALYSIS = 2; // 0x2
+    field public static final int IMAGE_CAPTURE = 1; // 0x1
+    field public static final int TAP_TO_FOCUS_FAILED = 4; // 0x4
+    field public static final int TAP_TO_FOCUS_FOCUSED = 2; // 0x2
+    field public static final int TAP_TO_FOCUS_NOT_FOCUSED = 3; // 0x3
+    field public static final int TAP_TO_FOCUS_NOT_STARTED = 0; // 0x0
+    field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class CameraController.OutputSize {
+    ctor public CameraController.OutputSize(int);
+    ctor public CameraController.OutputSize(android.util.Size);
+    method public int getAspectRatio();
+    method public android.util.Size? getResolution();
+    field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
+  }
+
+  @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+    ctor public LifecycleCameraController(android.content.Context);
+    method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void unbind();
+  }
+
+  @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
+    ctor @UiThread public PreviewView(android.content.Context);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.view.CameraController? getController();
+    method @UiThread public androidx.camera.view.PreviewView.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.core.MeteringPointFactory getMeteringPointFactory();
+    method public androidx.lifecycle.LiveData<androidx.camera.view.PreviewView.StreamState!> getPreviewStreamState();
+    method @UiThread public androidx.camera.view.PreviewView.ScaleType getScaleType();
+    method @UiThread public androidx.camera.core.Preview.SurfaceProvider getSurfaceProvider();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort(int);
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+  }
+
+  @RequiresApi(21) public enum PreviewView.ImplementationMode {
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum PreviewView.ScaleType {
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_START;
+  }
+
+  public enum PreviewView.StreamState {
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState IDLE;
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
+  }
+
+  @RequiresApi(21) public final class RotationProvider {
+    ctor public RotationProvider(android.content.Context);
+    method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
+    method public void removeListener(androidx.camera.view.RotationProvider.Listener);
+  }
+
+  public static interface RotationProvider.Listener {
+    method public void onRotationChanged(int);
+  }
+
+}
+
diff --git a/camera/camera-view/api/public_plus_experimental_1.1.0-beta02.txt b/camera/camera-view/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..51c1a93
--- /dev/null
+++ b/camera/camera-view/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,203 @@
+// Signature format: 4.0
+package androidx.camera.view {
+
+  @RequiresApi(21) public abstract class CameraController {
+    method @MainThread public void clearImageAnalysisAnalyzer();
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
+    method @MainThread public androidx.camera.core.CameraInfo? getCameraInfo();
+    method @MainThread public androidx.camera.core.CameraSelector getCameraSelector();
+    method @MainThread public java.util.concurrent.Executor? getImageAnalysisBackgroundExecutor();
+    method @MainThread public int getImageAnalysisBackpressureStrategy();
+    method @MainThread public int getImageAnalysisImageQueueDepth();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageAnalysisTargetSize();
+    method @MainThread public int getImageCaptureFlashMode();
+    method @MainThread public java.util.concurrent.Executor? getImageCaptureIoExecutor();
+    method @MainThread public int getImageCaptureMode();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageCaptureTargetSize();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> getInitializationFuture();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getPreviewTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTapToFocusState();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public androidx.camera.view.CameraController.OutputSize? getVideoCaptureTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method @MainThread public boolean hasCamera(androidx.camera.core.CameraSelector);
+    method @MainThread public boolean isImageAnalysisEnabled();
+    method @MainThread public boolean isImageCaptureEnabled();
+    method @MainThread public boolean isPinchToZoomEnabled();
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public boolean isRecording();
+    method @MainThread public boolean isTapToFocusEnabled();
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public boolean isVideoCaptureEnabled();
+    method @MainThread public void setCameraSelector(androidx.camera.core.CameraSelector);
+    method @MainThread public void setEnabledUseCases(int);
+    method @MainThread public void setImageAnalysisAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method @MainThread public void setImageAnalysisBackgroundExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageAnalysisBackpressureStrategy(int);
+    method @MainThread public void setImageAnalysisImageQueueDepth(int);
+    method @MainThread public void setImageAnalysisTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setImageCaptureFlashMode(int);
+    method @MainThread public void setImageCaptureIoExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageCaptureMode(int);
+    method @MainThread public void setImageCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method @MainThread public void setPinchToZoomEnabled(boolean);
+    method @MainThread public void setPreviewTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setTapToFocusEnabled(boolean);
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public void setVideoCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public void startRecording(androidx.camera.view.video.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.view.video.OnVideoSavedCallback);
+    method @MainThread @androidx.camera.view.video.ExperimentalVideo public void stopRecording();
+    method @MainThread public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method @MainThread public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    field public static final int IMAGE_ANALYSIS = 2; // 0x2
+    field public static final int IMAGE_CAPTURE = 1; // 0x1
+    field public static final int TAP_TO_FOCUS_FAILED = 4; // 0x4
+    field public static final int TAP_TO_FOCUS_FOCUSED = 2; // 0x2
+    field public static final int TAP_TO_FOCUS_NOT_FOCUSED = 3; // 0x3
+    field public static final int TAP_TO_FOCUS_NOT_STARTED = 0; // 0x0
+    field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
+    field @androidx.camera.view.video.ExperimentalVideo public static final int VIDEO_CAPTURE = 4; // 0x4
+  }
+
+  @RequiresApi(21) public static final class CameraController.OutputSize {
+    ctor public CameraController.OutputSize(int);
+    ctor public CameraController.OutputSize(android.util.Size);
+    method public int getAspectRatio();
+    method public android.util.Size? getResolution();
+    field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
+  }
+
+  @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+    ctor public LifecycleCameraController(android.content.Context);
+    method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void unbind();
+  }
+
+  @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
+    ctor @UiThread public PreviewView(android.content.Context);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.view.CameraController? getController();
+    method @UiThread public androidx.camera.view.PreviewView.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.core.MeteringPointFactory getMeteringPointFactory();
+    method public androidx.camera.view.transform.OutputTransform? getOutputTransform();
+    method public androidx.lifecycle.LiveData<androidx.camera.view.PreviewView.StreamState!> getPreviewStreamState();
+    method @UiThread public androidx.camera.view.PreviewView.ScaleType getScaleType();
+    method @UiThread public androidx.camera.core.Preview.SurfaceProvider getSurfaceProvider();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort(int);
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+  }
+
+  @RequiresApi(21) public enum PreviewView.ImplementationMode {
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum PreviewView.ScaleType {
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_START;
+  }
+
+  public enum PreviewView.StreamState {
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState IDLE;
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
+  }
+
+  @RequiresApi(21) public final class RotationProvider {
+    ctor public RotationProvider(android.content.Context);
+    method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
+    method public void removeListener(androidx.camera.view.RotationProvider.Listener);
+  }
+
+  public static interface RotationProvider.Listener {
+    method public void onRotationChanged(int);
+  }
+
+}
+
+package androidx.camera.view.transform {
+
+  @RequiresApi(21) public final class CoordinateTransform {
+    ctor public CoordinateTransform(androidx.camera.view.transform.OutputTransform, androidx.camera.view.transform.OutputTransform);
+    method public void mapPoint(android.graphics.PointF);
+    method public void mapPoints(float[]);
+    method public void mapRect(android.graphics.RectF);
+    method public void transform(android.graphics.Matrix);
+  }
+
+  @RequiresApi(21) public final class FileTransformFactory {
+    ctor public FileTransformFactory();
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(android.content.ContentResolver, android.net.Uri) throws java.io.IOException;
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(java.io.File) throws java.io.IOException;
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(java.io.InputStream) throws java.io.IOException;
+    method public boolean isUsingExifOrientation();
+    method public void setUsingExifOrientation(boolean);
+  }
+
+  @RequiresApi(21) public final class ImageProxyTransformFactory {
+    ctor public ImageProxyTransformFactory();
+    method public androidx.camera.view.transform.OutputTransform getOutputTransform(androidx.camera.core.ImageProxy);
+    method public boolean isUsingCropRect();
+    method public boolean isUsingRotationDegrees();
+    method public void setUsingCropRect(boolean);
+    method public void setUsingRotationDegrees(boolean);
+  }
+
+  @RequiresApi(21) public final class OutputTransform {
+  }
+
+}
+
+package androidx.camera.view.video {
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalVideo {
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class Metadata {
+    method public static androidx.camera.view.video.Metadata.Builder builder();
+    method public abstract android.location.Location? getLocation();
+  }
+
+  @com.google.auto.value.AutoValue.Builder public abstract static class Metadata.Builder {
+    method public abstract androidx.camera.view.video.Metadata build();
+    method public abstract androidx.camera.view.video.Metadata.Builder setLocation(android.location.Location?);
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo public interface OnVideoSavedCallback {
+    method public void onError(int, String, Throwable?);
+    method public void onVideoSaved(androidx.camera.view.video.OutputFileResults);
+    field public static final int ERROR_ENCODER = 1; // 0x1
+    field public static final int ERROR_FILE_IO = 4; // 0x4
+    field public static final int ERROR_INVALID_CAMERA = 5; // 0x5
+    field public static final int ERROR_MUXER = 2; // 0x2
+    field public static final int ERROR_RECORDING_IN_PROGRESS = 3; // 0x3
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileOptions {
+    method public static androidx.camera.view.video.OutputFileOptions.Builder builder(java.io.File);
+    method public static androidx.camera.view.video.OutputFileOptions.Builder builder(android.os.ParcelFileDescriptor);
+    method public static androidx.camera.view.video.OutputFileOptions.Builder builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
+    method public abstract androidx.camera.view.video.Metadata getMetadata();
+  }
+
+  @com.google.auto.value.AutoValue.Builder public abstract static class OutputFileOptions.Builder {
+    method public abstract androidx.camera.view.video.OutputFileOptions build();
+    method public abstract androidx.camera.view.video.OutputFileOptions.Builder setMetadata(androidx.camera.view.video.Metadata);
+  }
+
+  @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileResults {
+    method public abstract android.net.Uri? getSavedUri();
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/camera/camera-view/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to camera/camera-view/api/res-1.1.0-beta02.txt
diff --git a/camera/camera-view/api/restricted_1.1.0-beta02.txt b/camera/camera-view/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..847583ea
--- /dev/null
+++ b/camera/camera-view/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,118 @@
+// Signature format: 4.0
+package androidx.camera.view {
+
+  @RequiresApi(21) public abstract class CameraController {
+    method @MainThread public void clearImageAnalysisAnalyzer();
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
+    method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
+    method @MainThread public androidx.camera.core.CameraInfo? getCameraInfo();
+    method @MainThread public androidx.camera.core.CameraSelector getCameraSelector();
+    method @MainThread public java.util.concurrent.Executor? getImageAnalysisBackgroundExecutor();
+    method @MainThread public int getImageAnalysisBackpressureStrategy();
+    method @MainThread public int getImageAnalysisImageQueueDepth();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageAnalysisTargetSize();
+    method @MainThread public int getImageCaptureFlashMode();
+    method @MainThread public java.util.concurrent.Executor? getImageCaptureIoExecutor();
+    method @MainThread public int getImageCaptureMode();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getImageCaptureTargetSize();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> getInitializationFuture();
+    method @MainThread public androidx.camera.view.CameraController.OutputSize? getPreviewTargetSize();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTapToFocusState();
+    method @MainThread public androidx.lifecycle.LiveData<java.lang.Integer!> getTorchState();
+    method @MainThread public androidx.lifecycle.LiveData<androidx.camera.core.ZoomState!> getZoomState();
+    method @MainThread public boolean hasCamera(androidx.camera.core.CameraSelector);
+    method @MainThread public boolean isImageAnalysisEnabled();
+    method @MainThread public boolean isImageCaptureEnabled();
+    method @MainThread public boolean isPinchToZoomEnabled();
+    method @MainThread public boolean isTapToFocusEnabled();
+    method @MainThread public void setCameraSelector(androidx.camera.core.CameraSelector);
+    method @MainThread public void setEnabledUseCases(int);
+    method @MainThread public void setImageAnalysisAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
+    method @MainThread public void setImageAnalysisBackgroundExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageAnalysisBackpressureStrategy(int);
+    method @MainThread public void setImageAnalysisImageQueueDepth(int);
+    method @MainThread public void setImageAnalysisTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setImageCaptureFlashMode(int);
+    method @MainThread public void setImageCaptureIoExecutor(java.util.concurrent.Executor?);
+    method @MainThread public void setImageCaptureMode(int);
+    method @MainThread public void setImageCaptureTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setLinearZoom(@FloatRange(from=0.0f, to=1.0f) float);
+    method @MainThread public void setPinchToZoomEnabled(boolean);
+    method @MainThread public void setPreviewTargetSize(androidx.camera.view.CameraController.OutputSize?);
+    method @MainThread public void setTapToFocusEnabled(boolean);
+    method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setZoomRatio(float);
+    method @MainThread public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
+    method @MainThread public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
+    field public static final int IMAGE_ANALYSIS = 2; // 0x2
+    field public static final int IMAGE_CAPTURE = 1; // 0x1
+    field public static final int TAP_TO_FOCUS_FAILED = 4; // 0x4
+    field public static final int TAP_TO_FOCUS_FOCUSED = 2; // 0x2
+    field public static final int TAP_TO_FOCUS_NOT_FOCUSED = 3; // 0x3
+    field public static final int TAP_TO_FOCUS_NOT_STARTED = 0; // 0x0
+    field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
+  }
+
+  @RequiresApi(21) public static final class CameraController.OutputSize {
+    ctor public CameraController.OutputSize(int);
+    ctor public CameraController.OutputSize(android.util.Size);
+    method public int getAspectRatio();
+    method public android.util.Size? getResolution();
+    field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
+  }
+
+  @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+    ctor public LifecycleCameraController(android.content.Context);
+    method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void unbind();
+  }
+
+  @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
+    ctor @UiThread public PreviewView(android.content.Context);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
+    ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int, int);
+    method @UiThread public android.graphics.Bitmap? getBitmap();
+    method @UiThread public androidx.camera.view.CameraController? getController();
+    method @UiThread public androidx.camera.view.PreviewView.ImplementationMode getImplementationMode();
+    method @UiThread public androidx.camera.core.MeteringPointFactory getMeteringPointFactory();
+    method public androidx.lifecycle.LiveData<androidx.camera.view.PreviewView.StreamState!> getPreviewStreamState();
+    method @UiThread public androidx.camera.view.PreviewView.ScaleType getScaleType();
+    method @UiThread public androidx.camera.core.Preview.SurfaceProvider getSurfaceProvider();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort();
+    method @UiThread public androidx.camera.core.ViewPort? getViewPort(int);
+    method @UiThread public void setController(androidx.camera.view.CameraController?);
+    method @UiThread public void setImplementationMode(androidx.camera.view.PreviewView.ImplementationMode);
+    method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
+  }
+
+  @RequiresApi(21) public enum PreviewView.ImplementationMode {
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
+    enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
+  }
+
+  @RequiresApi(21) public enum PreviewView.ScaleType {
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_CENTER;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_END;
+    enum_constant public static final androidx.camera.view.PreviewView.ScaleType FIT_START;
+  }
+
+  public enum PreviewView.StreamState {
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState IDLE;
+    enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
+  }
+
+  @RequiresApi(21) public final class RotationProvider {
+    ctor public RotationProvider(android.content.Context);
+    method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
+    method public void removeListener(androidx.camera.view.RotationProvider.Listener);
+  }
+
+  public static interface RotationProvider.Listener {
+    method public void onRotationChanged(int);
+  }
+
+}
+
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
index d39bb63..3ee7e91 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
@@ -99,6 +99,11 @@
  * {@link android.view.ViewParent#requestTransparentRegion(View)} right after making the
  * {@link View} visible, or initially hiding the {@link View} by setting its
  * {@linkplain View#setAlpha(float) opacity} to 0, then setting it to 1.0F to show it.
+ *
+ * There are some limitations of transition animations to {@link SurfaceView} and
+ * {@link TextureView}, which applies to {@link PreviewView} as well.
+ *
+ * @see <a href="https://developer.android.com/training/transitions#Limitations</a>
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class PreviewView extends FrameLayout {
diff --git a/camera/integration-tests/coretestapp/build.gradle b/camera/integration-tests/coretestapp/build.gradle
index 0344722..c65167c 100644
--- a/camera/integration-tests/coretestapp/build.gradle
+++ b/camera/integration-tests/coretestapp/build.gradle
@@ -54,7 +54,7 @@
     externalNativeBuild {
         cmake {
             path "src/main/cpp/CMakeLists.txt"
-            version "3.22.1"
+            version libs.versions.cmake.get()
         }
     }
 }
diff --git a/car/app/app-automotive/api/1.2.0-beta03.txt b/car/app/app-automotive/api/1.2.0-beta03.txt
new file mode 100644
index 0000000..e44b1f5
--- /dev/null
+++ b/car/app/app-automotive/api/1.2.0-beta03.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.car.app.activity {
+
+  public final class CarAppActivity extends androidx.fragment.app.FragmentActivity implements androidx.lifecycle.LifecycleOwner {
+    ctor public CarAppActivity();
+  }
+
+}
+
+package androidx.car.app.activity.renderer.surface {
+
+  public final class LegacySurfacePackage {
+    ctor public LegacySurfacePackage(androidx.car.app.activity.renderer.surface.SurfaceControlCallback);
+  }
+
+  public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
+    method public void onKeyEvent(android.view.KeyEvent);
+    method public void onTouchEvent(android.view.MotionEvent);
+    method public void onWindowFocusChanged(boolean, boolean);
+    method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
+  }
+
+  public final class SurfaceWrapper {
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
+    method public int getDensityDpi();
+    method public int getDisplayId();
+    method @Dimension public int getHeight();
+    method public android.os.IBinder? getHostToken();
+    method public android.view.Surface getSurface();
+    method @Dimension public int getWidth();
+  }
+
+}
+
diff --git a/car/app/app-automotive/api/public_plus_experimental_1.2.0-beta03.txt b/car/app/app-automotive/api/public_plus_experimental_1.2.0-beta03.txt
new file mode 100644
index 0000000..10d773e
--- /dev/null
+++ b/car/app/app-automotive/api/public_plus_experimental_1.2.0-beta03.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.car.app.activity {
+
+  public final class CarAppActivity extends androidx.fragment.app.FragmentActivity implements androidx.lifecycle.LifecycleOwner {
+    ctor public CarAppActivity();
+  }
+
+}
+
+package androidx.car.app.activity.renderer.surface {
+
+  public final class LegacySurfacePackage {
+    ctor public LegacySurfacePackage(androidx.car.app.activity.renderer.surface.SurfaceControlCallback);
+  }
+
+  public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
+    method public void onKeyEvent(android.view.KeyEvent);
+    method public void onTouchEvent(android.view.MotionEvent);
+    method public void onWindowFocusChanged(boolean, boolean);
+    method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
+  }
+
+  public final class SurfaceWrapper {
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
+    method public int getDensityDpi();
+    method public int getDisplayId();
+    method @Dimension public int getHeight();
+    method public android.os.IBinder? getHostToken();
+    method public android.view.Surface getSurface();
+    method @Dimension public int getWidth();
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @androidx.car.app.annotations.ExperimentalCarApi public final class AutomotiveCarHardwareManager implements androidx.car.app.hardware.CarHardwareManager {
+    ctor public AutomotiveCarHardwareManager(android.content.Context);
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/car/app/app-automotive/api/res-1.2.0-beta03.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to car/app/app-automotive/api/res-1.2.0-beta03.txt
diff --git a/car/app/app-automotive/api/restricted_1.2.0-beta03.txt b/car/app/app-automotive/api/restricted_1.2.0-beta03.txt
new file mode 100644
index 0000000..e18fd4c
--- /dev/null
+++ b/car/app/app-automotive/api/restricted_1.2.0-beta03.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.car.app.activity {
+
+  public final class CarAppActivity extends androidx.fragment.app.FragmentActivity {
+    ctor public CarAppActivity();
+  }
+
+}
+
+package androidx.car.app.activity.renderer.surface {
+
+  public final class LegacySurfacePackage {
+    ctor public LegacySurfacePackage(androidx.car.app.activity.renderer.surface.SurfaceControlCallback);
+  }
+
+  public interface SurfaceControlCallback {
+    method public default void onError(String, Throwable);
+    method public void onKeyEvent(android.view.KeyEvent);
+    method public void onTouchEvent(android.view.MotionEvent);
+    method public void onWindowFocusChanged(boolean, boolean);
+    method public void setSurfaceWrapper(androidx.car.app.activity.renderer.surface.SurfaceWrapper);
+  }
+
+  public final class SurfaceWrapper {
+    ctor public SurfaceWrapper(android.os.IBinder?, @Dimension int, @Dimension int, int, int, android.view.Surface);
+    method public int getDensityDpi();
+    method public int getDisplayId();
+    method @Dimension public int getHeight();
+    method public android.os.IBinder? getHostToken();
+    method public android.view.Surface getSurface();
+    method @Dimension public int getWidth();
+  }
+
+}
+
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java
index 2ed695b..e53a8b8 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/CarAppActivity.java
@@ -311,19 +311,25 @@
     /** Takes a snapshot of the surface view and puts it in the surfaceSnapshotView if succeeded. */
     private void takeSurfaceSnapshot() {
         // Nothing to do if the surface is not ready yet.
-        if (mSurfaceView.getHolder().getSurface() == null) {
+        if (mSurfaceView.getHolder().getSurface() == null
+                || mSurfaceView.getWidth() == 0 || mSurfaceView.getHeight() == 0) {
             return;
         }
-        Bitmap bitmap = Bitmap.createBitmap(mSurfaceView.getWidth(), mSurfaceView.getHeight(),
-                Bitmap.Config.ARGB_8888);
-        PixelCopy.request(mSurfaceView, bitmap, status -> {
-            if (status == PixelCopy.SUCCESS) {
-                mSurfaceSnapshotView.setImageBitmap(bitmap);
-            } else {
-                Log.w(LogTags.TAG, "Failed to take snapshot of the surface view");
-                mSurfaceSnapshotView.setImageBitmap(null);
-            }
-        }, mSnapshotHandler);
+        try {
+            Bitmap bitmap = Bitmap.createBitmap(mSurfaceView.getWidth(), mSurfaceView.getHeight(),
+                    Bitmap.Config.ARGB_8888);
+            PixelCopy.request(mSurfaceView, bitmap, status -> {
+                if (status == PixelCopy.SUCCESS) {
+                    mSurfaceSnapshotView.setImageBitmap(bitmap);
+                } else {
+                    Log.w(LogTags.TAG, "Failed to take snapshot of the surface view");
+                    mSurfaceSnapshotView.setImageBitmap(null);
+                }
+            }, mSnapshotHandler);
+        } catch (Exception e) {
+            Log.e(LogTags.TAG, "Failed to take snapshot of the surface view", e);
+            mSurfaceSnapshotView.setImageBitmap(null);
+        }
     }
 
     @Override
diff --git a/car/app/app-projected/api/1.2.0-beta03.txt b/car/app/app-projected/api/1.2.0-beta03.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-projected/api/1.2.0-beta03.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-projected/api/public_plus_experimental_1.2.0-beta03.txt b/car/app/app-projected/api/public_plus_experimental_1.2.0-beta03.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-projected/api/public_plus_experimental_1.2.0-beta03.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/car/app/app-projected/api/res-1.2.0-beta03.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to car/app/app-projected/api/res-1.2.0-beta03.txt
diff --git a/car/app/app-projected/api/restricted_1.2.0-beta03.txt b/car/app/app-projected/api/restricted_1.2.0-beta03.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/car/app/app-projected/api/restricted_1.2.0-beta03.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/car/app/app-testing/api/1.2.0-beta03.txt b/car/app/app-testing/api/1.2.0-beta03.txt
new file mode 100644
index 0000000..d148064
--- /dev/null
+++ b/car/app/app-testing/api/1.2.0-beta03.txt
@@ -0,0 +1,65 @@
+// Signature format: 4.0
+package androidx.car.app.testing {
+
+  public class FakeHost {
+    method public void performNotificationActionClick(android.app.PendingIntent);
+  }
+
+  public class ScreenController {
+    ctor public ScreenController(androidx.car.app.Screen);
+    method public androidx.car.app.Screen getScreen();
+    method public Object? getScreenResult();
+    method public java.util.List<androidx.car.app.model.Template!> getTemplatesReturned();
+    method public androidx.car.app.testing.ScreenController moveToState(androidx.lifecycle.Lifecycle.State);
+    method public void reset();
+  }
+
+  public class SessionController {
+    ctor public SessionController(androidx.car.app.Session, androidx.car.app.testing.TestCarContext, android.content.Intent);
+    method public androidx.car.app.Session getSession();
+    method public androidx.car.app.testing.SessionController moveToState(androidx.lifecycle.Lifecycle.State);
+  }
+
+  public class TestAppManager extends androidx.car.app.AppManager {
+    method public androidx.car.app.SurfaceCallback? getSurfaceCallback();
+    method public java.util.List<android.util.Pair<androidx.car.app.Screen!,androidx.car.app.model.Template!>!> getTemplatesReturned();
+    method public java.util.List<java.lang.CharSequence!> getToastsShown();
+    method public void reset();
+  }
+
+  public class TestCarContext extends androidx.car.app.CarContext {
+    method public static androidx.car.app.testing.TestCarContext createCarContext(android.content.Context);
+    method public androidx.car.app.testing.FakeHost getFakeHost();
+    method public androidx.car.app.testing.TestCarContext.PermissionRequestInfo? getLastPermissionRequestInfo();
+    method public java.util.List<android.content.Intent!> getStartCarAppIntents();
+    method public boolean hasCalledFinishCarApp();
+    method public void reset();
+  }
+
+  public static class TestCarContext.PermissionRequestInfo {
+    method public androidx.car.app.OnRequestPermissionsListener getListener();
+    method public java.util.List<java.lang.String!> getPermissionsRequested();
+  }
+
+  public class TestScreenManager extends androidx.car.app.ScreenManager {
+    method public java.util.List<androidx.car.app.Screen!> getScreensPushed();
+    method public java.util.List<androidx.car.app.Screen!> getScreensRemoved();
+    method public boolean hasScreens();
+    method public void reset();
+  }
+
+}
+
+package androidx.car.app.testing.navigation {
+
+  public class TestNavigationManager extends androidx.car.app.navigation.NavigationManager {
+    ctor public TestNavigationManager(androidx.car.app.testing.TestCarContext, androidx.car.app.HostDispatcher);
+    method public int getNavigationEndedCount();
+    method public androidx.car.app.navigation.NavigationManagerCallback? getNavigationManagerCallback();
+    method public int getNavigationStartedCount();
+    method public java.util.List<androidx.car.app.navigation.model.Trip!> getTripsSent();
+    method public void reset();
+  }
+
+}
+
diff --git a/car/app/app-testing/api/public_plus_experimental_1.2.0-beta03.txt b/car/app/app-testing/api/public_plus_experimental_1.2.0-beta03.txt
new file mode 100644
index 0000000..d148064
--- /dev/null
+++ b/car/app/app-testing/api/public_plus_experimental_1.2.0-beta03.txt
@@ -0,0 +1,65 @@
+// Signature format: 4.0
+package androidx.car.app.testing {
+
+  public class FakeHost {
+    method public void performNotificationActionClick(android.app.PendingIntent);
+  }
+
+  public class ScreenController {
+    ctor public ScreenController(androidx.car.app.Screen);
+    method public androidx.car.app.Screen getScreen();
+    method public Object? getScreenResult();
+    method public java.util.List<androidx.car.app.model.Template!> getTemplatesReturned();
+    method public androidx.car.app.testing.ScreenController moveToState(androidx.lifecycle.Lifecycle.State);
+    method public void reset();
+  }
+
+  public class SessionController {
+    ctor public SessionController(androidx.car.app.Session, androidx.car.app.testing.TestCarContext, android.content.Intent);
+    method public androidx.car.app.Session getSession();
+    method public androidx.car.app.testing.SessionController moveToState(androidx.lifecycle.Lifecycle.State);
+  }
+
+  public class TestAppManager extends androidx.car.app.AppManager {
+    method public androidx.car.app.SurfaceCallback? getSurfaceCallback();
+    method public java.util.List<android.util.Pair<androidx.car.app.Screen!,androidx.car.app.model.Template!>!> getTemplatesReturned();
+    method public java.util.List<java.lang.CharSequence!> getToastsShown();
+    method public void reset();
+  }
+
+  public class TestCarContext extends androidx.car.app.CarContext {
+    method public static androidx.car.app.testing.TestCarContext createCarContext(android.content.Context);
+    method public androidx.car.app.testing.FakeHost getFakeHost();
+    method public androidx.car.app.testing.TestCarContext.PermissionRequestInfo? getLastPermissionRequestInfo();
+    method public java.util.List<android.content.Intent!> getStartCarAppIntents();
+    method public boolean hasCalledFinishCarApp();
+    method public void reset();
+  }
+
+  public static class TestCarContext.PermissionRequestInfo {
+    method public androidx.car.app.OnRequestPermissionsListener getListener();
+    method public java.util.List<java.lang.String!> getPermissionsRequested();
+  }
+
+  public class TestScreenManager extends androidx.car.app.ScreenManager {
+    method public java.util.List<androidx.car.app.Screen!> getScreensPushed();
+    method public java.util.List<androidx.car.app.Screen!> getScreensRemoved();
+    method public boolean hasScreens();
+    method public void reset();
+  }
+
+}
+
+package androidx.car.app.testing.navigation {
+
+  public class TestNavigationManager extends androidx.car.app.navigation.NavigationManager {
+    ctor public TestNavigationManager(androidx.car.app.testing.TestCarContext, androidx.car.app.HostDispatcher);
+    method public int getNavigationEndedCount();
+    method public androidx.car.app.navigation.NavigationManagerCallback? getNavigationManagerCallback();
+    method public int getNavigationStartedCount();
+    method public java.util.List<androidx.car.app.navigation.model.Trip!> getTripsSent();
+    method public void reset();
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/car/app/app-testing/api/res-1.2.0-beta03.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to car/app/app-testing/api/res-1.2.0-beta03.txt
diff --git a/car/app/app-testing/api/restricted_1.2.0-beta03.txt b/car/app/app-testing/api/restricted_1.2.0-beta03.txt
new file mode 100644
index 0000000..d148064
--- /dev/null
+++ b/car/app/app-testing/api/restricted_1.2.0-beta03.txt
@@ -0,0 +1,65 @@
+// Signature format: 4.0
+package androidx.car.app.testing {
+
+  public class FakeHost {
+    method public void performNotificationActionClick(android.app.PendingIntent);
+  }
+
+  public class ScreenController {
+    ctor public ScreenController(androidx.car.app.Screen);
+    method public androidx.car.app.Screen getScreen();
+    method public Object? getScreenResult();
+    method public java.util.List<androidx.car.app.model.Template!> getTemplatesReturned();
+    method public androidx.car.app.testing.ScreenController moveToState(androidx.lifecycle.Lifecycle.State);
+    method public void reset();
+  }
+
+  public class SessionController {
+    ctor public SessionController(androidx.car.app.Session, androidx.car.app.testing.TestCarContext, android.content.Intent);
+    method public androidx.car.app.Session getSession();
+    method public androidx.car.app.testing.SessionController moveToState(androidx.lifecycle.Lifecycle.State);
+  }
+
+  public class TestAppManager extends androidx.car.app.AppManager {
+    method public androidx.car.app.SurfaceCallback? getSurfaceCallback();
+    method public java.util.List<android.util.Pair<androidx.car.app.Screen!,androidx.car.app.model.Template!>!> getTemplatesReturned();
+    method public java.util.List<java.lang.CharSequence!> getToastsShown();
+    method public void reset();
+  }
+
+  public class TestCarContext extends androidx.car.app.CarContext {
+    method public static androidx.car.app.testing.TestCarContext createCarContext(android.content.Context);
+    method public androidx.car.app.testing.FakeHost getFakeHost();
+    method public androidx.car.app.testing.TestCarContext.PermissionRequestInfo? getLastPermissionRequestInfo();
+    method public java.util.List<android.content.Intent!> getStartCarAppIntents();
+    method public boolean hasCalledFinishCarApp();
+    method public void reset();
+  }
+
+  public static class TestCarContext.PermissionRequestInfo {
+    method public androidx.car.app.OnRequestPermissionsListener getListener();
+    method public java.util.List<java.lang.String!> getPermissionsRequested();
+  }
+
+  public class TestScreenManager extends androidx.car.app.ScreenManager {
+    method public java.util.List<androidx.car.app.Screen!> getScreensPushed();
+    method public java.util.List<androidx.car.app.Screen!> getScreensRemoved();
+    method public boolean hasScreens();
+    method public void reset();
+  }
+
+}
+
+package androidx.car.app.testing.navigation {
+
+  public class TestNavigationManager extends androidx.car.app.navigation.NavigationManager {
+    ctor public TestNavigationManager(androidx.car.app.testing.TestCarContext, androidx.car.app.HostDispatcher);
+    method public int getNavigationEndedCount();
+    method public androidx.car.app.navigation.NavigationManagerCallback? getNavigationManagerCallback();
+    method public int getNavigationStartedCount();
+    method public java.util.List<androidx.car.app.navigation.model.Trip!> getTripsSent();
+    method public void reset();
+  }
+
+}
+
diff --git a/car/app/app/api/1.2.0-beta03.txt b/car/app/app/api/1.2.0-beta03.txt
new file mode 100644
index 0000000..a6a92f8
--- /dev/null
+++ b/car/app/app/api/1.2.0-beta03.txt
@@ -0,0 +1,1441 @@
+// Signature format: 4.0
+package androidx.car.app {
+
+  @androidx.car.app.annotations.CarProtocol public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
+    method public int getLatestCarAppApiLevel();
+    method public String getLibraryDisplayVersion();
+    method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_METADATA_KEY = "androidx.car.app.minCarApiLevel";
+  }
+
+  public class AppManager implements androidx.car.app.managers.Manager {
+    method public void invalidate();
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
+    method public void showToast(CharSequence, int);
+  }
+
+  public final class CarAppPermission {
+    method public static void checkHasLibraryPermission(android.content.Context, String);
+    method public static void checkHasPermission(android.content.Context, String);
+    field public static final String ACCESS_SURFACE = "androidx.car.app.ACCESS_SURFACE";
+    field public static final String MAP_TEMPLATES = "androidx.car.app.MAP_TEMPLATES";
+    field public static final String NAVIGATION_TEMPLATES = "androidx.car.app.NAVIGATION_TEMPLATES";
+  }
+
+  public abstract class CarAppService extends android.app.Service {
+    ctor public CarAppService();
+    method public abstract androidx.car.app.validation.HostValidator createHostValidator();
+    method @CallSuper public final void dump(java.io.FileDescriptor, java.io.PrintWriter, String![]?);
+    method public final androidx.car.app.Session? getCurrentSession();
+    method public final androidx.car.app.HostInfo? getHostInfo();
+    method @CallSuper public final android.os.IBinder onBind(android.content.Intent);
+    method public abstract androidx.car.app.Session onCreateSession();
+    method public final boolean onUnbind(android.content.Intent);
+    field public static final String CATEGORY_CHARGING_APP = "androidx.car.app.category.CHARGING";
+    field public static final String CATEGORY_NAVIGATION_APP = "androidx.car.app.category.NAVIGATION";
+    field public static final String CATEGORY_PARKING_APP = "androidx.car.app.category.PARKING";
+    field public static final String SERVICE_INTERFACE = "androidx.car.app.CarAppService";
+  }
+
+  public class CarContext extends android.content.ContextWrapper {
+    method public void finishCarApp();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public android.content.ComponentName? getCallingComponent();
+    method public int getCarAppApiLevel();
+    method public Object getCarService(String);
+    method public <T> T getCarService(Class<T!>);
+    method public String getCarServiceName(Class<?>);
+    method public androidx.car.app.HostInfo? getHostInfo();
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsListener);
+    method public void requestPermissions(java.util.List<java.lang.String!>, java.util.concurrent.Executor, androidx.car.app.OnRequestPermissionsListener);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public void setCarAppResult(int, android.content.Intent?);
+    method public void startCarApp(android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
+    field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
+    field public static final String APP_SERVICE = "app";
+    field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
+    field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
+    field @androidx.car.app.annotations.RequiresCarApi(3) public static final String HARDWARE_SERVICE = "hardware";
+    field public static final String NAVIGATION_SERVICE = "navigation";
+    field public static final String SCREEN_SERVICE = "screen";
+  }
+
+  public final class CarToast {
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, @StringRes int, int);
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, CharSequence, int);
+    method public void setDuration(int);
+    method public void setText(@StringRes int);
+    method public void setText(CharSequence);
+    method public void show();
+    field public static final int LENGTH_LONG = 1; // 0x1
+    field public static final int LENGTH_SHORT = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class FailureResponse {
+    ctor public FailureResponse(Throwable);
+    method public int getErrorType();
+    method public String getStackTrace();
+    field public static final int BUNDLER_EXCEPTION = 1; // 0x1
+    field public static final int ILLEGAL_STATE_EXCEPTION = 2; // 0x2
+    field public static final int INVALID_PARAMETER_EXCEPTION = 3; // 0x3
+    field public static final int REMOTE_EXCEPTION = 6; // 0x6
+    field public static final int RUNTIME_EXCEPTION = 5; // 0x5
+    field public static final int SECURITY_EXCEPTION = 4; // 0x4
+    field public static final int UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
+  public final class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
+  }
+
+  public final class HostInfo {
+    ctor public HostInfo(String, int);
+    method public String getPackageName();
+    method public int getUid();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnDoneCallback {
+    method public default void onFailure(androidx.car.app.serialization.Bundleable);
+    method public default void onSuccess(androidx.car.app.serialization.Bundleable?);
+  }
+
+  public interface OnRequestPermissionsListener {
+    method public void onRequestPermissionsResult(java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+  }
+
+  public interface OnScreenResultListener {
+    method public void onScreenResult(Object?);
+  }
+
+  public abstract class Screen implements androidx.lifecycle.LifecycleOwner {
+    ctor protected Screen(androidx.car.app.CarContext);
+    method public final void finish();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public String? getMarker();
+    method public final androidx.car.app.ScreenManager getScreenManager();
+    method public final void invalidate();
+    method public abstract androidx.car.app.model.Template onGetTemplate();
+    method public void setMarker(String?);
+    method public void setResult(Object?);
+  }
+
+  @MainThread public class ScreenManager implements androidx.car.app.managers.Manager {
+    method public int getStackSize();
+    method public androidx.car.app.Screen getTop();
+    method public void pop();
+    method public void popTo(String);
+    method public void popToRoot();
+    method public void push(androidx.car.app.Screen);
+    method public void pushForResult(androidx.car.app.Screen, androidx.car.app.OnScreenResultListener);
+    method public void remove(androidx.car.app.Screen);
+  }
+
+  public abstract class Session implements androidx.lifecycle.LifecycleOwner {
+    ctor public Session();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onCarConfigurationChanged(android.content.res.Configuration);
+    method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
+    method public void onNewIntent(android.content.Intent);
+  }
+
+  public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
+    method public default void onStableAreaChanged(android.graphics.Rect);
+    method public default void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public default void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public default void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SurfaceContainer {
+    ctor public SurfaceContainer(android.view.Surface?, int, int, int);
+    method public int getDpi();
+    method public int getHeight();
+    method public android.view.Surface? getSurface();
+    method public int getWidth();
+  }
+
+}
+
+package androidx.car.app.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface CarProtocol {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface RequiresCarApi {
+    method public abstract int value();
+  }
+
+}
+
+package androidx.car.app.connection {
+
+  public final class CarConnection {
+    ctor public CarConnection(android.content.Context);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getType();
+    field public static final String ACTION_CAR_CONNECTION_UPDATED = "androidx.car.app.connection.action.CAR_CONNECTION_UPDATED";
+    field public static final String CAR_CONNECTION_STATE = "CarConnectionState";
+    field public static final int CONNECTION_TYPE_NATIVE = 1; // 0x1
+    field public static final int CONNECTION_TYPE_NOT_CONNECTED = 0; // 0x0
+    field public static final int CONNECTION_TYPE_PROJECTION = 2; // 0x2
+  }
+
+}
+
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager implements androidx.car.app.managers.Manager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarHardwareManager extends androidx.car.app.managers.Manager {
+    method public default androidx.car.app.hardware.info.CarInfo getCarInfo();
+    method public default androidx.car.app.hardware.info.CarSensors getCarSensors();
+  }
+
+}
+
+package androidx.car.app.hardware.common {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    method public static String toString(int);
+    field public static final int KILOMETER = 3; // 0x3
+    field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field public static final int METER = 2; // 0x2
+    field public static final int METERS_PER_SEC = 101; // 0x65
+    field public static final int MILE = 4; // 0x4
+    field public static final int MILES_PER_HOUR = 103; // 0x67
+    field public static final int MILLIMETER = 1; // 0x1
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
+    ctor public CarValue(T?, long, int);
+    method public int getStatus();
+    method public long getTimestampMillis();
+    method public T? getValue();
+    field public static final int STATUS_SUCCESS = 1; // 0x1
+    field public static final int STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final int STATUS_UNIMPLEMENTED = 2; // 0x2
+    field public static final int STATUS_UNKNOWN = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public interface OnCarDataAvailableListener<T> {
+    method public void onCarDataAvailable(T);
+  }
+
+}
+
+package androidx.car.app.hardware.info {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
+    ctor public Accelerometer(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getForces();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
+    ctor public CarHardwareLocation(androidx.car.app.hardware.common.CarValue<android.location.Location!>);
+    method public androidx.car.app.hardware.common.CarValue<android.location.Location!> getLocation();
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarInfo {
+    method public void addEnergyLevelListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void addMileageListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void addSpeedListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void addTollListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+    method public void fetchEnergyProfile(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyProfile!>);
+    method public void fetchModel(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Model!>);
+    method public void removeEnergyLevelListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void removeMileageListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void removeSpeedListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void removeTollListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarSensors {
+    method public void addAccelerometerListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void addCarHardwareLocationListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void addCompassListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void addGyroscopeListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    method public void removeAccelerometerListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void removeCarHardwareLocationListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void removeCompassListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void removeGyroscopeListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    field public static final int UPDATE_RATE_FASTEST = 3; // 0x3
+    field public static final int UPDATE_RATE_NORMAL = 1; // 0x1
+    field public static final int UPDATE_RATE_UI = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
+    ctor public Compass(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getOrientations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getBatteryPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
+  }
+
+  public static final class EnergyLevel.Builder {
+    ctor public EnergyLevel.Builder();
+    method public androidx.car.app.hardware.info.EnergyLevel build();
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setBatteryPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getEvConnectorTypes();
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getFuelTypes();
+    field public static final int EVCONNECTOR_TYPE_CHADEMO = 3; // 0x3
+    field public static final int EVCONNECTOR_TYPE_COMBO_1 = 4; // 0x4
+    field public static final int EVCONNECTOR_TYPE_COMBO_2 = 5; // 0x5
+    field public static final int EVCONNECTOR_TYPE_GBT = 9; // 0x9
+    field public static final int EVCONNECTOR_TYPE_GBT_DC = 10; // 0xa
+    field public static final int EVCONNECTOR_TYPE_J1772 = 1; // 0x1
+    field public static final int EVCONNECTOR_TYPE_MENNEKES = 2; // 0x2
+    field public static final int EVCONNECTOR_TYPE_OTHER = 101; // 0x65
+    field public static final int EVCONNECTOR_TYPE_SCAME = 11; // 0xb
+    field public static final int EVCONNECTOR_TYPE_TESLA_HPWC = 7; // 0x7
+    field public static final int EVCONNECTOR_TYPE_TESLA_ROADSTER = 6; // 0x6
+    field public static final int EVCONNECTOR_TYPE_TESLA_SUPERCHARGER = 8; // 0x8
+    field public static final int EVCONNECTOR_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_BIODIESEL = 5; // 0x5
+    field public static final int FUEL_TYPE_CNG = 8; // 0x8
+    field public static final int FUEL_TYPE_DIESEL_1 = 3; // 0x3
+    field public static final int FUEL_TYPE_DIESEL_2 = 4; // 0x4
+    field public static final int FUEL_TYPE_E85 = 6; // 0x6
+    field public static final int FUEL_TYPE_ELECTRIC = 10; // 0xa
+    field public static final int FUEL_TYPE_HYDROGEN = 11; // 0xb
+    field public static final int FUEL_TYPE_LEADED = 2; // 0x2
+    field public static final int FUEL_TYPE_LNG = 9; // 0x9
+    field public static final int FUEL_TYPE_LPG = 7; // 0x7
+    field public static final int FUEL_TYPE_OTHER = 12; // 0xc
+    field public static final int FUEL_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_UNLEADED = 1; // 0x1
+  }
+
+  public static final class EnergyProfile.Builder {
+    ctor public EnergyProfile.Builder();
+    method public androidx.car.app.hardware.info.EnergyProfile build();
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setEvConnectorTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setFuelTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
+    ctor public Gyroscope(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getRotations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getOdometerMeters();
+  }
+
+  public static final class Mileage.Builder {
+    ctor public Mileage.Builder();
+    method public androidx.car.app.hardware.info.Mileage build();
+    method public androidx.car.app.hardware.info.Mileage.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.Mileage.Builder setOdometerMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getManufacturer();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getName();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getYear();
+  }
+
+  public static final class Model.Builder {
+    ctor public Model.Builder();
+    method public androidx.car.app.hardware.info.Model build();
+    method public androidx.car.app.hardware.info.Model.Builder setManufacturer(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setName(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setYear(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getDisplaySpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRawSpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getSpeedDisplayUnit();
+  }
+
+  public static final class Speed.Builder {
+    ctor public Speed.Builder();
+    method public androidx.car.app.hardware.info.Speed build();
+    method public androidx.car.app.hardware.info.Speed.Builder setDisplaySpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setRawSpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setSpeedDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getCardState();
+    field public static final int TOLLCARD_STATE_INVALID = 2; // 0x2
+    field public static final int TOLLCARD_STATE_NOT_INSERTED = 3; // 0x3
+    field public static final int TOLLCARD_STATE_UNKNOWN = 0; // 0x0
+    field public static final int TOLLCARD_STATE_VALID = 1; // 0x1
+  }
+
+  public static final class TollCard.Builder {
+    ctor public TollCard.Builder();
+    method public androidx.car.app.hardware.info.TollCard build();
+    method public androidx.car.app.hardware.info.TollCard.Builder setCardState(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+}
+
+package androidx.car.app.managers {
+
+  public interface Manager {
+  }
+
+}
+
+package androidx.car.app.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Action {
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public int getFlags();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public int getType();
+    method public boolean isStandard();
+    method public static String typeToString(int);
+    field public static final androidx.car.app.model.Action APP_ICON;
+    field public static final androidx.car.app.model.Action BACK;
+    field @androidx.car.app.annotations.RequiresCarApi(4) public static final int FLAG_PRIMARY = 1; // 0x1
+    field public static final androidx.car.app.model.Action PAN;
+    field public static final int TYPE_APP_ICON = 65538; // 0x10002
+    field public static final int TYPE_BACK = 65539; // 0x10003
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
+  }
+
+  public static final class Action.Builder {
+    ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action build();
+    method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Action.Builder setFlags(int);
+    method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getFirstActionOfType(int);
+  }
+
+  public static final class ActionStrip.Builder {
+    ctor public ActionStrip.Builder();
+    method public androidx.car.app.model.ActionStrip.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ActionStrip build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarColor {
+    method public static androidx.car.app.model.CarColor createCustom(@ColorInt int, @ColorInt int);
+    method @ColorInt public int getColor();
+    method @ColorInt public int getColorDark();
+    method public int getType();
+    field public static final androidx.car.app.model.CarColor BLUE;
+    field public static final androidx.car.app.model.CarColor DEFAULT;
+    field public static final androidx.car.app.model.CarColor GREEN;
+    field public static final androidx.car.app.model.CarColor PRIMARY;
+    field public static final androidx.car.app.model.CarColor RED;
+    field public static final androidx.car.app.model.CarColor SECONDARY;
+    field public static final int TYPE_BLUE = 6; // 0x6
+    field public static final int TYPE_CUSTOM = 0; // 0x0
+    field public static final int TYPE_DEFAULT = 1; // 0x1
+    field public static final int TYPE_GREEN = 5; // 0x5
+    field public static final int TYPE_PRIMARY = 2; // 0x2
+    field public static final int TYPE_RED = 4; // 0x4
+    field public static final int TYPE_SECONDARY = 3; // 0x3
+    field public static final int TYPE_YELLOW = 7; // 0x7
+    field public static final androidx.car.app.model.CarColor YELLOW;
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIcon {
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public androidx.car.app.model.CarColor? getTint();
+    method public int getType();
+    field public static final androidx.car.app.model.CarIcon ALERT;
+    field public static final androidx.car.app.model.CarIcon APP_ICON;
+    field public static final androidx.car.app.model.CarIcon BACK;
+    field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
+    field public static final int TYPE_ALERT = 4; // 0x4
+    field public static final int TYPE_APP_ICON = 5; // 0x5
+    field public static final int TYPE_BACK = 3; // 0x3
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
+  }
+
+  public static final class CarIcon.Builder {
+    ctor public CarIcon.Builder(androidx.core.graphics.drawable.IconCompat);
+    ctor public CarIcon.Builder(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.CarIcon build();
+    method public androidx.car.app.model.CarIcon.Builder setTint(androidx.car.app.model.CarColor);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIconSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon);
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon, int);
+    method public int getAlignment();
+    method public androidx.car.app.model.CarIcon getIcon();
+    field public static final int ALIGN_BASELINE = 1; // 0x1
+    field public static final int ALIGN_BOTTOM = 0; // 0x0
+    field public static final int ALIGN_CENTER = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarLocation {
+    method public static androidx.car.app.model.CarLocation create(double, double);
+    method public static androidx.car.app.model.CarLocation create(android.location.Location);
+    method public double getLatitude();
+    method public double getLongitude();
+  }
+
+  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+    ctor public CarSpan();
+    method public void updateDrawState(android.text.TextPaint);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarText {
+    method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
+    method public boolean isEmpty();
+    method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
+    method public CharSequence toCharSequence();
+  }
+
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
+    method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
+    method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
+    method @RequiresApi(26) public static androidx.car.app.model.DateTimeWithZone create(java.time.ZonedDateTime);
+    method public long getTimeSinceEpochMillis();
+    method public int getZoneOffsetSeconds();
+    method public String? getZoneShortName();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Distance {
+    method public static androidx.car.app.model.Distance create(double, int);
+    method public double getDisplayDistance();
+    method public int getDisplayUnit();
+    field public static final int UNIT_FEET = 6; // 0x6
+    field public static final int UNIT_KILOMETERS = 2; // 0x2
+    field public static final int UNIT_KILOMETERS_P1 = 3; // 0x3
+    field public static final int UNIT_METERS = 1; // 0x1
+    field public static final int UNIT_MILES = 4; // 0x4
+    field public static final int UNIT_MILES_P1 = 5; // 0x5
+    field public static final int UNIT_YARDS = 7; // 0x7
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DistanceSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DistanceSpan create(androidx.car.app.model.Distance);
+    method public androidx.car.app.model.Distance getDistance();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DurationSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DurationSpan create(long);
+    method @RequiresApi(26) public static androidx.car.app.model.DurationSpan create(java.time.Duration);
+    method public long getDurationSeconds();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ForegroundCarColorSpan create(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.CarColor getColor();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public int getImageType();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+    field public static final int IMAGE_TYPE_ICON = 1; // 0x1
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+  }
+
+  public static final class GridItem.Builder {
+    ctor public GridItem.Builder();
+    method public androidx.car.app.model.GridItem build();
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class GridTemplate.Builder {
+    ctor public GridTemplate.Builder();
+    method public androidx.car.app.model.GridTemplate build();
+    method public androidx.car.app.model.GridTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.GridTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.GridTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public default void onInputSubmitted(String);
+    method public default void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Item {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ItemList {
+    method public java.util.List<androidx.car.app.model.Item!> getItems();
+    method public androidx.car.app.model.CarText? getNoItemsMessage();
+    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
+    method public androidx.car.app.model.OnSelectedDelegate? getOnSelectedDelegate();
+    method public int getSelectedIndex();
+  }
+
+  public static final class ItemList.Builder {
+    ctor public ItemList.Builder();
+    method public androidx.car.app.model.ItemList.Builder addItem(androidx.car.app.model.Item);
+    method public androidx.car.app.model.ItemList build();
+    method public androidx.car.app.model.ItemList.Builder setNoItemsMessage(CharSequence);
+    method public androidx.car.app.model.ItemList.Builder setOnItemsVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener);
+    method public androidx.car.app.model.ItemList.Builder setOnSelectedListener(androidx.car.app.model.ItemList.OnSelectedListener);
+    method public androidx.car.app.model.ItemList.Builder setSelectedIndex(@IntRange(from=0) int);
+  }
+
+  public static interface ItemList.OnItemVisibilityChangedListener {
+    method public void onItemVisibilityChanged(int, int);
+  }
+
+  public static interface ItemList.OnSelectedListener {
+    method public void onSelected(int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ListTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public java.util.List<androidx.car.app.model.SectionedItemList!> getSectionedLists();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class ListTemplate.Builder {
+    ctor public ListTemplate.Builder();
+    method public androidx.car.app.model.ListTemplate.Builder addSectionedList(androidx.car.app.model.SectionedItemList);
+    method public androidx.car.app.model.ListTemplate build();
+    method public androidx.car.app.model.ListTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.ListTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ListTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.ListTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getDebugMessage();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
+  }
+
+  public static final class MessageTemplate.Builder {
+    ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
+    method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Metadata {
+    method public androidx.car.app.model.Place? getPlace();
+    field public static final androidx.car.app.model.Metadata EMPTY_METADATA;
+  }
+
+  public static final class Metadata.Builder {
+    ctor public Metadata.Builder();
+    ctor public Metadata.Builder(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Metadata build();
+    method public androidx.car.app.model.Metadata.Builder setPlace(androidx.car.app.model.Place);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnCheckedChangeDelegate {
+    method public void sendCheckedChange(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnClickDelegate {
+    method public boolean isParkedOnly();
+    method public void sendClick(androidx.car.app.OnDoneCallback);
+  }
+
+  public interface OnClickListener {
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
+    method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnSelectedDelegate {
+    method public void sendSelected(int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Pane {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.CarIcon? getImage();
+    method public java.util.List<androidx.car.app.model.Row!> getRows();
+    method public boolean isLoading();
+  }
+
+  public static final class Pane.Builder {
+    ctor public Pane.Builder();
+    method public androidx.car.app.model.Pane.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Pane.Builder addRow(androidx.car.app.model.Row);
+    method public androidx.car.app.model.Pane build();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Pane.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Pane.Builder setLoading(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PaneTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.Pane getPane();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class PaneTemplate.Builder {
+    ctor public PaneTemplate.Builder(androidx.car.app.model.Pane);
+    method public androidx.car.app.model.PaneTemplate build();
+    method public androidx.car.app.model.PaneTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PaneTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PaneTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
+    method public static androidx.car.app.model.ParkedOnlyOnClickListener create(androidx.car.app.model.OnClickListener);
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Place {
+    method public androidx.car.app.model.CarLocation getLocation();
+    method public androidx.car.app.model.PlaceMarker? getMarker();
+  }
+
+  public static final class Place.Builder {
+    ctor public Place.Builder(androidx.car.app.model.CarLocation);
+    ctor public Place.Builder(androidx.car.app.model.Place);
+    method public androidx.car.app.model.Place build();
+    method public androidx.car.app.model.Place.Builder setMarker(androidx.car.app.model.PlaceMarker);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Place? getAnchor();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isCurrentLocationEnabled();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListMapTemplate.Builder {
+    ctor public PlaceListMapTemplate.Builder();
+    method public androidx.car.app.model.PlaceListMapTemplate build();
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setAnchor(androidx.car.app.model.Place);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setCurrentLocationEnabled(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
+    method public androidx.car.app.model.CarColor? getColor();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getIconType();
+    method public androidx.car.app.model.CarText? getLabel();
+    field public static final int TYPE_ICON = 0; // 0x0
+    field public static final int TYPE_IMAGE = 1; // 0x1
+  }
+
+  public static final class PlaceMarker.Builder {
+    ctor public PlaceMarker.Builder();
+    method public androidx.car.app.model.PlaceMarker build();
+    method public androidx.car.app.model.PlaceMarker.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.PlaceMarker.Builder setIcon(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.PlaceMarker.Builder setLabel(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.Metadata? getMetadata();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public int getRowImageType();
+    method public java.util.List<androidx.car.app.model.CarText!> getTexts();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public androidx.car.app.model.Toggle? getToggle();
+    method public boolean isBrowsable();
+    method public androidx.car.app.model.Row row();
+    method public CharSequence yourBoat();
+    field public static final int IMAGE_TYPE_ICON = 4; // 0x4
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+    field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+  }
+
+  public static final class Row.Builder {
+    ctor public Row.Builder();
+    method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row build();
+    method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface SearchCallbackDelegate {
+    method public void sendSearchSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendSearchTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SearchTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public String? getInitialSearchText();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackDelegate getSearchCallbackDelegate();
+    method public String? getSearchHint();
+    method public boolean isLoading();
+    method public boolean isShowKeyboardByDefault();
+  }
+
+  public static final class SearchTemplate.Builder {
+    ctor public SearchTemplate.Builder(androidx.car.app.model.SearchTemplate.SearchCallback);
+    method public androidx.car.app.model.SearchTemplate build();
+    method public androidx.car.app.model.SearchTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.SearchTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.SearchTemplate.Builder setInitialSearchText(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.SearchTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.SearchTemplate.Builder setSearchHint(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  public static interface SearchTemplate.SearchCallback {
+    method public default void onSearchSubmitted(String);
+    method public default void onSearchTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SectionedItemList {
+    method public static androidx.car.app.model.SectionedItemList create(androidx.car.app.model.ItemList, CharSequence);
+    method public androidx.car.app.model.CarText getHeader();
+    method public androidx.car.app.model.ItemList getItemList();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Template {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateInfo {
+    ctor public TemplateInfo(Class<? extends androidx.car.app.model.Template>, String);
+    method public Class<? extends androidx.car.app.model.Template> getTemplateClass();
+    method public String getTemplateId();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateWrapper {
+    method public static androidx.car.app.model.TemplateWrapper copyOf(androidx.car.app.model.TemplateWrapper);
+    method public int getCurrentTaskStep();
+    method public String getId();
+    method public androidx.car.app.model.Template getTemplate();
+    method public java.util.List<androidx.car.app.model.TemplateInfo!> getTemplateInfosForScreenStack();
+    method public boolean isRefresh();
+    method public void setCurrentTaskStep(int);
+    method public void setId(String);
+    method public void setRefresh(boolean);
+    method public void setTemplate(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template, String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Toggle {
+    method public androidx.car.app.model.OnCheckedChangeDelegate getOnCheckedChangeDelegate();
+    method public boolean isChecked();
+  }
+
+  public static final class Toggle.Builder {
+    ctor public Toggle.Builder(androidx.car.app.model.Toggle.OnCheckedChangeListener);
+    method public androidx.car.app.model.Toggle build();
+    method public androidx.car.app.model.Toggle.Builder setChecked(boolean);
+  }
+
+  public static interface Toggle.OnCheckedChangeListener {
+    method public void onCheckedChange(boolean);
+  }
+
+}
+
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public PinSignInMethod(CharSequence);
+    method public androidx.car.app.model.CarText getPinCode();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public ProviderSignInMethod(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public QRCodeSignInMethod(android.net.Uri);
+    method public android.net.Uri getUri();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
+package androidx.car.app.navigation {
+
+  public class NavigationManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void clearNavigationManagerCallback();
+    method @MainThread public void navigationEnded();
+    method @MainThread public void navigationStarted();
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
+  }
+
+  public interface NavigationManagerCallback {
+    method public default void onAutoDriveEnabled();
+    method public default void onStopNavigation();
+  }
+
+}
+
+package androidx.car.app.navigation.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Destination {
+    method public androidx.car.app.model.CarText? getAddress();
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getName();
+  }
+
+  public static final class Destination.Builder {
+    ctor public Destination.Builder();
+    method public androidx.car.app.navigation.model.Destination build();
+    method public androidx.car.app.navigation.model.Destination.Builder setAddress(CharSequence);
+    method public androidx.car.app.navigation.model.Destination.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Destination.Builder setName(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Lane {
+    method public java.util.List<androidx.car.app.navigation.model.LaneDirection!> getDirections();
+  }
+
+  public static final class Lane.Builder {
+    ctor public Lane.Builder();
+    method public androidx.car.app.navigation.model.Lane.Builder addDirection(androidx.car.app.navigation.model.LaneDirection);
+    method public androidx.car.app.navigation.model.Lane build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class LaneDirection {
+    method public static androidx.car.app.navigation.model.LaneDirection create(int, boolean);
+    method public int getShape();
+    method public boolean isRecommended();
+    field public static final int SHAPE_NORMAL_LEFT = 5; // 0x5
+    field public static final int SHAPE_NORMAL_RIGHT = 6; // 0x6
+    field public static final int SHAPE_SHARP_LEFT = 7; // 0x7
+    field public static final int SHAPE_SHARP_RIGHT = 8; // 0x8
+    field public static final int SHAPE_SLIGHT_LEFT = 3; // 0x3
+    field public static final int SHAPE_SLIGHT_RIGHT = 4; // 0x4
+    field public static final int SHAPE_STRAIGHT = 2; // 0x2
+    field public static final int SHAPE_UNKNOWN = 1; // 0x1
+    field public static final int SHAPE_U_TURN_LEFT = 9; // 0x9
+    field public static final int SHAPE_U_TURN_RIGHT = 10; // 0xa
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Maneuver {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getRoundaboutExitAngle();
+    method public int getRoundaboutExitNumber();
+    method public int getType();
+    field public static final int TYPE_DEPART = 1; // 0x1
+    field public static final int TYPE_DESTINATION = 39; // 0x27
+    field public static final int TYPE_DESTINATION_LEFT = 41; // 0x29
+    field public static final int TYPE_DESTINATION_RIGHT = 42; // 0x2a
+    field public static final int TYPE_DESTINATION_STRAIGHT = 40; // 0x28
+    field public static final int TYPE_FERRY_BOAT = 37; // 0x25
+    field public static final int TYPE_FERRY_BOAT_LEFT = 47; // 0x2f
+    field public static final int TYPE_FERRY_BOAT_RIGHT = 48; // 0x30
+    field public static final int TYPE_FERRY_TRAIN = 38; // 0x26
+    field public static final int TYPE_FERRY_TRAIN_LEFT = 49; // 0x31
+    field public static final int TYPE_FERRY_TRAIN_RIGHT = 50; // 0x32
+    field public static final int TYPE_FORK_LEFT = 25; // 0x19
+    field public static final int TYPE_FORK_RIGHT = 26; // 0x1a
+    field public static final int TYPE_KEEP_LEFT = 3; // 0x3
+    field public static final int TYPE_KEEP_RIGHT = 4; // 0x4
+    field public static final int TYPE_MERGE_LEFT = 27; // 0x1b
+    field public static final int TYPE_MERGE_RIGHT = 28; // 0x1c
+    field public static final int TYPE_MERGE_SIDE_UNSPECIFIED = 29; // 0x1d
+    field public static final int TYPE_NAME_CHANGE = 2; // 0x2
+    field public static final int TYPE_OFF_RAMP_NORMAL_LEFT = 23; // 0x17
+    field public static final int TYPE_OFF_RAMP_NORMAL_RIGHT = 24; // 0x18
+    field public static final int TYPE_OFF_RAMP_SLIGHT_LEFT = 21; // 0x15
+    field public static final int TYPE_OFF_RAMP_SLIGHT_RIGHT = 22; // 0x16
+    field public static final int TYPE_ON_RAMP_NORMAL_LEFT = 15; // 0xf
+    field public static final int TYPE_ON_RAMP_NORMAL_RIGHT = 16; // 0x10
+    field public static final int TYPE_ON_RAMP_SHARP_LEFT = 17; // 0x11
+    field public static final int TYPE_ON_RAMP_SHARP_RIGHT = 18; // 0x12
+    field public static final int TYPE_ON_RAMP_SLIGHT_LEFT = 13; // 0xd
+    field public static final int TYPE_ON_RAMP_SLIGHT_RIGHT = 14; // 0xe
+    field public static final int TYPE_ON_RAMP_U_TURN_LEFT = 19; // 0x13
+    field public static final int TYPE_ON_RAMP_U_TURN_RIGHT = 20; // 0x14
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW = 34; // 0x22
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE = 35; // 0x23
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW = 32; // 0x20
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW_WITH_ANGLE = 33; // 0x21
+    field public static final int TYPE_ROUNDABOUT_ENTER_CCW = 45; // 0x2d
+    field public static final int TYPE_ROUNDABOUT_ENTER_CW = 43; // 0x2b
+    field public static final int TYPE_ROUNDABOUT_EXIT_CCW = 46; // 0x2e
+    field public static final int TYPE_ROUNDABOUT_EXIT_CW = 44; // 0x2c
+    field public static final int TYPE_STRAIGHT = 36; // 0x24
+    field public static final int TYPE_TURN_NORMAL_LEFT = 7; // 0x7
+    field public static final int TYPE_TURN_NORMAL_RIGHT = 8; // 0x8
+    field public static final int TYPE_TURN_SHARP_LEFT = 9; // 0x9
+    field public static final int TYPE_TURN_SHARP_RIGHT = 10; // 0xa
+    field public static final int TYPE_TURN_SLIGHT_LEFT = 5; // 0x5
+    field public static final int TYPE_TURN_SLIGHT_RIGHT = 6; // 0x6
+    field public static final int TYPE_UNKNOWN = 0; // 0x0
+    field public static final int TYPE_U_TURN_LEFT = 11; // 0xb
+    field public static final int TYPE_U_TURN_RIGHT = 12; // 0xc
+  }
+
+  public static final class Maneuver.Builder {
+    ctor public Maneuver.Builder(int);
+    method public androidx.car.app.navigation.model.Maneuver build();
+    method public androidx.car.app.navigation.model.Maneuver.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitAngle(@IntRange(from=1, to=360) int);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitNumber(@IntRange(from=1) int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class MessageInfo.Builder {
+    ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo build();
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class NavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
+  }
+
+  public static final class NavigationTemplate.Builder {
+    ctor public NavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.NavigationTemplate build();
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  public static interface NavigationTemplate.NavigationInfo {
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public interface PanModeDelegate {
+    method public void sendPanModeChanged(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListNavigationTemplate.Builder {
+    ctor public PlaceListNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate build();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.Action? getNavigateAction();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutePreviewNavigationTemplate.Builder {
+    ctor public RoutePreviewNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate build();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.Distance? getCurrentDistance();
+    method public androidx.car.app.navigation.model.Step? getCurrentStep();
+    method public androidx.car.app.model.CarIcon? getJunctionImage();
+    method public androidx.car.app.navigation.model.Step? getNextStep();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutingInfo.Builder {
+    ctor public RoutingInfo.Builder();
+    method public androidx.car.app.navigation.model.RoutingInfo build();
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setCurrentStep(androidx.car.app.navigation.model.Step, androidx.car.app.model.Distance);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setJunctionImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setLoading(boolean);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setNextStep(androidx.car.app.navigation.model.Step);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Step {
+    method public androidx.car.app.model.CarText? getCue();
+    method public java.util.List<androidx.car.app.navigation.model.Lane!> getLanes();
+    method public androidx.car.app.model.CarIcon? getLanesImage();
+    method public androidx.car.app.navigation.model.Maneuver? getManeuver();
+    method public androidx.car.app.model.CarText? getRoad();
+  }
+
+  public static final class Step.Builder {
+    ctor public Step.Builder();
+    ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
+    method public androidx.car.app.navigation.model.Step build();
+    method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
+    method public androidx.car.app.navigation.model.Step.Builder setLanesImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Step.Builder setManeuver(androidx.car.app.navigation.model.Maneuver);
+    method public androidx.car.app.navigation.model.Step.Builder setRoad(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TravelEstimate {
+    method public androidx.car.app.model.DateTimeWithZone? getArrivalTimeAtDestination();
+    method public androidx.car.app.model.Distance? getRemainingDistance();
+    method public androidx.car.app.model.CarColor? getRemainingDistanceColor();
+    method public androidx.car.app.model.CarColor? getRemainingTimeColor();
+    method public long getRemainingTimeSeconds();
+    field public static final long REMAINING_TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+  }
+
+  public static final class TravelEstimate.Builder {
+    ctor public TravelEstimate.Builder(androidx.car.app.model.Distance, androidx.car.app.model.DateTimeWithZone);
+    ctor @RequiresApi(26) public TravelEstimate.Builder(androidx.car.app.model.Distance, java.time.ZonedDateTime);
+    method public androidx.car.app.navigation.model.TravelEstimate build();
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingDistanceColor(androidx.car.app.model.CarColor);
+    method @RequiresApi(26) public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTime(java.time.Duration);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeSeconds(@IntRange(from=0xffffffff) long);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Trip {
+    method public androidx.car.app.model.CarText? getCurrentRoad();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getDestinationTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Destination!> getDestinations();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getStepTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Step!> getSteps();
+    method public boolean isLoading();
+  }
+
+  public static final class Trip.Builder {
+    ctor public Trip.Builder();
+    method public androidx.car.app.navigation.model.Trip.Builder addDestination(androidx.car.app.navigation.model.Destination, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip.Builder addStep(androidx.car.app.navigation.model.Step, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip build();
+    method public androidx.car.app.navigation.model.Trip.Builder setCurrentRoad(CharSequence);
+    method public androidx.car.app.navigation.model.Trip.Builder setLoading(boolean);
+  }
+
+}
+
+package androidx.car.app.notification {
+
+  public final class CarAppExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public CarAppExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
+    method public androidx.car.app.model.CarColor? getColor();
+    method public android.app.PendingIntent? getContentIntent();
+    method public CharSequence? getContentText();
+    method public CharSequence? getContentTitle();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method public int getImportance();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @DrawableRes public int getSmallIcon();
+    method public static boolean isExtended(android.app.Notification);
+  }
+
+  public static final class CarAppExtender.Builder {
+    ctor public CarAppExtender.Builder();
+    method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
+    method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentTitle(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setDeleteIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setImportance(int);
+    method public androidx.car.app.notification.CarAppExtender.Builder setLargeIcon(android.graphics.Bitmap);
+    method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
+  }
+
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
+}
+
+package androidx.car.app.serialization {
+
+  public final class Bundleable implements android.os.Parcelable {
+    method public static androidx.car.app.serialization.Bundleable create(Object) throws androidx.car.app.serialization.BundlerException;
+    method public int describeContents();
+    method public Object get() throws androidx.car.app.serialization.BundlerException;
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.car.app.serialization.Bundleable!> CREATOR;
+  }
+
+  public class BundlerException extends java.lang.Exception {
+    ctor public BundlerException(String?, Throwable);
+    ctor public BundlerException(String?);
+  }
+
+}
+
+package androidx.car.app.validation {
+
+  public final class HostValidator {
+    method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getAllowedHosts();
+    method public boolean isValidHost(androidx.car.app.HostInfo);
+    field public static final androidx.car.app.validation.HostValidator ALLOW_ALL_HOSTS_VALIDATOR;
+    field public static final String TEMPLATE_RENDERER_PERMISSION = "android.car.permission.TEMPLATE_RENDERER";
+  }
+
+  public static final class HostValidator.Builder {
+    ctor public HostValidator.Builder(android.content.Context);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHost(String, String);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHosts(@ArrayRes int);
+    method public androidx.car.app.validation.HostValidator build();
+  }
+
+}
+
+package androidx.car.app.versioning {
+
+  public final class CarAppApiLevels {
+    method public static int getLatest();
+    method public static int getOldest();
+    field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
+    field public static final int LEVEL_3 = 3; // 0x3
+    field public static final int LEVEL_4 = 4; // 0x4
+  }
+
+}
+
diff --git a/car/app/app/api/OWNERS b/car/app/app/api/OWNERS
index 3c42cee..5e04c8a 100644
--- a/car/app/app/api/OWNERS
+++ b/car/app/app/api/OWNERS
@@ -11,4 +11,6 @@
 [email protected]
 [email protected]
 [email protected]
[email protected]
\ No newline at end of file
[email protected]
[email protected]
[email protected]
\ No newline at end of file
diff --git a/car/app/app/api/public_plus_experimental_1.2.0-beta03.txt b/car/app/app/api/public_plus_experimental_1.2.0-beta03.txt
new file mode 100644
index 0000000..f0bcdbc
--- /dev/null
+++ b/car/app/app/api/public_plus_experimental_1.2.0-beta03.txt
@@ -0,0 +1,1462 @@
+// Signature format: 4.0
+package androidx.car.app {
+
+  @androidx.car.app.annotations.CarProtocol public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
+    method public int getLatestCarAppApiLevel();
+    method public String getLibraryDisplayVersion();
+    method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_METADATA_KEY = "androidx.car.app.minCarApiLevel";
+  }
+
+  public class AppManager implements androidx.car.app.managers.Manager {
+    method public void invalidate();
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
+    method public void showToast(CharSequence, int);
+  }
+
+  public final class CarAppPermission {
+    method public static void checkHasLibraryPermission(android.content.Context, String);
+    method public static void checkHasPermission(android.content.Context, String);
+    field public static final String ACCESS_SURFACE = "androidx.car.app.ACCESS_SURFACE";
+    field public static final String MAP_TEMPLATES = "androidx.car.app.MAP_TEMPLATES";
+    field public static final String NAVIGATION_TEMPLATES = "androidx.car.app.NAVIGATION_TEMPLATES";
+  }
+
+  public abstract class CarAppService extends android.app.Service {
+    ctor public CarAppService();
+    method public abstract androidx.car.app.validation.HostValidator createHostValidator();
+    method @CallSuper public final void dump(java.io.FileDescriptor, java.io.PrintWriter, String![]?);
+    method public final androidx.car.app.Session? getCurrentSession();
+    method public final androidx.car.app.HostInfo? getHostInfo();
+    method @CallSuper public final android.os.IBinder onBind(android.content.Intent);
+    method public abstract androidx.car.app.Session onCreateSession();
+    method public final boolean onUnbind(android.content.Intent);
+    field public static final String CATEGORY_CHARGING_APP = "androidx.car.app.category.CHARGING";
+    field public static final String CATEGORY_NAVIGATION_APP = "androidx.car.app.category.NAVIGATION";
+    field public static final String CATEGORY_PARKING_APP = "androidx.car.app.category.PARKING";
+    field public static final String SERVICE_INTERFACE = "androidx.car.app.CarAppService";
+  }
+
+  public class CarContext extends android.content.ContextWrapper {
+    method public void finishCarApp();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public android.content.ComponentName? getCallingComponent();
+    method public int getCarAppApiLevel();
+    method public Object getCarService(String);
+    method public <T> T getCarService(Class<T!>);
+    method public String getCarServiceName(Class<?>);
+    method public androidx.car.app.HostInfo? getHostInfo();
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsListener);
+    method public void requestPermissions(java.util.List<java.lang.String!>, java.util.concurrent.Executor, androidx.car.app.OnRequestPermissionsListener);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public void setCarAppResult(int, android.content.Intent?);
+    method public void startCarApp(android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
+    field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
+    field public static final String APP_SERVICE = "app";
+    field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
+    field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
+    field @androidx.car.app.annotations.RequiresCarApi(3) public static final String HARDWARE_SERVICE = "hardware";
+    field public static final String NAVIGATION_SERVICE = "navigation";
+    field public static final String SCREEN_SERVICE = "screen";
+  }
+
+  public final class CarToast {
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, @StringRes int, int);
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, CharSequence, int);
+    method public void setDuration(int);
+    method public void setText(@StringRes int);
+    method public void setText(CharSequence);
+    method public void show();
+    field public static final int LENGTH_LONG = 1; // 0x1
+    field public static final int LENGTH_SHORT = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class FailureResponse {
+    ctor public FailureResponse(Throwable);
+    method public int getErrorType();
+    method public String getStackTrace();
+    field public static final int BUNDLER_EXCEPTION = 1; // 0x1
+    field public static final int ILLEGAL_STATE_EXCEPTION = 2; // 0x2
+    field public static final int INVALID_PARAMETER_EXCEPTION = 3; // 0x3
+    field public static final int REMOTE_EXCEPTION = 6; // 0x6
+    field public static final int RUNTIME_EXCEPTION = 5; // 0x5
+    field public static final int SECURITY_EXCEPTION = 4; // 0x4
+    field public static final int UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
+  public final class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
+  }
+
+  public final class HostInfo {
+    ctor public HostInfo(String, int);
+    method public String getPackageName();
+    method public int getUid();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnDoneCallback {
+    method public default void onFailure(androidx.car.app.serialization.Bundleable);
+    method public default void onSuccess(androidx.car.app.serialization.Bundleable?);
+  }
+
+  public interface OnRequestPermissionsListener {
+    method public void onRequestPermissionsResult(java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+  }
+
+  public interface OnScreenResultListener {
+    method public void onScreenResult(Object?);
+  }
+
+  public abstract class Screen implements androidx.lifecycle.LifecycleOwner {
+    ctor protected Screen(androidx.car.app.CarContext);
+    method public final void finish();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public String? getMarker();
+    method public final androidx.car.app.ScreenManager getScreenManager();
+    method public final void invalidate();
+    method public abstract androidx.car.app.model.Template onGetTemplate();
+    method public void setMarker(String?);
+    method public void setResult(Object?);
+  }
+
+  @MainThread public class ScreenManager implements androidx.car.app.managers.Manager {
+    method public int getStackSize();
+    method public androidx.car.app.Screen getTop();
+    method public void pop();
+    method public void popTo(String);
+    method public void popToRoot();
+    method public void push(androidx.car.app.Screen);
+    method public void pushForResult(androidx.car.app.Screen, androidx.car.app.OnScreenResultListener);
+    method public void remove(androidx.car.app.Screen);
+  }
+
+  public abstract class Session implements androidx.lifecycle.LifecycleOwner {
+    ctor public Session();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onCarConfigurationChanged(android.content.res.Configuration);
+    method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
+    method public void onNewIntent(android.content.Intent);
+  }
+
+  public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
+    method public default void onStableAreaChanged(android.graphics.Rect);
+    method public default void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public default void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public default void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SurfaceContainer {
+    ctor public SurfaceContainer(android.view.Surface?, int, int, int);
+    method public int getDpi();
+    method public int getHeight();
+    method public android.view.Surface? getSurface();
+    method public int getWidth();
+  }
+
+}
+
+package androidx.car.app.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface CarProtocol {
+  }
+
+  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface ExperimentalCarApi {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface RequiresCarApi {
+    method public abstract int value();
+  }
+
+}
+
+package androidx.car.app.connection {
+
+  public final class CarConnection {
+    ctor public CarConnection(android.content.Context);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getType();
+    field public static final String ACTION_CAR_CONNECTION_UPDATED = "androidx.car.app.connection.action.CAR_CONNECTION_UPDATED";
+    field public static final String CAR_CONNECTION_STATE = "CarConnectionState";
+    field public static final int CONNECTION_TYPE_NATIVE = 1; // 0x1
+    field public static final int CONNECTION_TYPE_NOT_CONNECTED = 0; // 0x0
+    field public static final int CONNECTION_TYPE_PROJECTION = 2; // 0x2
+  }
+
+}
+
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager implements androidx.car.app.managers.Manager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarHardwareManager extends androidx.car.app.managers.Manager {
+    method public default androidx.car.app.hardware.info.CarInfo getCarInfo();
+    method public default androidx.car.app.hardware.info.CarSensors getCarSensors();
+  }
+
+}
+
+package androidx.car.app.hardware.common {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    method public static String toString(int);
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int IMPERIAL_GALLON = 204; // 0xcc
+    field public static final int KILOMETER = 3; // 0x3
+    field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int LITER = 202; // 0xca
+    field public static final int METER = 2; // 0x2
+    field public static final int METERS_PER_SEC = 101; // 0x65
+    field public static final int MILE = 4; // 0x4
+    field public static final int MILES_PER_HOUR = 103; // 0x67
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int MILLILITER = 201; // 0xc9
+    field public static final int MILLIMETER = 1; // 0x1
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int US_GALLON = 203; // 0xcb
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
+    ctor public CarValue(T?, long, int);
+    method public int getStatus();
+    method public long getTimestampMillis();
+    method public T? getValue();
+    field public static final int STATUS_SUCCESS = 1; // 0x1
+    field public static final int STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final int STATUS_UNIMPLEMENTED = 2; // 0x2
+    field public static final int STATUS_UNKNOWN = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public interface OnCarDataAvailableListener<T> {
+    method public void onCarDataAvailable(T);
+  }
+
+}
+
+package androidx.car.app.hardware.info {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
+    ctor public Accelerometer(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getForces();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
+    ctor public CarHardwareLocation(androidx.car.app.hardware.common.CarValue<android.location.Location!>);
+    method public androidx.car.app.hardware.common.CarValue<android.location.Location!> getLocation();
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarInfo {
+    method public void addEnergyLevelListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void addMileageListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void addSpeedListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void addTollListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+    method public void fetchEnergyProfile(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyProfile!>);
+    method public void fetchModel(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Model!>);
+    method public void removeEnergyLevelListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void removeMileageListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void removeSpeedListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void removeTollListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarSensors {
+    method public void addAccelerometerListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void addCarHardwareLocationListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void addCompassListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void addGyroscopeListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    method public void removeAccelerometerListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void removeCarHardwareLocationListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void removeCompassListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void removeGyroscopeListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    field public static final int UPDATE_RATE_FASTEST = 3; // 0x3
+    field public static final int UPDATE_RATE_NORMAL = 1; // 0x1
+    field public static final int UPDATE_RATE_UI = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
+    ctor public Compass(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getOrientations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getBatteryPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getFuelVolumeDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
+  }
+
+  public static final class EnergyLevel.Builder {
+    ctor public EnergyLevel.Builder();
+    method public androidx.car.app.hardware.info.EnergyLevel build();
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setBatteryPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelVolumeDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getEvConnectorTypes();
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getFuelTypes();
+    field public static final int EVCONNECTOR_TYPE_CHADEMO = 3; // 0x3
+    field public static final int EVCONNECTOR_TYPE_COMBO_1 = 4; // 0x4
+    field public static final int EVCONNECTOR_TYPE_COMBO_2 = 5; // 0x5
+    field public static final int EVCONNECTOR_TYPE_GBT = 9; // 0x9
+    field public static final int EVCONNECTOR_TYPE_GBT_DC = 10; // 0xa
+    field public static final int EVCONNECTOR_TYPE_J1772 = 1; // 0x1
+    field public static final int EVCONNECTOR_TYPE_MENNEKES = 2; // 0x2
+    field public static final int EVCONNECTOR_TYPE_OTHER = 101; // 0x65
+    field public static final int EVCONNECTOR_TYPE_SCAME = 11; // 0xb
+    field public static final int EVCONNECTOR_TYPE_TESLA_HPWC = 7; // 0x7
+    field public static final int EVCONNECTOR_TYPE_TESLA_ROADSTER = 6; // 0x6
+    field public static final int EVCONNECTOR_TYPE_TESLA_SUPERCHARGER = 8; // 0x8
+    field public static final int EVCONNECTOR_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_BIODIESEL = 5; // 0x5
+    field public static final int FUEL_TYPE_CNG = 8; // 0x8
+    field public static final int FUEL_TYPE_DIESEL_1 = 3; // 0x3
+    field public static final int FUEL_TYPE_DIESEL_2 = 4; // 0x4
+    field public static final int FUEL_TYPE_E85 = 6; // 0x6
+    field public static final int FUEL_TYPE_ELECTRIC = 10; // 0xa
+    field public static final int FUEL_TYPE_HYDROGEN = 11; // 0xb
+    field public static final int FUEL_TYPE_LEADED = 2; // 0x2
+    field public static final int FUEL_TYPE_LNG = 9; // 0x9
+    field public static final int FUEL_TYPE_LPG = 7; // 0x7
+    field public static final int FUEL_TYPE_OTHER = 12; // 0xc
+    field public static final int FUEL_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_UNLEADED = 1; // 0x1
+  }
+
+  public static final class EnergyProfile.Builder {
+    ctor public EnergyProfile.Builder();
+    method public androidx.car.app.hardware.info.EnergyProfile build();
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setEvConnectorTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setFuelTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
+    ctor public Gyroscope(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getRotations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getOdometerMeters();
+  }
+
+  public static final class Mileage.Builder {
+    ctor public Mileage.Builder();
+    method public androidx.car.app.hardware.info.Mileage build();
+    method public androidx.car.app.hardware.info.Mileage.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.Mileage.Builder setOdometerMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getManufacturer();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getName();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getYear();
+  }
+
+  public static final class Model.Builder {
+    ctor public Model.Builder();
+    method public androidx.car.app.hardware.info.Model build();
+    method public androidx.car.app.hardware.info.Model.Builder setManufacturer(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setName(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setYear(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getDisplaySpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRawSpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getSpeedDisplayUnit();
+  }
+
+  public static final class Speed.Builder {
+    ctor public Speed.Builder();
+    method public androidx.car.app.hardware.info.Speed build();
+    method public androidx.car.app.hardware.info.Speed.Builder setDisplaySpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setRawSpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setSpeedDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getCardState();
+    field public static final int TOLLCARD_STATE_INVALID = 2; // 0x2
+    field public static final int TOLLCARD_STATE_NOT_INSERTED = 3; // 0x3
+    field public static final int TOLLCARD_STATE_UNKNOWN = 0; // 0x0
+    field public static final int TOLLCARD_STATE_VALID = 1; // 0x1
+  }
+
+  public static final class TollCard.Builder {
+    ctor public TollCard.Builder();
+    method public androidx.car.app.hardware.info.TollCard build();
+    method public androidx.car.app.hardware.info.TollCard.Builder setCardState(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+}
+
+package androidx.car.app.managers {
+
+  public interface Manager {
+  }
+
+}
+
+package androidx.car.app.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Action {
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public int getFlags();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public int getType();
+    method public boolean isStandard();
+    method public static String typeToString(int);
+    field public static final androidx.car.app.model.Action APP_ICON;
+    field public static final androidx.car.app.model.Action BACK;
+    field @androidx.car.app.annotations.RequiresCarApi(4) public static final int FLAG_PRIMARY = 1; // 0x1
+    field public static final androidx.car.app.model.Action PAN;
+    field public static final int TYPE_APP_ICON = 65538; // 0x10002
+    field public static final int TYPE_BACK = 65539; // 0x10003
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
+  }
+
+  public static final class Action.Builder {
+    ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action build();
+    method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Action.Builder setFlags(int);
+    method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getFirstActionOfType(int);
+  }
+
+  public static final class ActionStrip.Builder {
+    ctor public ActionStrip.Builder();
+    method public androidx.car.app.model.ActionStrip.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ActionStrip build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarColor {
+    method public static androidx.car.app.model.CarColor createCustom(@ColorInt int, @ColorInt int);
+    method @ColorInt public int getColor();
+    method @ColorInt public int getColorDark();
+    method public int getType();
+    field public static final androidx.car.app.model.CarColor BLUE;
+    field public static final androidx.car.app.model.CarColor DEFAULT;
+    field public static final androidx.car.app.model.CarColor GREEN;
+    field public static final androidx.car.app.model.CarColor PRIMARY;
+    field public static final androidx.car.app.model.CarColor RED;
+    field public static final androidx.car.app.model.CarColor SECONDARY;
+    field public static final int TYPE_BLUE = 6; // 0x6
+    field public static final int TYPE_CUSTOM = 0; // 0x0
+    field public static final int TYPE_DEFAULT = 1; // 0x1
+    field public static final int TYPE_GREEN = 5; // 0x5
+    field public static final int TYPE_PRIMARY = 2; // 0x2
+    field public static final int TYPE_RED = 4; // 0x4
+    field public static final int TYPE_SECONDARY = 3; // 0x3
+    field public static final int TYPE_YELLOW = 7; // 0x7
+    field public static final androidx.car.app.model.CarColor YELLOW;
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIcon {
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public androidx.car.app.model.CarColor? getTint();
+    method public int getType();
+    field public static final androidx.car.app.model.CarIcon ALERT;
+    field public static final androidx.car.app.model.CarIcon APP_ICON;
+    field public static final androidx.car.app.model.CarIcon BACK;
+    field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
+    field public static final int TYPE_ALERT = 4; // 0x4
+    field public static final int TYPE_APP_ICON = 5; // 0x5
+    field public static final int TYPE_BACK = 3; // 0x3
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
+  }
+
+  public static final class CarIcon.Builder {
+    ctor public CarIcon.Builder(androidx.core.graphics.drawable.IconCompat);
+    ctor public CarIcon.Builder(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.CarIcon build();
+    method public androidx.car.app.model.CarIcon.Builder setTint(androidx.car.app.model.CarColor);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIconSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon);
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon, int);
+    method public int getAlignment();
+    method public androidx.car.app.model.CarIcon getIcon();
+    field public static final int ALIGN_BASELINE = 1; // 0x1
+    field public static final int ALIGN_BOTTOM = 0; // 0x0
+    field public static final int ALIGN_CENTER = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarLocation {
+    method public static androidx.car.app.model.CarLocation create(double, double);
+    method public static androidx.car.app.model.CarLocation create(android.location.Location);
+    method public double getLatitude();
+    method public double getLongitude();
+  }
+
+  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+    ctor public CarSpan();
+    method public void updateDrawState(android.text.TextPaint);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarText {
+    method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
+    method public boolean isEmpty();
+    method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
+    method public CharSequence toCharSequence();
+  }
+
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
+    method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
+    method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
+    method @RequiresApi(26) public static androidx.car.app.model.DateTimeWithZone create(java.time.ZonedDateTime);
+    method public long getTimeSinceEpochMillis();
+    method public int getZoneOffsetSeconds();
+    method public String? getZoneShortName();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Distance {
+    method public static androidx.car.app.model.Distance create(double, int);
+    method public double getDisplayDistance();
+    method public int getDisplayUnit();
+    field public static final int UNIT_FEET = 6; // 0x6
+    field public static final int UNIT_KILOMETERS = 2; // 0x2
+    field public static final int UNIT_KILOMETERS_P1 = 3; // 0x3
+    field public static final int UNIT_METERS = 1; // 0x1
+    field public static final int UNIT_MILES = 4; // 0x4
+    field public static final int UNIT_MILES_P1 = 5; // 0x5
+    field public static final int UNIT_YARDS = 7; // 0x7
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DistanceSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DistanceSpan create(androidx.car.app.model.Distance);
+    method public androidx.car.app.model.Distance getDistance();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DurationSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DurationSpan create(long);
+    method @RequiresApi(26) public static androidx.car.app.model.DurationSpan create(java.time.Duration);
+    method public long getDurationSeconds();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ForegroundCarColorSpan create(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.CarColor getColor();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public int getImageType();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+    field public static final int IMAGE_TYPE_ICON = 1; // 0x1
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+  }
+
+  public static final class GridItem.Builder {
+    ctor public GridItem.Builder();
+    method public androidx.car.app.model.GridItem build();
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class GridTemplate.Builder {
+    ctor public GridTemplate.Builder();
+    method public androidx.car.app.model.GridTemplate build();
+    method public androidx.car.app.model.GridTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.GridTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.GridTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public default void onInputSubmitted(String);
+    method public default void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Item {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ItemList {
+    method public java.util.List<androidx.car.app.model.Item!> getItems();
+    method public androidx.car.app.model.CarText? getNoItemsMessage();
+    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
+    method public androidx.car.app.model.OnSelectedDelegate? getOnSelectedDelegate();
+    method public int getSelectedIndex();
+  }
+
+  public static final class ItemList.Builder {
+    ctor public ItemList.Builder();
+    method public androidx.car.app.model.ItemList.Builder addItem(androidx.car.app.model.Item);
+    method public androidx.car.app.model.ItemList build();
+    method public androidx.car.app.model.ItemList.Builder setNoItemsMessage(CharSequence);
+    method public androidx.car.app.model.ItemList.Builder setOnItemsVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener);
+    method public androidx.car.app.model.ItemList.Builder setOnSelectedListener(androidx.car.app.model.ItemList.OnSelectedListener);
+    method public androidx.car.app.model.ItemList.Builder setSelectedIndex(@IntRange(from=0) int);
+  }
+
+  public static interface ItemList.OnItemVisibilityChangedListener {
+    method public void onItemVisibilityChanged(int, int);
+  }
+
+  public static interface ItemList.OnSelectedListener {
+    method public void onSelected(int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ListTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public java.util.List<androidx.car.app.model.SectionedItemList!> getSectionedLists();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class ListTemplate.Builder {
+    ctor public ListTemplate.Builder();
+    method public androidx.car.app.model.ListTemplate.Builder addSectionedList(androidx.car.app.model.SectionedItemList);
+    method public androidx.car.app.model.ListTemplate build();
+    method public androidx.car.app.model.ListTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.ListTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ListTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.ListTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getDebugMessage();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
+  }
+
+  public static final class MessageTemplate.Builder {
+    ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
+    method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Metadata {
+    method public androidx.car.app.model.Place? getPlace();
+    field public static final androidx.car.app.model.Metadata EMPTY_METADATA;
+  }
+
+  public static final class Metadata.Builder {
+    ctor public Metadata.Builder();
+    ctor public Metadata.Builder(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Metadata build();
+    method public androidx.car.app.model.Metadata.Builder setPlace(androidx.car.app.model.Place);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnCheckedChangeDelegate {
+    method public void sendCheckedChange(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnClickDelegate {
+    method public boolean isParkedOnly();
+    method public void sendClick(androidx.car.app.OnDoneCallback);
+  }
+
+  public interface OnClickListener {
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi public interface OnContentRefreshDelegate {
+    method public void sendContentRefreshRequested(androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.ExperimentalCarApi public interface OnContentRefreshListener {
+    method public void onContentRefreshRequested();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
+    method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnSelectedDelegate {
+    method public void sendSelected(int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Pane {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.CarIcon? getImage();
+    method public java.util.List<androidx.car.app.model.Row!> getRows();
+    method public boolean isLoading();
+  }
+
+  public static final class Pane.Builder {
+    ctor public Pane.Builder();
+    method public androidx.car.app.model.Pane.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Pane.Builder addRow(androidx.car.app.model.Row);
+    method public androidx.car.app.model.Pane build();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Pane.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Pane.Builder setLoading(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PaneTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.Pane getPane();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class PaneTemplate.Builder {
+    ctor public PaneTemplate.Builder(androidx.car.app.model.Pane);
+    method public androidx.car.app.model.PaneTemplate build();
+    method public androidx.car.app.model.PaneTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PaneTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PaneTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
+    method public static androidx.car.app.model.ParkedOnlyOnClickListener create(androidx.car.app.model.OnClickListener);
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Place {
+    method public androidx.car.app.model.CarLocation getLocation();
+    method public androidx.car.app.model.PlaceMarker? getMarker();
+  }
+
+  public static final class Place.Builder {
+    ctor public Place.Builder(androidx.car.app.model.CarLocation);
+    ctor public Place.Builder(androidx.car.app.model.Place);
+    method public androidx.car.app.model.Place build();
+    method public androidx.car.app.model.Place.Builder setMarker(androidx.car.app.model.PlaceMarker);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Place? getAnchor();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isCurrentLocationEnabled();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListMapTemplate.Builder {
+    ctor public PlaceListMapTemplate.Builder();
+    method public androidx.car.app.model.PlaceListMapTemplate build();
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setAnchor(androidx.car.app.model.Place);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setCurrentLocationEnabled(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.PlaceListMapTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
+    method public androidx.car.app.model.CarColor? getColor();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getIconType();
+    method public androidx.car.app.model.CarText? getLabel();
+    field public static final int TYPE_ICON = 0; // 0x0
+    field public static final int TYPE_IMAGE = 1; // 0x1
+  }
+
+  public static final class PlaceMarker.Builder {
+    ctor public PlaceMarker.Builder();
+    method public androidx.car.app.model.PlaceMarker build();
+    method public androidx.car.app.model.PlaceMarker.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.PlaceMarker.Builder setIcon(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.PlaceMarker.Builder setLabel(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.Metadata? getMetadata();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public int getRowImageType();
+    method public java.util.List<androidx.car.app.model.CarText!> getTexts();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public androidx.car.app.model.Toggle? getToggle();
+    method public boolean isBrowsable();
+    method public androidx.car.app.model.Row row();
+    method public CharSequence yourBoat();
+    field public static final int IMAGE_TYPE_ICON = 4; // 0x4
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+    field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+  }
+
+  public static final class Row.Builder {
+    ctor public Row.Builder();
+    method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row build();
+    method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface SearchCallbackDelegate {
+    method public void sendSearchSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendSearchTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SearchTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public String? getInitialSearchText();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackDelegate getSearchCallbackDelegate();
+    method public String? getSearchHint();
+    method public boolean isLoading();
+    method public boolean isShowKeyboardByDefault();
+  }
+
+  public static final class SearchTemplate.Builder {
+    ctor public SearchTemplate.Builder(androidx.car.app.model.SearchTemplate.SearchCallback);
+    method public androidx.car.app.model.SearchTemplate build();
+    method public androidx.car.app.model.SearchTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.SearchTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.SearchTemplate.Builder setInitialSearchText(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.SearchTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.SearchTemplate.Builder setSearchHint(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  public static interface SearchTemplate.SearchCallback {
+    method public default void onSearchSubmitted(String);
+    method public default void onSearchTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SectionedItemList {
+    method public static androidx.car.app.model.SectionedItemList create(androidx.car.app.model.ItemList, CharSequence);
+    method public androidx.car.app.model.CarText getHeader();
+    method public androidx.car.app.model.ItemList getItemList();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Template {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateInfo {
+    ctor public TemplateInfo(Class<? extends androidx.car.app.model.Template>, String);
+    method public Class<? extends androidx.car.app.model.Template> getTemplateClass();
+    method public String getTemplateId();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateWrapper {
+    method public static androidx.car.app.model.TemplateWrapper copyOf(androidx.car.app.model.TemplateWrapper);
+    method public int getCurrentTaskStep();
+    method public String getId();
+    method public androidx.car.app.model.Template getTemplate();
+    method public java.util.List<androidx.car.app.model.TemplateInfo!> getTemplateInfosForScreenStack();
+    method public boolean isRefresh();
+    method public void setCurrentTaskStep(int);
+    method public void setId(String);
+    method public void setRefresh(boolean);
+    method public void setTemplate(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template, String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Toggle {
+    method public androidx.car.app.model.OnCheckedChangeDelegate getOnCheckedChangeDelegate();
+    method public boolean isChecked();
+  }
+
+  public static final class Toggle.Builder {
+    ctor public Toggle.Builder(androidx.car.app.model.Toggle.OnCheckedChangeListener);
+    method public androidx.car.app.model.Toggle build();
+    method public androidx.car.app.model.Toggle.Builder setChecked(boolean);
+  }
+
+  public static interface Toggle.OnCheckedChangeListener {
+    method public void onCheckedChange(boolean);
+  }
+
+}
+
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public PinSignInMethod(CharSequence);
+    method public androidx.car.app.model.CarText getPinCode();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public ProviderSignInMethod(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public QRCodeSignInMethod(android.net.Uri);
+    method public android.net.Uri getUri();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
+package androidx.car.app.navigation {
+
+  public class NavigationManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void clearNavigationManagerCallback();
+    method @MainThread public void navigationEnded();
+    method @MainThread public void navigationStarted();
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
+  }
+
+  public interface NavigationManagerCallback {
+    method public default void onAutoDriveEnabled();
+    method public default void onStopNavigation();
+  }
+
+}
+
+package androidx.car.app.navigation.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Destination {
+    method public androidx.car.app.model.CarText? getAddress();
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getName();
+  }
+
+  public static final class Destination.Builder {
+    ctor public Destination.Builder();
+    method public androidx.car.app.navigation.model.Destination build();
+    method public androidx.car.app.navigation.model.Destination.Builder setAddress(CharSequence);
+    method public androidx.car.app.navigation.model.Destination.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Destination.Builder setName(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Lane {
+    method public java.util.List<androidx.car.app.navigation.model.LaneDirection!> getDirections();
+  }
+
+  public static final class Lane.Builder {
+    ctor public Lane.Builder();
+    method public androidx.car.app.navigation.model.Lane.Builder addDirection(androidx.car.app.navigation.model.LaneDirection);
+    method public androidx.car.app.navigation.model.Lane build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class LaneDirection {
+    method public static androidx.car.app.navigation.model.LaneDirection create(int, boolean);
+    method public int getShape();
+    method public boolean isRecommended();
+    field public static final int SHAPE_NORMAL_LEFT = 5; // 0x5
+    field public static final int SHAPE_NORMAL_RIGHT = 6; // 0x6
+    field public static final int SHAPE_SHARP_LEFT = 7; // 0x7
+    field public static final int SHAPE_SHARP_RIGHT = 8; // 0x8
+    field public static final int SHAPE_SLIGHT_LEFT = 3; // 0x3
+    field public static final int SHAPE_SLIGHT_RIGHT = 4; // 0x4
+    field public static final int SHAPE_STRAIGHT = 2; // 0x2
+    field public static final int SHAPE_UNKNOWN = 1; // 0x1
+    field public static final int SHAPE_U_TURN_LEFT = 9; // 0x9
+    field public static final int SHAPE_U_TURN_RIGHT = 10; // 0xa
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Maneuver {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getRoundaboutExitAngle();
+    method public int getRoundaboutExitNumber();
+    method public int getType();
+    field public static final int TYPE_DEPART = 1; // 0x1
+    field public static final int TYPE_DESTINATION = 39; // 0x27
+    field public static final int TYPE_DESTINATION_LEFT = 41; // 0x29
+    field public static final int TYPE_DESTINATION_RIGHT = 42; // 0x2a
+    field public static final int TYPE_DESTINATION_STRAIGHT = 40; // 0x28
+    field public static final int TYPE_FERRY_BOAT = 37; // 0x25
+    field public static final int TYPE_FERRY_BOAT_LEFT = 47; // 0x2f
+    field public static final int TYPE_FERRY_BOAT_RIGHT = 48; // 0x30
+    field public static final int TYPE_FERRY_TRAIN = 38; // 0x26
+    field public static final int TYPE_FERRY_TRAIN_LEFT = 49; // 0x31
+    field public static final int TYPE_FERRY_TRAIN_RIGHT = 50; // 0x32
+    field public static final int TYPE_FORK_LEFT = 25; // 0x19
+    field public static final int TYPE_FORK_RIGHT = 26; // 0x1a
+    field public static final int TYPE_KEEP_LEFT = 3; // 0x3
+    field public static final int TYPE_KEEP_RIGHT = 4; // 0x4
+    field public static final int TYPE_MERGE_LEFT = 27; // 0x1b
+    field public static final int TYPE_MERGE_RIGHT = 28; // 0x1c
+    field public static final int TYPE_MERGE_SIDE_UNSPECIFIED = 29; // 0x1d
+    field public static final int TYPE_NAME_CHANGE = 2; // 0x2
+    field public static final int TYPE_OFF_RAMP_NORMAL_LEFT = 23; // 0x17
+    field public static final int TYPE_OFF_RAMP_NORMAL_RIGHT = 24; // 0x18
+    field public static final int TYPE_OFF_RAMP_SLIGHT_LEFT = 21; // 0x15
+    field public static final int TYPE_OFF_RAMP_SLIGHT_RIGHT = 22; // 0x16
+    field public static final int TYPE_ON_RAMP_NORMAL_LEFT = 15; // 0xf
+    field public static final int TYPE_ON_RAMP_NORMAL_RIGHT = 16; // 0x10
+    field public static final int TYPE_ON_RAMP_SHARP_LEFT = 17; // 0x11
+    field public static final int TYPE_ON_RAMP_SHARP_RIGHT = 18; // 0x12
+    field public static final int TYPE_ON_RAMP_SLIGHT_LEFT = 13; // 0xd
+    field public static final int TYPE_ON_RAMP_SLIGHT_RIGHT = 14; // 0xe
+    field public static final int TYPE_ON_RAMP_U_TURN_LEFT = 19; // 0x13
+    field public static final int TYPE_ON_RAMP_U_TURN_RIGHT = 20; // 0x14
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW = 34; // 0x22
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE = 35; // 0x23
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW = 32; // 0x20
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW_WITH_ANGLE = 33; // 0x21
+    field public static final int TYPE_ROUNDABOUT_ENTER_CCW = 45; // 0x2d
+    field public static final int TYPE_ROUNDABOUT_ENTER_CW = 43; // 0x2b
+    field public static final int TYPE_ROUNDABOUT_EXIT_CCW = 46; // 0x2e
+    field public static final int TYPE_ROUNDABOUT_EXIT_CW = 44; // 0x2c
+    field public static final int TYPE_STRAIGHT = 36; // 0x24
+    field public static final int TYPE_TURN_NORMAL_LEFT = 7; // 0x7
+    field public static final int TYPE_TURN_NORMAL_RIGHT = 8; // 0x8
+    field public static final int TYPE_TURN_SHARP_LEFT = 9; // 0x9
+    field public static final int TYPE_TURN_SHARP_RIGHT = 10; // 0xa
+    field public static final int TYPE_TURN_SLIGHT_LEFT = 5; // 0x5
+    field public static final int TYPE_TURN_SLIGHT_RIGHT = 6; // 0x6
+    field public static final int TYPE_UNKNOWN = 0; // 0x0
+    field public static final int TYPE_U_TURN_LEFT = 11; // 0xb
+    field public static final int TYPE_U_TURN_RIGHT = 12; // 0xc
+  }
+
+  public static final class Maneuver.Builder {
+    ctor public Maneuver.Builder(int);
+    method public androidx.car.app.navigation.model.Maneuver build();
+    method public androidx.car.app.navigation.model.Maneuver.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitAngle(@IntRange(from=1, to=360) int);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitNumber(@IntRange(from=1) int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class MessageInfo.Builder {
+    ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo build();
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class NavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
+  }
+
+  public static final class NavigationTemplate.Builder {
+    ctor public NavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.NavigationTemplate build();
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  public static interface NavigationTemplate.NavigationInfo {
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public interface PanModeDelegate {
+    method public void sendPanModeChanged(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.model.OnContentRefreshDelegate? getOnContentRefreshDelegate();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListNavigationTemplate.Builder {
+    ctor public PlaceListNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate build();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setOnContentRefreshListener(androidx.car.app.model.OnContentRefreshListener);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.Action? getNavigateAction();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutePreviewNavigationTemplate.Builder {
+    ctor public RoutePreviewNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate build();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.Distance? getCurrentDistance();
+    method public androidx.car.app.navigation.model.Step? getCurrentStep();
+    method public androidx.car.app.model.CarIcon? getJunctionImage();
+    method public androidx.car.app.navigation.model.Step? getNextStep();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutingInfo.Builder {
+    ctor public RoutingInfo.Builder();
+    method public androidx.car.app.navigation.model.RoutingInfo build();
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setCurrentStep(androidx.car.app.navigation.model.Step, androidx.car.app.model.Distance);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setJunctionImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setLoading(boolean);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setNextStep(androidx.car.app.navigation.model.Step);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Step {
+    method public androidx.car.app.model.CarText? getCue();
+    method public java.util.List<androidx.car.app.navigation.model.Lane!> getLanes();
+    method public androidx.car.app.model.CarIcon? getLanesImage();
+    method public androidx.car.app.navigation.model.Maneuver? getManeuver();
+    method public androidx.car.app.model.CarText? getRoad();
+  }
+
+  public static final class Step.Builder {
+    ctor public Step.Builder();
+    ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
+    method public androidx.car.app.navigation.model.Step build();
+    method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
+    method public androidx.car.app.navigation.model.Step.Builder setLanesImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Step.Builder setManeuver(androidx.car.app.navigation.model.Maneuver);
+    method public androidx.car.app.navigation.model.Step.Builder setRoad(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TravelEstimate {
+    method public androidx.car.app.model.DateTimeWithZone? getArrivalTimeAtDestination();
+    method public androidx.car.app.model.Distance? getRemainingDistance();
+    method public androidx.car.app.model.CarColor? getRemainingDistanceColor();
+    method public androidx.car.app.model.CarColor? getRemainingTimeColor();
+    method public long getRemainingTimeSeconds();
+    field public static final long REMAINING_TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+  }
+
+  public static final class TravelEstimate.Builder {
+    ctor public TravelEstimate.Builder(androidx.car.app.model.Distance, androidx.car.app.model.DateTimeWithZone);
+    ctor @RequiresApi(26) public TravelEstimate.Builder(androidx.car.app.model.Distance, java.time.ZonedDateTime);
+    method public androidx.car.app.navigation.model.TravelEstimate build();
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingDistanceColor(androidx.car.app.model.CarColor);
+    method @RequiresApi(26) public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTime(java.time.Duration);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeSeconds(@IntRange(from=0xffffffff) long);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Trip {
+    method public androidx.car.app.model.CarText? getCurrentRoad();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getDestinationTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Destination!> getDestinations();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getStepTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Step!> getSteps();
+    method public boolean isLoading();
+  }
+
+  public static final class Trip.Builder {
+    ctor public Trip.Builder();
+    method public androidx.car.app.navigation.model.Trip.Builder addDestination(androidx.car.app.navigation.model.Destination, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip.Builder addStep(androidx.car.app.navigation.model.Step, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip build();
+    method public androidx.car.app.navigation.model.Trip.Builder setCurrentRoad(CharSequence);
+    method public androidx.car.app.navigation.model.Trip.Builder setLoading(boolean);
+  }
+
+}
+
+package androidx.car.app.notification {
+
+  public final class CarAppExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public CarAppExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
+    method public androidx.car.app.model.CarColor? getColor();
+    method public android.app.PendingIntent? getContentIntent();
+    method public CharSequence? getContentText();
+    method public CharSequence? getContentTitle();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method public int getImportance();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @DrawableRes public int getSmallIcon();
+    method public static boolean isExtended(android.app.Notification);
+  }
+
+  public static final class CarAppExtender.Builder {
+    ctor public CarAppExtender.Builder();
+    method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
+    method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentTitle(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setDeleteIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setImportance(int);
+    method public androidx.car.app.notification.CarAppExtender.Builder setLargeIcon(android.graphics.Bitmap);
+    method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
+  }
+
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
+}
+
+package androidx.car.app.serialization {
+
+  public final class Bundleable implements android.os.Parcelable {
+    method public static androidx.car.app.serialization.Bundleable create(Object) throws androidx.car.app.serialization.BundlerException;
+    method public int describeContents();
+    method public Object get() throws androidx.car.app.serialization.BundlerException;
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.car.app.serialization.Bundleable!> CREATOR;
+  }
+
+  public class BundlerException extends java.lang.Exception {
+    ctor public BundlerException(String?, Throwable);
+    ctor public BundlerException(String?);
+  }
+
+}
+
+package androidx.car.app.validation {
+
+  public final class HostValidator {
+    method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getAllowedHosts();
+    method public boolean isValidHost(androidx.car.app.HostInfo);
+    field public static final androidx.car.app.validation.HostValidator ALLOW_ALL_HOSTS_VALIDATOR;
+    field public static final String TEMPLATE_RENDERER_PERMISSION = "android.car.permission.TEMPLATE_RENDERER";
+  }
+
+  public static final class HostValidator.Builder {
+    ctor public HostValidator.Builder(android.content.Context);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHost(String, String);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHosts(@ArrayRes int);
+    method public androidx.car.app.validation.HostValidator build();
+  }
+
+}
+
+package androidx.car.app.versioning {
+
+  public final class CarAppApiLevels {
+    method public static int getLatest();
+    method public static int getOldest();
+    field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
+    field public static final int LEVEL_3 = 3; // 0x3
+    field public static final int LEVEL_4 = 4; // 0x4
+  }
+
+}
+
diff --git a/car/app/app/api/res-1.2.0-beta03.txt b/car/app/app/api/res-1.2.0-beta03.txt
new file mode 100644
index 0000000..686fc80
--- /dev/null
+++ b/car/app/app/api/res-1.2.0-beta03.txt
@@ -0,0 +1,5 @@
+attr carColorPrimary
+attr carColorPrimaryDark
+attr carColorSecondary
+attr carColorSecondaryDark
+attr carPermissionActivityLayout
diff --git a/car/app/app/api/restricted_1.2.0-beta03.txt b/car/app/app/api/restricted_1.2.0-beta03.txt
new file mode 100644
index 0000000..a6a92f8
--- /dev/null
+++ b/car/app/app/api/restricted_1.2.0-beta03.txt
@@ -0,0 +1,1441 @@
+// Signature format: 4.0
+package androidx.car.app {
+
+  @androidx.car.app.annotations.CarProtocol public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
+    method public int getLatestCarAppApiLevel();
+    method public String getLibraryDisplayVersion();
+    method public int getMinCarAppApiLevel();
+    field public static final String MIN_API_LEVEL_METADATA_KEY = "androidx.car.app.minCarApiLevel";
+  }
+
+  public class AppManager implements androidx.car.app.managers.Manager {
+    method public void invalidate();
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
+    method public void showToast(CharSequence, int);
+  }
+
+  public final class CarAppPermission {
+    method public static void checkHasLibraryPermission(android.content.Context, String);
+    method public static void checkHasPermission(android.content.Context, String);
+    field public static final String ACCESS_SURFACE = "androidx.car.app.ACCESS_SURFACE";
+    field public static final String MAP_TEMPLATES = "androidx.car.app.MAP_TEMPLATES";
+    field public static final String NAVIGATION_TEMPLATES = "androidx.car.app.NAVIGATION_TEMPLATES";
+  }
+
+  public abstract class CarAppService extends android.app.Service {
+    ctor public CarAppService();
+    method public abstract androidx.car.app.validation.HostValidator createHostValidator();
+    method @CallSuper public final void dump(java.io.FileDescriptor, java.io.PrintWriter, String![]?);
+    method public final androidx.car.app.Session? getCurrentSession();
+    method public final androidx.car.app.HostInfo? getHostInfo();
+    method @CallSuper public final android.os.IBinder onBind(android.content.Intent);
+    method public abstract androidx.car.app.Session onCreateSession();
+    method public final boolean onUnbind(android.content.Intent);
+    field public static final String CATEGORY_CHARGING_APP = "androidx.car.app.category.CHARGING";
+    field public static final String CATEGORY_NAVIGATION_APP = "androidx.car.app.category.NAVIGATION";
+    field public static final String CATEGORY_PARKING_APP = "androidx.car.app.category.PARKING";
+    field public static final String SERVICE_INTERFACE = "androidx.car.app.CarAppService";
+  }
+
+  public class CarContext extends android.content.ContextWrapper {
+    method public void finishCarApp();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public android.content.ComponentName? getCallingComponent();
+    method public int getCarAppApiLevel();
+    method public Object getCarService(String);
+    method public <T> T getCarService(Class<T!>);
+    method public String getCarServiceName(Class<?>);
+    method public androidx.car.app.HostInfo? getHostInfo();
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public boolean isDarkMode();
+    method public void requestPermissions(java.util.List<java.lang.String!>, androidx.car.app.OnRequestPermissionsListener);
+    method public void requestPermissions(java.util.List<java.lang.String!>, java.util.concurrent.Executor, androidx.car.app.OnRequestPermissionsListener);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public void setCarAppResult(int, android.content.Intent?);
+    method public void startCarApp(android.content.Intent);
+    method @Deprecated public static void startCarApp(android.content.Intent, android.content.Intent);
+    field public static final String ACTION_NAVIGATE = "androidx.car.app.action.NAVIGATE";
+    field public static final String APP_SERVICE = "app";
+    field public static final String CAR_SERVICE = "car";
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final String CONSTRAINT_SERVICE = "constraints";
+    field public static final String EXTRA_START_CAR_APP_BINDER_KEY = "androidx.car.app.extra.START_CAR_APP_BINDER_KEY";
+    field @androidx.car.app.annotations.RequiresCarApi(3) public static final String HARDWARE_SERVICE = "hardware";
+    field public static final String NAVIGATION_SERVICE = "navigation";
+    field public static final String SCREEN_SERVICE = "screen";
+  }
+
+  public final class CarToast {
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, @StringRes int, int);
+    method public static androidx.car.app.CarToast makeText(androidx.car.app.CarContext, CharSequence, int);
+    method public void setDuration(int);
+    method public void setText(@StringRes int);
+    method public void setText(CharSequence);
+    method public void show();
+    field public static final int LENGTH_LONG = 1; // 0x1
+    field public static final int LENGTH_SHORT = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class FailureResponse {
+    ctor public FailureResponse(Throwable);
+    method public int getErrorType();
+    method public String getStackTrace();
+    field public static final int BUNDLER_EXCEPTION = 1; // 0x1
+    field public static final int ILLEGAL_STATE_EXCEPTION = 2; // 0x2
+    field public static final int INVALID_PARAMETER_EXCEPTION = 3; // 0x3
+    field public static final int REMOTE_EXCEPTION = 6; // 0x6
+    field public static final int RUNTIME_EXCEPTION = 5; // 0x5
+    field public static final int SECURITY_EXCEPTION = 4; // 0x4
+    field public static final int UNKNOWN_ERROR = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
+  public final class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
+  }
+
+  public final class HostInfo {
+    ctor public HostInfo(String, int);
+    method public String getPackageName();
+    method public int getUid();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnDoneCallback {
+    method public default void onFailure(androidx.car.app.serialization.Bundleable);
+    method public default void onSuccess(androidx.car.app.serialization.Bundleable?);
+  }
+
+  public interface OnRequestPermissionsListener {
+    method public void onRequestPermissionsResult(java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+  }
+
+  public interface OnScreenResultListener {
+    method public void onScreenResult(Object?);
+  }
+
+  public abstract class Screen implements androidx.lifecycle.LifecycleOwner {
+    ctor protected Screen(androidx.car.app.CarContext);
+    method public final void finish();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public final androidx.lifecycle.Lifecycle getLifecycle();
+    method public String? getMarker();
+    method public final androidx.car.app.ScreenManager getScreenManager();
+    method public final void invalidate();
+    method public abstract androidx.car.app.model.Template onGetTemplate();
+    method public void setMarker(String?);
+    method public void setResult(Object?);
+  }
+
+  @MainThread public class ScreenManager implements androidx.car.app.managers.Manager {
+    method public int getStackSize();
+    method public androidx.car.app.Screen getTop();
+    method public void pop();
+    method public void popTo(String);
+    method public void popToRoot();
+    method public void push(androidx.car.app.Screen);
+    method public void pushForResult(androidx.car.app.Screen, androidx.car.app.OnScreenResultListener);
+    method public void remove(androidx.car.app.Screen);
+  }
+
+  public abstract class Session implements androidx.lifecycle.LifecycleOwner {
+    ctor public Session();
+    method public final androidx.car.app.CarContext getCarContext();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public void onCarConfigurationChanged(android.content.res.Configuration);
+    method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
+    method public void onNewIntent(android.content.Intent);
+  }
+
+  public interface SurfaceCallback {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onFling(float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScale(float, float, float);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public default void onScroll(float, float);
+    method public default void onStableAreaChanged(android.graphics.Rect);
+    method public default void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public default void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public default void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SurfaceContainer {
+    ctor public SurfaceContainer(android.view.Surface?, int, int, int);
+    method public int getDpi();
+    method public int getHeight();
+    method public android.view.Surface? getSurface();
+    method public int getWidth();
+  }
+
+}
+
+package androidx.car.app.annotations {
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface CarProtocol {
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface RequiresCarApi {
+    method public abstract int value();
+  }
+
+}
+
+package androidx.car.app.connection {
+
+  public final class CarConnection {
+    ctor public CarConnection(android.content.Context);
+    method public androidx.lifecycle.LiveData<java.lang.Integer!> getType();
+    field public static final String ACTION_CAR_CONNECTION_UPDATED = "androidx.car.app.connection.action.CAR_CONNECTION_UPDATED";
+    field public static final String CAR_CONNECTION_STATE = "CarConnectionState";
+    field public static final int CONNECTION_TYPE_NATIVE = 1; // 0x1
+    field public static final int CONNECTION_TYPE_NOT_CONNECTED = 0; // 0x0
+    field public static final int CONNECTION_TYPE_PROJECTION = 2; // 0x2
+  }
+
+}
+
+package androidx.car.app.constraints {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public class ConstraintManager implements androidx.car.app.managers.Manager {
+    method public int getContentLimit(int);
+    field public static final int CONTENT_LIMIT_TYPE_GRID = 1; // 0x1
+    field public static final int CONTENT_LIMIT_TYPE_LIST = 0; // 0x0
+    field public static final int CONTENT_LIMIT_TYPE_PANE = 4; // 0x4
+    field public static final int CONTENT_LIMIT_TYPE_PLACE_LIST = 2; // 0x2
+    field public static final int CONTENT_LIMIT_TYPE_ROUTE_LIST = 3; // 0x3
+  }
+
+}
+
+package androidx.car.app.hardware {
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarHardwareManager extends androidx.car.app.managers.Manager {
+    method public default androidx.car.app.hardware.info.CarInfo getCarInfo();
+    method public default androidx.car.app.hardware.info.CarSensors getCarSensors();
+  }
+
+}
+
+package androidx.car.app.hardware.common {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    method public static String toString(int);
+    field public static final int KILOMETER = 3; // 0x3
+    field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field public static final int METER = 2; // 0x2
+    field public static final int METERS_PER_SEC = 101; // 0x65
+    field public static final int MILE = 4; // 0x4
+    field public static final int MILES_PER_HOUR = 103; // 0x67
+    field public static final int MILLIMETER = 1; // 0x1
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
+    ctor public CarValue(T?, long, int);
+    method public int getStatus();
+    method public long getTimestampMillis();
+    method public T? getValue();
+    field public static final int STATUS_SUCCESS = 1; // 0x1
+    field public static final int STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final int STATUS_UNIMPLEMENTED = 2; // 0x2
+    field public static final int STATUS_UNKNOWN = 0; // 0x0
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public interface OnCarDataAvailableListener<T> {
+    method public void onCarDataAvailable(T);
+  }
+
+}
+
+package androidx.car.app.hardware.info {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
+    ctor public Accelerometer(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getForces();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
+    ctor public CarHardwareLocation(androidx.car.app.hardware.common.CarValue<android.location.Location!>);
+    method public androidx.car.app.hardware.common.CarValue<android.location.Location!> getLocation();
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarInfo {
+    method public void addEnergyLevelListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void addMileageListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void addSpeedListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void addTollListener(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+    method public void fetchEnergyProfile(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyProfile!>);
+    method public void fetchModel(java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Model!>);
+    method public void removeEnergyLevelListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.EnergyLevel!>);
+    method public void removeMileageListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Mileage!>);
+    method public void removeSpeedListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Speed!>);
+    method public void removeTollListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.TollCard!>);
+  }
+
+  @MainThread @androidx.car.app.annotations.RequiresCarApi(3) public interface CarSensors {
+    method public void addAccelerometerListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void addCarHardwareLocationListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void addCompassListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void addGyroscopeListener(int, java.util.concurrent.Executor, androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    method public void removeAccelerometerListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Accelerometer!>);
+    method public void removeCarHardwareLocationListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.CarHardwareLocation!>);
+    method public void removeCompassListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Compass!>);
+    method public void removeGyroscopeListener(androidx.car.app.hardware.common.OnCarDataAvailableListener<androidx.car.app.hardware.info.Gyroscope!>);
+    field public static final int UPDATE_RATE_FASTEST = 3; // 0x3
+    field public static final int UPDATE_RATE_NORMAL = 1; // 0x1
+    field public static final int UPDATE_RATE_UI = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
+    ctor public Compass(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getOrientations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getBatteryPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
+  }
+
+  public static final class EnergyLevel.Builder {
+    ctor public EnergyLevel.Builder();
+    method public androidx.car.app.hardware.info.EnergyLevel build();
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setBatteryPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getEvConnectorTypes();
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getFuelTypes();
+    field public static final int EVCONNECTOR_TYPE_CHADEMO = 3; // 0x3
+    field public static final int EVCONNECTOR_TYPE_COMBO_1 = 4; // 0x4
+    field public static final int EVCONNECTOR_TYPE_COMBO_2 = 5; // 0x5
+    field public static final int EVCONNECTOR_TYPE_GBT = 9; // 0x9
+    field public static final int EVCONNECTOR_TYPE_GBT_DC = 10; // 0xa
+    field public static final int EVCONNECTOR_TYPE_J1772 = 1; // 0x1
+    field public static final int EVCONNECTOR_TYPE_MENNEKES = 2; // 0x2
+    field public static final int EVCONNECTOR_TYPE_OTHER = 101; // 0x65
+    field public static final int EVCONNECTOR_TYPE_SCAME = 11; // 0xb
+    field public static final int EVCONNECTOR_TYPE_TESLA_HPWC = 7; // 0x7
+    field public static final int EVCONNECTOR_TYPE_TESLA_ROADSTER = 6; // 0x6
+    field public static final int EVCONNECTOR_TYPE_TESLA_SUPERCHARGER = 8; // 0x8
+    field public static final int EVCONNECTOR_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_BIODIESEL = 5; // 0x5
+    field public static final int FUEL_TYPE_CNG = 8; // 0x8
+    field public static final int FUEL_TYPE_DIESEL_1 = 3; // 0x3
+    field public static final int FUEL_TYPE_DIESEL_2 = 4; // 0x4
+    field public static final int FUEL_TYPE_E85 = 6; // 0x6
+    field public static final int FUEL_TYPE_ELECTRIC = 10; // 0xa
+    field public static final int FUEL_TYPE_HYDROGEN = 11; // 0xb
+    field public static final int FUEL_TYPE_LEADED = 2; // 0x2
+    field public static final int FUEL_TYPE_LNG = 9; // 0x9
+    field public static final int FUEL_TYPE_LPG = 7; // 0x7
+    field public static final int FUEL_TYPE_OTHER = 12; // 0xc
+    field public static final int FUEL_TYPE_UNKNOWN = 0; // 0x0
+    field public static final int FUEL_TYPE_UNLEADED = 1; // 0x1
+  }
+
+  public static final class EnergyProfile.Builder {
+    ctor public EnergyProfile.Builder();
+    method public androidx.car.app.hardware.info.EnergyProfile build();
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setEvConnectorTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+    method public androidx.car.app.hardware.info.EnergyProfile.Builder setFuelTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
+    ctor public Gyroscope(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
+    method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getRotations();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getOdometerMeters();
+  }
+
+  public static final class Mileage.Builder {
+    ctor public Mileage.Builder();
+    method public androidx.car.app.hardware.info.Mileage build();
+    method public androidx.car.app.hardware.info.Mileage.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+    method public androidx.car.app.hardware.info.Mileage.Builder setOdometerMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getManufacturer();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getName();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getYear();
+  }
+
+  public static final class Model.Builder {
+    ctor public Model.Builder();
+    method public androidx.car.app.hardware.info.Model build();
+    method public androidx.car.app.hardware.info.Model.Builder setManufacturer(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setName(androidx.car.app.hardware.common.CarValue<java.lang.String!>);
+    method public androidx.car.app.hardware.info.Model.Builder setYear(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getDisplaySpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRawSpeedMetersPerSecond();
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getSpeedDisplayUnit();
+  }
+
+  public static final class Speed.Builder {
+    ctor public Speed.Builder();
+    method public androidx.car.app.hardware.info.Speed build();
+    method public androidx.car.app.hardware.info.Speed.Builder setDisplaySpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setRawSpeedMetersPerSecond(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method public androidx.car.app.hardware.info.Speed.Builder setSpeedDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
+    method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getCardState();
+    field public static final int TOLLCARD_STATE_INVALID = 2; // 0x2
+    field public static final int TOLLCARD_STATE_NOT_INSERTED = 3; // 0x3
+    field public static final int TOLLCARD_STATE_UNKNOWN = 0; // 0x0
+    field public static final int TOLLCARD_STATE_VALID = 1; // 0x1
+  }
+
+  public static final class TollCard.Builder {
+    ctor public TollCard.Builder();
+    method public androidx.car.app.hardware.info.TollCard build();
+    method public androidx.car.app.hardware.info.TollCard.Builder setCardState(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
+  }
+
+}
+
+package androidx.car.app.managers {
+
+  public interface Manager {
+  }
+
+}
+
+package androidx.car.app.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Action {
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public int getFlags();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public int getType();
+    method public boolean isStandard();
+    method public static String typeToString(int);
+    field public static final androidx.car.app.model.Action APP_ICON;
+    field public static final androidx.car.app.model.Action BACK;
+    field @androidx.car.app.annotations.RequiresCarApi(4) public static final int FLAG_PRIMARY = 1; // 0x1
+    field public static final androidx.car.app.model.Action PAN;
+    field public static final int TYPE_APP_ICON = 65538; // 0x10002
+    field public static final int TYPE_BACK = 65539; // 0x10003
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_PAN = 65540; // 0x10004
+  }
+
+  public static final class Action.Builder {
+    ctor public Action.Builder();
+    ctor @androidx.car.app.annotations.RequiresCarApi(2) public Action.Builder(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action build();
+    method public androidx.car.app.model.Action.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Action.Builder setFlags(int);
+    method public androidx.car.app.model.Action.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Action.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Action.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getFirstActionOfType(int);
+  }
+
+  public static final class ActionStrip.Builder {
+    ctor public ActionStrip.Builder();
+    method public androidx.car.app.model.ActionStrip.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ActionStrip build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarColor {
+    method public static androidx.car.app.model.CarColor createCustom(@ColorInt int, @ColorInt int);
+    method @ColorInt public int getColor();
+    method @ColorInt public int getColorDark();
+    method public int getType();
+    field public static final androidx.car.app.model.CarColor BLUE;
+    field public static final androidx.car.app.model.CarColor DEFAULT;
+    field public static final androidx.car.app.model.CarColor GREEN;
+    field public static final androidx.car.app.model.CarColor PRIMARY;
+    field public static final androidx.car.app.model.CarColor RED;
+    field public static final androidx.car.app.model.CarColor SECONDARY;
+    field public static final int TYPE_BLUE = 6; // 0x6
+    field public static final int TYPE_CUSTOM = 0; // 0x0
+    field public static final int TYPE_DEFAULT = 1; // 0x1
+    field public static final int TYPE_GREEN = 5; // 0x5
+    field public static final int TYPE_PRIMARY = 2; // 0x2
+    field public static final int TYPE_RED = 4; // 0x4
+    field public static final int TYPE_SECONDARY = 3; // 0x3
+    field public static final int TYPE_YELLOW = 7; // 0x7
+    field public static final androidx.car.app.model.CarColor YELLOW;
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIcon {
+    method public androidx.core.graphics.drawable.IconCompat? getIcon();
+    method public androidx.car.app.model.CarColor? getTint();
+    method public int getType();
+    field public static final androidx.car.app.model.CarIcon ALERT;
+    field public static final androidx.car.app.model.CarIcon APP_ICON;
+    field public static final androidx.car.app.model.CarIcon BACK;
+    field public static final androidx.car.app.model.CarIcon ERROR;
+    field @androidx.car.app.annotations.RequiresCarApi(2) public static final androidx.car.app.model.CarIcon PAN;
+    field public static final int TYPE_ALERT = 4; // 0x4
+    field public static final int TYPE_APP_ICON = 5; // 0x5
+    field public static final int TYPE_BACK = 3; // 0x3
+    field public static final int TYPE_CUSTOM = 1; // 0x1
+    field public static final int TYPE_ERROR = 6; // 0x6
+    field public static final int TYPE_PAN = 7; // 0x7
+  }
+
+  public static final class CarIcon.Builder {
+    ctor public CarIcon.Builder(androidx.core.graphics.drawable.IconCompat);
+    ctor public CarIcon.Builder(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.CarIcon build();
+    method public androidx.car.app.model.CarIcon.Builder setTint(androidx.car.app.model.CarColor);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarIconSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon);
+    method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon, int);
+    method public int getAlignment();
+    method public androidx.car.app.model.CarIcon getIcon();
+    field public static final int ALIGN_BASELINE = 1; // 0x1
+    field public static final int ALIGN_BOTTOM = 0; // 0x0
+    field public static final int ALIGN_CENTER = 2; // 0x2
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarLocation {
+    method public static androidx.car.app.model.CarLocation create(double, double);
+    method public static androidx.car.app.model.CarLocation create(android.location.Location);
+    method public double getLatitude();
+    method public double getLongitude();
+  }
+
+  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+    ctor public CarSpan();
+    method public void updateDrawState(android.text.TextPaint);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class CarText {
+    method public static androidx.car.app.model.CarText create(CharSequence);
+    method public java.util.List<java.lang.CharSequence!> getVariants();
+    method public boolean isEmpty();
+    method public static boolean isNullOrEmpty(androidx.car.app.model.CarText?);
+    method public CharSequence toCharSequence();
+  }
+
+  public static final class CarText.Builder {
+    ctor public CarText.Builder(CharSequence);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.CarText.Builder addVariant(CharSequence);
+    method public androidx.car.app.model.CarText build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
+    method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
+    method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
+    method @RequiresApi(26) public static androidx.car.app.model.DateTimeWithZone create(java.time.ZonedDateTime);
+    method public long getTimeSinceEpochMillis();
+    method public int getZoneOffsetSeconds();
+    method public String? getZoneShortName();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Distance {
+    method public static androidx.car.app.model.Distance create(double, int);
+    method public double getDisplayDistance();
+    method public int getDisplayUnit();
+    field public static final int UNIT_FEET = 6; // 0x6
+    field public static final int UNIT_KILOMETERS = 2; // 0x2
+    field public static final int UNIT_KILOMETERS_P1 = 3; // 0x3
+    field public static final int UNIT_METERS = 1; // 0x1
+    field public static final int UNIT_MILES = 4; // 0x4
+    field public static final int UNIT_MILES_P1 = 5; // 0x5
+    field public static final int UNIT_YARDS = 7; // 0x7
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DistanceSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DistanceSpan create(androidx.car.app.model.Distance);
+    method public androidx.car.app.model.Distance getDistance();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class DurationSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.DurationSpan create(long);
+    method @RequiresApi(26) public static androidx.car.app.model.DurationSpan create(java.time.Duration);
+    method public long getDurationSeconds();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
+    method public static androidx.car.app.model.ForegroundCarColorSpan create(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.CarColor getColor();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public int getImageType();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+    field public static final int IMAGE_TYPE_ICON = 1; // 0x1
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+  }
+
+  public static final class GridItem.Builder {
+    ctor public GridItem.Builder();
+    method public androidx.car.app.model.GridItem build();
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.GridItem.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.GridItem.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridItem.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.GridItem.Builder setText(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.GridItem.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class GridTemplate.Builder {
+    ctor public GridTemplate.Builder();
+    method public androidx.car.app.model.GridTemplate build();
+    method public androidx.car.app.model.GridTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.GridTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.GridTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.GridTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallback {
+    method public default void onInputSubmitted(String);
+    method public default void onInputTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public interface InputCallbackDelegate {
+    method public void sendInputSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendInputTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Item {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ItemList {
+    method public java.util.List<androidx.car.app.model.Item!> getItems();
+    method public androidx.car.app.model.CarText? getNoItemsMessage();
+    method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
+    method public androidx.car.app.model.OnSelectedDelegate? getOnSelectedDelegate();
+    method public int getSelectedIndex();
+  }
+
+  public static final class ItemList.Builder {
+    ctor public ItemList.Builder();
+    method public androidx.car.app.model.ItemList.Builder addItem(androidx.car.app.model.Item);
+    method public androidx.car.app.model.ItemList build();
+    method public androidx.car.app.model.ItemList.Builder setNoItemsMessage(CharSequence);
+    method public androidx.car.app.model.ItemList.Builder setOnItemsVisibilityChangedListener(androidx.car.app.model.ItemList.OnItemVisibilityChangedListener);
+    method public androidx.car.app.model.ItemList.Builder setOnSelectedListener(androidx.car.app.model.ItemList.OnSelectedListener);
+    method public androidx.car.app.model.ItemList.Builder setSelectedIndex(@IntRange(from=0) int);
+  }
+
+  public static interface ItemList.OnItemVisibilityChangedListener {
+    method public void onItemVisibilityChanged(int, int);
+  }
+
+  public static interface ItemList.OnSelectedListener {
+    method public void onSelected(int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ListTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public java.util.List<androidx.car.app.model.SectionedItemList!> getSectionedLists();
+    method public androidx.car.app.model.ItemList? getSingleList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class ListTemplate.Builder {
+    ctor public ListTemplate.Builder();
+    method public androidx.car.app.model.ListTemplate.Builder addSectionedList(androidx.car.app.model.SectionedItemList);
+    method public androidx.car.app.model.ListTemplate build();
+    method public androidx.car.app.model.ListTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.ListTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.ListTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.ListTemplate.Builder setSingleList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class LongMessageTemplate.Builder {
+    ctor public LongMessageTemplate.Builder(CharSequence);
+    method public androidx.car.app.model.LongMessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate build();
+    method public androidx.car.app.model.LongMessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getDebugMessage();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public androidx.car.app.model.CarText getMessage();
+    method public androidx.car.app.model.CarText? getTitle();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public boolean isLoading();
+  }
+
+  public static final class MessageTemplate.Builder {
+    ctor public MessageTemplate.Builder(CharSequence);
+    ctor public MessageTemplate.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.MessageTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate build();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(Throwable);
+    method public androidx.car.app.model.MessageTemplate.Builder setDebugMessage(String);
+    method public androidx.car.app.model.MessageTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.MessageTemplate.Builder setIcon(androidx.car.app.model.CarIcon);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.MessageTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Metadata {
+    method public androidx.car.app.model.Place? getPlace();
+    field public static final androidx.car.app.model.Metadata EMPTY_METADATA;
+  }
+
+  public static final class Metadata.Builder {
+    ctor public Metadata.Builder();
+    ctor public Metadata.Builder(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Metadata build();
+    method public androidx.car.app.model.Metadata.Builder setPlace(androidx.car.app.model.Place);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnCheckedChangeDelegate {
+    method public void sendCheckedChange(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnClickDelegate {
+    method public boolean isParkedOnly();
+    method public void sendClick(androidx.car.app.OnDoneCallback);
+  }
+
+  public interface OnClickListener {
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnItemVisibilityChangedDelegate {
+    method public void sendItemVisibilityChanged(int, int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface OnSelectedDelegate {
+    method public void sendSelected(int, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Pane {
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.CarIcon? getImage();
+    method public java.util.List<androidx.car.app.model.Row!> getRows();
+    method public boolean isLoading();
+  }
+
+  public static final class Pane.Builder {
+    ctor public Pane.Builder();
+    method public androidx.car.app.model.Pane.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Pane.Builder addRow(androidx.car.app.model.Row);
+    method public androidx.car.app.model.Pane build();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.Pane.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Pane.Builder setLoading(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PaneTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.Pane getPane();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class PaneTemplate.Builder {
+    ctor public PaneTemplate.Builder(androidx.car.app.model.Pane);
+    method public androidx.car.app.model.PaneTemplate build();
+    method public androidx.car.app.model.PaneTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PaneTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PaneTemplate.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
+    method public static androidx.car.app.model.ParkedOnlyOnClickListener create(androidx.car.app.model.OnClickListener);
+    method public void onClick();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Place {
+    method public androidx.car.app.model.CarLocation getLocation();
+    method public androidx.car.app.model.PlaceMarker? getMarker();
+  }
+
+  public static final class Place.Builder {
+    ctor public Place.Builder(androidx.car.app.model.CarLocation);
+    ctor public Place.Builder(androidx.car.app.model.Place);
+    method public androidx.car.app.model.Place build();
+    method public androidx.car.app.model.Place.Builder setMarker(androidx.car.app.model.PlaceMarker);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Place? getAnchor();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isCurrentLocationEnabled();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListMapTemplate.Builder {
+    ctor public PlaceListMapTemplate.Builder();
+    method public androidx.car.app.model.PlaceListMapTemplate build();
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setAnchor(androidx.car.app.model.Place);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setCurrentLocationEnabled(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
+    method public androidx.car.app.model.CarColor? getColor();
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getIconType();
+    method public androidx.car.app.model.CarText? getLabel();
+    field public static final int TYPE_ICON = 0; // 0x0
+    field public static final int TYPE_IMAGE = 1; // 0x1
+  }
+
+  public static final class PlaceMarker.Builder {
+    ctor public PlaceMarker.Builder();
+    method public androidx.car.app.model.PlaceMarker build();
+    method public androidx.car.app.model.PlaceMarker.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.model.PlaceMarker.Builder setIcon(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.PlaceMarker.Builder setLabel(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.Metadata? getMetadata();
+    method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
+    method public int getRowImageType();
+    method public java.util.List<androidx.car.app.model.CarText!> getTexts();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public androidx.car.app.model.Toggle? getToggle();
+    method public boolean isBrowsable();
+    method public androidx.car.app.model.Row row();
+    method public CharSequence yourBoat();
+    field public static final int IMAGE_TYPE_ICON = 4; // 0x4
+    field public static final int IMAGE_TYPE_LARGE = 2; // 0x2
+    field public static final int IMAGE_TYPE_SMALL = 1; // 0x1
+  }
+
+  public static final class Row.Builder {
+    ctor public Row.Builder();
+    method public androidx.car.app.model.Row.Builder addText(CharSequence);
+    method public androidx.car.app.model.Row.Builder addText(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row build();
+    method public androidx.car.app.model.Row.Builder setBrowsable(boolean);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.model.Row.Builder setImage(androidx.car.app.model.CarIcon, int);
+    method public androidx.car.app.model.Row.Builder setMetadata(androidx.car.app.model.Metadata);
+    method public androidx.car.app.model.Row.Builder setOnClickListener(androidx.car.app.model.OnClickListener);
+    method public androidx.car.app.model.Row.Builder setTitle(CharSequence);
+    method public androidx.car.app.model.Row.Builder setTitle(androidx.car.app.model.CarText);
+    method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface SearchCallbackDelegate {
+    method public void sendSearchSubmitted(String, androidx.car.app.OnDoneCallback);
+    method public void sendSearchTextChanged(String, androidx.car.app.OnDoneCallback);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SearchTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public String? getInitialSearchText();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackDelegate getSearchCallbackDelegate();
+    method public String? getSearchHint();
+    method public boolean isLoading();
+    method public boolean isShowKeyboardByDefault();
+  }
+
+  public static final class SearchTemplate.Builder {
+    ctor public SearchTemplate.Builder(androidx.car.app.model.SearchTemplate.SearchCallback);
+    method public androidx.car.app.model.SearchTemplate build();
+    method public androidx.car.app.model.SearchTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.SearchTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.SearchTemplate.Builder setInitialSearchText(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.model.SearchTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.SearchTemplate.Builder setSearchHint(String);
+    method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  public static interface SearchTemplate.SearchCallback {
+    method public default void onSearchSubmitted(String);
+    method public default void onSearchTextChanged(String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class SectionedItemList {
+    method public static androidx.car.app.model.SectionedItemList create(androidx.car.app.model.ItemList, CharSequence);
+    method public androidx.car.app.model.CarText getHeader();
+    method public androidx.car.app.model.ItemList getItemList();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public interface Template {
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateInfo {
+    ctor public TemplateInfo(Class<? extends androidx.car.app.model.Template>, String);
+    method public Class<? extends androidx.car.app.model.Template> getTemplateClass();
+    method public String getTemplateId();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TemplateWrapper {
+    method public static androidx.car.app.model.TemplateWrapper copyOf(androidx.car.app.model.TemplateWrapper);
+    method public int getCurrentTaskStep();
+    method public String getId();
+    method public androidx.car.app.model.Template getTemplate();
+    method public java.util.List<androidx.car.app.model.TemplateInfo!> getTemplateInfosForScreenStack();
+    method public boolean isRefresh();
+    method public void setCurrentTaskStep(int);
+    method public void setId(String);
+    method public void setRefresh(boolean);
+    method public void setTemplate(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template);
+    method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template, String);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Toggle {
+    method public androidx.car.app.model.OnCheckedChangeDelegate getOnCheckedChangeDelegate();
+    method public boolean isChecked();
+  }
+
+  public static final class Toggle.Builder {
+    ctor public Toggle.Builder(androidx.car.app.model.Toggle.OnCheckedChangeListener);
+    method public androidx.car.app.model.Toggle build();
+    method public androidx.car.app.model.Toggle.Builder setChecked(boolean);
+  }
+
+  public static interface Toggle.OnCheckedChangeListener {
+    method public void onCheckedChange(boolean);
+  }
+
+}
+
+package androidx.car.app.model.signin {
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    method public androidx.car.app.model.CarText? getDefaultValue();
+    method public androidx.car.app.model.CarText? getErrorMessage();
+    method public androidx.car.app.model.CarText? getHint();
+    method public androidx.car.app.model.InputCallbackDelegate getInputCallbackDelegate();
+    method public int getInputType();
+    method public int getKeyboardType();
+    method public boolean isShowKeyboardByDefault();
+    field public static final int INPUT_TYPE_DEFAULT = 1; // 0x1
+    field public static final int INPUT_TYPE_PASSWORD = 2; // 0x2
+    field public static final int KEYBOARD_DEFAULT = 1; // 0x1
+    field public static final int KEYBOARD_EMAIL = 2; // 0x2
+    field public static final int KEYBOARD_NUMBER = 4; // 0x4
+    field public static final int KEYBOARD_PHONE = 3; // 0x3
+  }
+
+  public static final class InputSignInMethod.Builder {
+    ctor public InputSignInMethod.Builder(androidx.car.app.model.InputCallback);
+    method public androidx.car.app.model.signin.InputSignInMethod build();
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setDefaultValue(String);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setErrorMessage(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setHint(CharSequence);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setInputType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setKeyboardType(int);
+    method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public PinSignInMethod(CharSequence);
+    method public androidx.car.app.model.CarText getPinCode();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public ProviderSignInMethod(androidx.car.app.model.Action);
+    method public androidx.car.app.model.Action getAction();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+    ctor public QRCodeSignInMethod(android.net.Uri);
+    method public android.net.Uri getUri();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public java.util.List<androidx.car.app.model.Action!> getActions();
+    method public androidx.car.app.model.CarText? getAdditionalText();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.CarText? getInstructions();
+    method public androidx.car.app.model.signin.SignInTemplate.SignInMethod getSignInMethod();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  @androidx.car.app.annotations.RequiresCarApi(2) public static final class SignInTemplate.Builder {
+    ctor public SignInTemplate.Builder(androidx.car.app.model.signin.SignInTemplate.SignInMethod);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder addAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate build();
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setAdditionalText(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setInstructions(CharSequence);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setLoading(boolean);
+    method public androidx.car.app.model.signin.SignInTemplate.Builder setTitle(CharSequence);
+  }
+
+  public static interface SignInTemplate.SignInMethod {
+  }
+
+}
+
+package androidx.car.app.navigation {
+
+  public class NavigationManager implements androidx.car.app.managers.Manager {
+    method @MainThread public void clearNavigationManagerCallback();
+    method @MainThread public void navigationEnded();
+    method @MainThread public void navigationStarted();
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
+  }
+
+  public interface NavigationManagerCallback {
+    method public default void onAutoDriveEnabled();
+    method public default void onStopNavigation();
+  }
+
+}
+
+package androidx.car.app.navigation.model {
+
+  @androidx.car.app.annotations.CarProtocol public final class Destination {
+    method public androidx.car.app.model.CarText? getAddress();
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getName();
+  }
+
+  public static final class Destination.Builder {
+    ctor public Destination.Builder();
+    method public androidx.car.app.navigation.model.Destination build();
+    method public androidx.car.app.navigation.model.Destination.Builder setAddress(CharSequence);
+    method public androidx.car.app.navigation.model.Destination.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Destination.Builder setName(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Lane {
+    method public java.util.List<androidx.car.app.navigation.model.LaneDirection!> getDirections();
+  }
+
+  public static final class Lane.Builder {
+    ctor public Lane.Builder();
+    method public androidx.car.app.navigation.model.Lane.Builder addDirection(androidx.car.app.navigation.model.LaneDirection);
+    method public androidx.car.app.navigation.model.Lane build();
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class LaneDirection {
+    method public static androidx.car.app.navigation.model.LaneDirection create(int, boolean);
+    method public int getShape();
+    method public boolean isRecommended();
+    field public static final int SHAPE_NORMAL_LEFT = 5; // 0x5
+    field public static final int SHAPE_NORMAL_RIGHT = 6; // 0x6
+    field public static final int SHAPE_SHARP_LEFT = 7; // 0x7
+    field public static final int SHAPE_SHARP_RIGHT = 8; // 0x8
+    field public static final int SHAPE_SLIGHT_LEFT = 3; // 0x3
+    field public static final int SHAPE_SLIGHT_RIGHT = 4; // 0x4
+    field public static final int SHAPE_STRAIGHT = 2; // 0x2
+    field public static final int SHAPE_UNKNOWN = 1; // 0x1
+    field public static final int SHAPE_U_TURN_LEFT = 9; // 0x9
+    field public static final int SHAPE_U_TURN_RIGHT = 10; // 0xa
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Maneuver {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public int getRoundaboutExitAngle();
+    method public int getRoundaboutExitNumber();
+    method public int getType();
+    field public static final int TYPE_DEPART = 1; // 0x1
+    field public static final int TYPE_DESTINATION = 39; // 0x27
+    field public static final int TYPE_DESTINATION_LEFT = 41; // 0x29
+    field public static final int TYPE_DESTINATION_RIGHT = 42; // 0x2a
+    field public static final int TYPE_DESTINATION_STRAIGHT = 40; // 0x28
+    field public static final int TYPE_FERRY_BOAT = 37; // 0x25
+    field public static final int TYPE_FERRY_BOAT_LEFT = 47; // 0x2f
+    field public static final int TYPE_FERRY_BOAT_RIGHT = 48; // 0x30
+    field public static final int TYPE_FERRY_TRAIN = 38; // 0x26
+    field public static final int TYPE_FERRY_TRAIN_LEFT = 49; // 0x31
+    field public static final int TYPE_FERRY_TRAIN_RIGHT = 50; // 0x32
+    field public static final int TYPE_FORK_LEFT = 25; // 0x19
+    field public static final int TYPE_FORK_RIGHT = 26; // 0x1a
+    field public static final int TYPE_KEEP_LEFT = 3; // 0x3
+    field public static final int TYPE_KEEP_RIGHT = 4; // 0x4
+    field public static final int TYPE_MERGE_LEFT = 27; // 0x1b
+    field public static final int TYPE_MERGE_RIGHT = 28; // 0x1c
+    field public static final int TYPE_MERGE_SIDE_UNSPECIFIED = 29; // 0x1d
+    field public static final int TYPE_NAME_CHANGE = 2; // 0x2
+    field public static final int TYPE_OFF_RAMP_NORMAL_LEFT = 23; // 0x17
+    field public static final int TYPE_OFF_RAMP_NORMAL_RIGHT = 24; // 0x18
+    field public static final int TYPE_OFF_RAMP_SLIGHT_LEFT = 21; // 0x15
+    field public static final int TYPE_OFF_RAMP_SLIGHT_RIGHT = 22; // 0x16
+    field public static final int TYPE_ON_RAMP_NORMAL_LEFT = 15; // 0xf
+    field public static final int TYPE_ON_RAMP_NORMAL_RIGHT = 16; // 0x10
+    field public static final int TYPE_ON_RAMP_SHARP_LEFT = 17; // 0x11
+    field public static final int TYPE_ON_RAMP_SHARP_RIGHT = 18; // 0x12
+    field public static final int TYPE_ON_RAMP_SLIGHT_LEFT = 13; // 0xd
+    field public static final int TYPE_ON_RAMP_SLIGHT_RIGHT = 14; // 0xe
+    field public static final int TYPE_ON_RAMP_U_TURN_LEFT = 19; // 0x13
+    field public static final int TYPE_ON_RAMP_U_TURN_RIGHT = 20; // 0x14
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW = 34; // 0x22
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE = 35; // 0x23
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW = 32; // 0x20
+    field public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW_WITH_ANGLE = 33; // 0x21
+    field public static final int TYPE_ROUNDABOUT_ENTER_CCW = 45; // 0x2d
+    field public static final int TYPE_ROUNDABOUT_ENTER_CW = 43; // 0x2b
+    field public static final int TYPE_ROUNDABOUT_EXIT_CCW = 46; // 0x2e
+    field public static final int TYPE_ROUNDABOUT_EXIT_CW = 44; // 0x2c
+    field public static final int TYPE_STRAIGHT = 36; // 0x24
+    field public static final int TYPE_TURN_NORMAL_LEFT = 7; // 0x7
+    field public static final int TYPE_TURN_NORMAL_RIGHT = 8; // 0x8
+    field public static final int TYPE_TURN_SHARP_LEFT = 9; // 0x9
+    field public static final int TYPE_TURN_SHARP_RIGHT = 10; // 0xa
+    field public static final int TYPE_TURN_SLIGHT_LEFT = 5; // 0x5
+    field public static final int TYPE_TURN_SLIGHT_RIGHT = 6; // 0x6
+    field public static final int TYPE_UNKNOWN = 0; // 0x0
+    field public static final int TYPE_U_TURN_LEFT = 11; // 0xb
+    field public static final int TYPE_U_TURN_RIGHT = 12; // 0xc
+  }
+
+  public static final class Maneuver.Builder {
+    ctor public Maneuver.Builder(int);
+    method public androidx.car.app.navigation.model.Maneuver build();
+    method public androidx.car.app.navigation.model.Maneuver.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitAngle(@IntRange(from=1, to=360) int);
+    method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitNumber(@IntRange(from=1) int);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.CarIcon? getImage();
+    method public androidx.car.app.model.CarText? getText();
+    method public androidx.car.app.model.CarText? getTitle();
+  }
+
+  public static final class MessageInfo.Builder {
+    ctor public MessageInfo.Builder(CharSequence);
+    ctor public MessageInfo.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo build();
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(CharSequence);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setText(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class NavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.CarColor? getBackgroundColor();
+    method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo? getNavigationInfo();
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method @Deprecated @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.Toggle? getPanModeToggle();
+  }
+
+  public static final class NavigationTemplate.Builder {
+    ctor public NavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.NavigationTemplate build();
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setBackgroundColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setDestinationTravelEstimate(androidx.car.app.navigation.model.TravelEstimate);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.NavigationTemplate.Builder setNavigationInfo(androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo);
+    method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.navigation.model.NavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+  }
+
+  public static interface NavigationTemplate.NavigationInfo {
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public interface PanModeDelegate {
+    method public void sendPanModeChanged(boolean, androidx.car.app.OnDoneCallback);
+  }
+
+  public interface PanModeListener {
+    method public void onPanModeChanged(boolean);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class PlaceListNavigationTemplate.Builder {
+    ctor public PlaceListNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate build();
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
+    method public androidx.car.app.model.ActionStrip? getActionStrip();
+    method public androidx.car.app.model.Action? getHeaderAction();
+    method public androidx.car.app.model.ItemList? getItemList();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.ActionStrip? getMapActionStrip();
+    method public androidx.car.app.model.Action? getNavigateAction();
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
+    method public androidx.car.app.model.CarText? getTitle();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutePreviewNavigationTemplate.Builder {
+    ctor public RoutePreviewNavigationTemplate.Builder();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate build();
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setMapActionStrip(androidx.car.app.model.ActionStrip);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
+    method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence);
+    method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+    method public androidx.car.app.model.Distance? getCurrentDistance();
+    method public androidx.car.app.navigation.model.Step? getCurrentStep();
+    method public androidx.car.app.model.CarIcon? getJunctionImage();
+    method public androidx.car.app.navigation.model.Step? getNextStep();
+    method public boolean isLoading();
+  }
+
+  public static final class RoutingInfo.Builder {
+    ctor public RoutingInfo.Builder();
+    method public androidx.car.app.navigation.model.RoutingInfo build();
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setCurrentStep(androidx.car.app.navigation.model.Step, androidx.car.app.model.Distance);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setJunctionImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setLoading(boolean);
+    method public androidx.car.app.navigation.model.RoutingInfo.Builder setNextStep(androidx.car.app.navigation.model.Step);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Step {
+    method public androidx.car.app.model.CarText? getCue();
+    method public java.util.List<androidx.car.app.navigation.model.Lane!> getLanes();
+    method public androidx.car.app.model.CarIcon? getLanesImage();
+    method public androidx.car.app.navigation.model.Maneuver? getManeuver();
+    method public androidx.car.app.model.CarText? getRoad();
+  }
+
+  public static final class Step.Builder {
+    ctor public Step.Builder();
+    ctor public Step.Builder(CharSequence);
+    ctor public Step.Builder(androidx.car.app.model.CarText);
+    method public androidx.car.app.navigation.model.Step.Builder addLane(androidx.car.app.navigation.model.Lane);
+    method public androidx.car.app.navigation.model.Step build();
+    method public androidx.car.app.navigation.model.Step.Builder setCue(CharSequence);
+    method public androidx.car.app.navigation.model.Step.Builder setLanesImage(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.navigation.model.Step.Builder setManeuver(androidx.car.app.navigation.model.Maneuver);
+    method public androidx.car.app.navigation.model.Step.Builder setRoad(CharSequence);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class TravelEstimate {
+    method public androidx.car.app.model.DateTimeWithZone? getArrivalTimeAtDestination();
+    method public androidx.car.app.model.Distance? getRemainingDistance();
+    method public androidx.car.app.model.CarColor? getRemainingDistanceColor();
+    method public androidx.car.app.model.CarColor? getRemainingTimeColor();
+    method public long getRemainingTimeSeconds();
+    field public static final long REMAINING_TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+  }
+
+  public static final class TravelEstimate.Builder {
+    ctor public TravelEstimate.Builder(androidx.car.app.model.Distance, androidx.car.app.model.DateTimeWithZone);
+    ctor @RequiresApi(26) public TravelEstimate.Builder(androidx.car.app.model.Distance, java.time.ZonedDateTime);
+    method public androidx.car.app.navigation.model.TravelEstimate build();
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingDistanceColor(androidx.car.app.model.CarColor);
+    method @RequiresApi(26) public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTime(java.time.Duration);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.navigation.model.TravelEstimate.Builder setRemainingTimeSeconds(@IntRange(from=0xffffffff) long);
+  }
+
+  @androidx.car.app.annotations.CarProtocol public final class Trip {
+    method public androidx.car.app.model.CarText? getCurrentRoad();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getDestinationTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Destination!> getDestinations();
+    method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getStepTravelEstimates();
+    method public java.util.List<androidx.car.app.navigation.model.Step!> getSteps();
+    method public boolean isLoading();
+  }
+
+  public static final class Trip.Builder {
+    ctor public Trip.Builder();
+    method public androidx.car.app.navigation.model.Trip.Builder addDestination(androidx.car.app.navigation.model.Destination, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip.Builder addStep(androidx.car.app.navigation.model.Step, androidx.car.app.navigation.model.TravelEstimate);
+    method public androidx.car.app.navigation.model.Trip build();
+    method public androidx.car.app.navigation.model.Trip.Builder setCurrentRoad(CharSequence);
+    method public androidx.car.app.navigation.model.Trip.Builder setLoading(boolean);
+  }
+
+}
+
+package androidx.car.app.notification {
+
+  public final class CarAppExtender implements androidx.core.app.NotificationCompat.Extender {
+    ctor public CarAppExtender(android.app.Notification);
+    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+    method public java.util.List<android.app.Notification.Action!> getActions();
+    method public String? getChannelId();
+    method public androidx.car.app.model.CarColor? getColor();
+    method public android.app.PendingIntent? getContentIntent();
+    method public CharSequence? getContentText();
+    method public CharSequence? getContentTitle();
+    method public android.app.PendingIntent? getDeleteIntent();
+    method public int getImportance();
+    method public android.graphics.Bitmap? getLargeIcon();
+    method @DrawableRes public int getSmallIcon();
+    method public static boolean isExtended(android.app.Notification);
+  }
+
+  public static final class CarAppExtender.Builder {
+    ctor public CarAppExtender.Builder();
+    method public androidx.car.app.notification.CarAppExtender.Builder addAction(@DrawableRes int, CharSequence, android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender build();
+    method public androidx.car.app.notification.CarAppExtender.Builder setChannelId(String);
+    method public androidx.car.app.notification.CarAppExtender.Builder setColor(androidx.car.app.model.CarColor);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentText(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setContentTitle(CharSequence);
+    method public androidx.car.app.notification.CarAppExtender.Builder setDeleteIntent(android.app.PendingIntent);
+    method public androidx.car.app.notification.CarAppExtender.Builder setImportance(int);
+    method public androidx.car.app.notification.CarAppExtender.Builder setLargeIcon(android.graphics.Bitmap);
+    method public androidx.car.app.notification.CarAppExtender.Builder setSmallIcon(int);
+  }
+
+  public final class CarNotificationManager {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(String?, int);
+    method public void cancelAll();
+    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+    method public void createNotificationChannelGroups(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+    method public void createNotificationChannels(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+    method public void deleteNotificationChannel(String);
+    method public void deleteNotificationChannelGroup(String);
+    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+    method public static androidx.car.app.notification.CarNotificationManager from(android.content.Context);
+    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String);
+    method public androidx.core.app.NotificationChannelCompat? getNotificationChannel(String, String);
+    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroup(String);
+    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroups();
+    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannels();
+    method public void notify(int, androidx.core.app.NotificationCompat.Builder);
+    method public void notify(String?, int, androidx.core.app.NotificationCompat.Builder);
+  }
+
+  public final class CarPendingIntent {
+    method public static android.app.PendingIntent getCarApp(android.content.Context, int, android.content.Intent, int);
+  }
+
+}
+
+package androidx.car.app.serialization {
+
+  public final class Bundleable implements android.os.Parcelable {
+    method public static androidx.car.app.serialization.Bundleable create(Object) throws androidx.car.app.serialization.BundlerException;
+    method public int describeContents();
+    method public Object get() throws androidx.car.app.serialization.BundlerException;
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.car.app.serialization.Bundleable!> CREATOR;
+  }
+
+  public class BundlerException extends java.lang.Exception {
+    ctor public BundlerException(String?, Throwable);
+    ctor public BundlerException(String?);
+  }
+
+}
+
+package androidx.car.app.validation {
+
+  public final class HostValidator {
+    method public java.util.Map<java.lang.String!,java.util.List<java.lang.String!>!> getAllowedHosts();
+    method public boolean isValidHost(androidx.car.app.HostInfo);
+    field public static final androidx.car.app.validation.HostValidator ALLOW_ALL_HOSTS_VALIDATOR;
+    field public static final String TEMPLATE_RENDERER_PERMISSION = "android.car.permission.TEMPLATE_RENDERER";
+  }
+
+  public static final class HostValidator.Builder {
+    ctor public HostValidator.Builder(android.content.Context);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHost(String, String);
+    method public androidx.car.app.validation.HostValidator.Builder addAllowedHosts(@ArrayRes int);
+    method public androidx.car.app.validation.HostValidator build();
+  }
+
+}
+
+package androidx.car.app.versioning {
+
+  public final class CarAppApiLevels {
+    method public static int getLatest();
+    method public static int getOldest();
+    field public static final int LEVEL_1 = 1; // 0x1
+    field public static final int LEVEL_2 = 2; // 0x2
+    field public static final int LEVEL_3 = 3; // 0x3
+    field public static final int LEVEL_4 = 4; // 0x4
+  }
+
+}
+
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
index d86e513..ab284e5 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
@@ -305,9 +305,9 @@
     /**
      * Enter a clockwise roundabout and take the Nth exit after angle A degrees.
      *
-     * <p>The exit number and angle must be passed when creating the maneuver.
+     * <p>The exit angle must be passed when creating the maneuver.
      *
-     * <p>For example, this is used to indicate "At the roundabout, take the Nth exit".
+     * <p>For example, this is used to indicate "At the roundabout, take the exit at 135 degrees".
      */
     @Type
     public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW_WITH_ANGLE = 33;
@@ -325,10 +325,10 @@
     /**
      * Enter a counter-clockwise roundabout and take the Nth exit after angle A degrees.
      *
-     * <p>The exit number and angle must be passed when creating the maneuver.
+     * <p>The exit angle must be passed when creating the maneuver.
      *
-     * <p>For example, this is used to indicate "At the roundabout, take a sharp right at the Nth
-     * exit".
+     * <p>For example, this is used to indicate "At the roundabout, take a sharp right at 35
+     * degrees".
      */
     @Type
     public static final int TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE = 35;
@@ -569,6 +569,11 @@
                 || type == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE);
     }
 
+    static boolean isExitNumberRequired(@Type int type) {
+        return (type == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW
+                || type == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW);
+    }
+
     /** A builder of {@link Maneuver}. */
     public static final class Builder {
         @Type
@@ -690,7 +695,7 @@
          */
         @NonNull
         public Maneuver build() {
-            if (isValidTypeWithExitNumber(mType) && !mIsRoundaboutExitNumberSet) {
+            if (isExitNumberRequired(mType) && !mIsRoundaboutExitNumberSet) {
                 throw new IllegalArgumentException("Maneuver missing roundaboutExitNumber");
             }
             if (isValidTypeWithExitAngle(mType) && !mIsRoundaboutExitAngleSet) {
diff --git a/car/app/app/src/test/java/androidx/car/app/navigation/model/ManeuverTest.java b/car/app/app/src/test/java/androidx/car/app/navigation/model/ManeuverTest.java
index 547de63..99c6bca 100644
--- a/car/app/app/src/test/java/androidx/car/app/navigation/model/ManeuverTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/navigation/model/ManeuverTest.java
@@ -163,12 +163,26 @@
     }
 
     @Test
+    public void createInstance_roundabout_with_angle_optionalExitNumber() {
+        int type = TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW_WITH_ANGLE;
+        int roundaboutExitAngle = 270;
+
+        Maneuver maneuver =
+                new Maneuver.Builder(type)
+                        .setRoundaboutExitAngle(roundaboutExitAngle)
+                        .setIcon(CarIcon.APP_ICON)
+                        .build();
+        assertThat(type).isEqualTo(maneuver.getType());
+        assertThat(roundaboutExitAngle).isEqualTo(maneuver.getRoundaboutExitAngle());
+        assertThat(CarIcon.APP_ICON).isEqualTo(maneuver.getIcon());
+    }
+
+    @Test
     public void createInstance_roundabout_with_angle_invalid_type() {
         assertThrows(
                 IllegalArgumentException.class,
                 () ->
-                        new Maneuver.Builder(TYPE_STRAIGHT)
-                                .setRoundaboutExitNumber(1)
+                        new Maneuver.Builder(TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW)
                                 .setRoundaboutExitAngle(1)
                                 .setIcon(CarIcon.APP_ICON)
                                 .build());
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
index f37c4df..a65ddea 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
@@ -64,8 +64,11 @@
             4800 to "1.1.0-beta03",
             4900 to "1.1.0-beta04",
             5000 to "1.1.0-rc01",
+            5001 to "1.1.0-rc02",
+            5002 to "1.1.0-rc03",
             6000 to "1.2.0-alpha01",
             6100 to "1.2.0-alpha02",
+            6200 to "1.2.0-alpha03",
         )
 
         /**
@@ -78,7 +81,7 @@
          * The maven version string of this compiler. This string should be updated before/after every
          * release.
          */
-        const val compilerVersion: String = "1.2.0-alpha02"
+        const val compilerVersion: String = "1.2.0-alpha03"
         private val minimumRuntimeVersion: String
             get() = versionTable[minimumRuntimeVersionInt] ?: "unknown"
     }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
index 9534a6d..6f5bdb5 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Box.kt
@@ -81,12 +81,10 @@
 internal fun rememberBoxMeasurePolicy(
     alignment: Alignment,
     propagateMinConstraints: Boolean
-) = remember(alignment) {
-    if (alignment == Alignment.TopStart && !propagateMinConstraints) {
-        DefaultBoxMeasurePolicy
-    } else {
-        boxMeasurePolicy(alignment, propagateMinConstraints)
-    }
+) = if (alignment == Alignment.TopStart && !propagateMinConstraints) {
+    DefaultBoxMeasurePolicy
+} else {
+    remember(alignment) { boxMeasurePolicy(alignment, propagateMinConstraints) }
 }
 
 internal val DefaultBoxMeasurePolicy: MeasurePolicy = boxMeasurePolicy(Alignment.TopStart, false)
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Spacer.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Spacer.kt
index 8908644..2dfc2c8 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Spacer.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Spacer.kt
@@ -19,6 +19,11 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.NonRestartableComposable
 import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasurePolicy
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.Modifier
 
 /**
@@ -32,8 +37,16 @@
 @Composable
 @NonRestartableComposable
 fun Spacer(modifier: Modifier) {
-    Layout({}, modifier) { _, constraints ->
-        with(constraints) {
+    Layout({}, measurePolicy = SpacerMeasurePolicy, modifier = modifier)
+}
+
+private object SpacerMeasurePolicy : MeasurePolicy {
+
+    override fun MeasureScope.measure(
+        measurables: List<Measurable>,
+        constraints: Constraints
+    ): MeasureResult {
+        return with(constraints) {
             val width = if (hasFixedWidth) maxWidth else 0
             val height = if (hasFixedHeight) maxHeight else 0
             layout(width, height) {}
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 57ba9d0..b012364 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -382,10 +382,14 @@
     method @Deprecated @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,? extends kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,? extends kotlin.Unit> content);
-    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,? extends kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,? extends kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,? extends kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,? extends kotlin.Unit> itemContent);
   }
 
   public final class LazyGridKt {
@@ -415,19 +419,27 @@
   }
 
   public interface LazyListLayoutInfo {
+    method public default androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public default boolean getReverseLayout();
     method public int getTotalItemsCount();
     method public int getViewportEndOffset();
+    method public default long getViewportSize();
     method public int getViewportStartOffset();
     method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public default androidx.compose.foundation.gestures.Orientation orientation;
+    property public default boolean reverseLayout;
     property public abstract int totalItemsCount;
     property public abstract int viewportEndOffset;
+    property public default long viewportSize;
     property public abstract int viewportStartOffset;
     property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
   }
 
   @androidx.compose.foundation.lazy.LazyScopeMarker public interface LazyListScope {
-    method public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
-    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
+    method public default void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @Deprecated public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? extends kotlin.Unit> itemContent);
   }
 
   @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index 1ab46ea..6f01ea8 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -437,10 +437,14 @@
     method @Deprecated @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,? extends kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,? extends kotlin.Unit> content);
-    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,? extends kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,? extends kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,? extends kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,? extends kotlin.Unit> itemContent);
   }
 
   @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyGridItemInfo {
@@ -476,12 +480,18 @@
   }
 
   @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyGridLayoutInfo {
+    method public androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public boolean getReverseLayout();
     method public int getTotalItemsCount();
     method public int getViewportEndOffset();
+    method public long getViewportSize();
     method public int getViewportStartOffset();
     method public java.util.List<androidx.compose.foundation.lazy.LazyGridItemInfo> getVisibleItemsInfo();
+    property public abstract androidx.compose.foundation.gestures.Orientation orientation;
+    property public abstract boolean reverseLayout;
     property public abstract int totalItemsCount;
     property public abstract int viewportEndOffset;
+    property public abstract long viewportSize;
     property public abstract int viewportStartOffset;
     property public abstract java.util.List<androidx.compose.foundation.lazy.LazyGridItemInfo> visibleItemsInfo;
   }
@@ -542,20 +552,28 @@
   }
 
   public interface LazyListLayoutInfo {
+    method public default androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public default boolean getReverseLayout();
     method public int getTotalItemsCount();
     method public int getViewportEndOffset();
+    method public default long getViewportSize();
     method public int getViewportStartOffset();
     method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public default androidx.compose.foundation.gestures.Orientation orientation;
+    property public default boolean reverseLayout;
     property public abstract int totalItemsCount;
     property public abstract int viewportEndOffset;
+    property public default long viewportSize;
     property public abstract int viewportStartOffset;
     property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
   }
 
   @androidx.compose.foundation.lazy.LazyScopeMarker public interface LazyListScope {
-    method public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
-    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
-    method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
+    method public default void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @Deprecated public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? extends kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 57ba9d0..b012364 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -382,10 +382,14 @@
     method @Deprecated @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,? extends kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, optional boolean userScrollEnabled, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,? extends kotlin.Unit> content);
-    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
-    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, optional kotlin.jvm.functions.Function1<? super T,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,? extends kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,? extends kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?> contentType, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,? extends kotlin.Unit> itemContent);
+    method @Deprecated public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,? extends kotlin.Unit> itemContent);
   }
 
   public final class LazyGridKt {
@@ -415,19 +419,27 @@
   }
 
   public interface LazyListLayoutInfo {
+    method public default androidx.compose.foundation.gestures.Orientation getOrientation();
+    method public default boolean getReverseLayout();
     method public int getTotalItemsCount();
     method public int getViewportEndOffset();
+    method public default long getViewportSize();
     method public int getViewportStartOffset();
     method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public default androidx.compose.foundation.gestures.Orientation orientation;
+    property public default boolean reverseLayout;
     property public abstract int totalItemsCount;
     property public abstract int viewportEndOffset;
+    property public default long viewportSize;
     property public abstract int viewportStartOffset;
     property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
   }
 
   @androidx.compose.foundation.lazy.LazyScopeMarker public interface LazyListScope {
-    method public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
-    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method public default void item(optional Object? key, optional Object? contentType, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method @Deprecated public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,? extends kotlin.Unit> content);
+    method public default void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?> contentType, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @Deprecated public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? extends kotlin.Unit> itemContent);
   }
 
   @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
diff --git a/compose/foundation/foundation/build.gradle b/compose/foundation/foundation/build.gradle
index 5267992..8d684a6 100644
--- a/compose/foundation/foundation/build.gradle
+++ b/compose/foundation/foundation/build.gradle
@@ -38,7 +38,7 @@
         api("androidx.annotation:annotation:1.1.0")
         api("androidx.compose.animation:animation:1.1.0-rc01")
         api("androidx.compose.runtime:runtime:1.1.0-rc01")
-        api("androidx.compose.ui:ui:1.1.0-rc01")
+        api(project(':compose:ui:ui'))
 
         implementation(libs.kotlinStdlibCommon)
         implementation(project(":compose:foundation:foundation-layout"))
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
index 77be109..c96190a 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextDemos.kt
@@ -37,6 +37,9 @@
                 ComposableDemo("Various input fields") { VariousInputFieldDemo() },
                 ComposableDemo("Tricky input field") { InputFieldTrickyUseCase() },
                 ComposableDemo("Focus transition") { TextFieldFocusTransition() },
+                ComposableDemo("Focus keyboard interaction") {
+                    TextFieldFocusKeyboardInteraction()
+                },
                 ComposableDemo("Tail Following Text Field") { TailFollowingTextFieldDemo() },
                 ComposableDemo("Scrollable text fields") { ScrollableTextFieldDemo() },
                 ComposableDemo("Min/Max Lines") { BasicTextFieldMinMaxDemo() },
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusKeyboardInteraction.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusKeyboardInteraction.kt
new file mode 100644
index 0000000..560dcee
--- /dev/null
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/TextFieldFocusKeyboardInteraction.kt
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * 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 androidx.compose.foundation.demos.text
+
+import android.widget.Button as AndroidButton
+import android.content.Context
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import android.view.inputmethod.EditorInfo
+import android.widget.EditText
+import android.widget.LinearLayout
+import androidx.compose.foundation.border
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.collectIsFocusedAsState
+import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.Button
+import androidx.compose.material.Text
+import androidx.compose.material.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+
+@Composable
+fun TextFieldFocusKeyboardInteraction() {
+    val focusManager = LocalFocusManager.current
+    Column(
+        verticalArrangement = spacedBy(4.dp),
+        modifier = Modifier.verticalScroll(rememberScrollState())
+    ) {
+        Button(onClick = { focusManager.clearFocus() }) {
+            Text("Clear focus")
+        }
+
+        Column(
+            Modifier
+                .border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp))
+                .padding(4.dp)
+        ) {
+            Text("Outer Compose Fields")
+            FocusableFieldRow()
+        }
+
+        Column(
+            Modifier
+                .border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp))
+                .padding(4.dp)
+        ) {
+            Text("Android EditTexts")
+            AndroidView(::AndroidFieldRow)
+        }
+
+        Text(
+            "Click around in the different text fields above to watch how the soft keyboard " +
+                "changes, and is shown and hidden. Click the buttons to move focus to something " +
+                "that doesn't request the keyboard itself. The bottom Compose text fields are in " +
+                "a different ComposeView than the top ones."
+        )
+    }
+}
+
+@Composable
+private fun FocusableFieldRow() {
+    Row(horizontalArrangement = spacedBy(4.dp)) {
+        var text1 by remember { mutableStateOf("") }
+        var text2 by remember { mutableStateOf("") }
+        var text3 by remember { mutableStateOf("") }
+        TextField(
+            text1,
+            onValueChange = { text1 = it },
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
+            modifier = Modifier.weight(1f)
+        )
+        TextField(
+            text2,
+            onValueChange = { text2 = it },
+            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
+            modifier = Modifier.weight(1f)
+        )
+        TextField(
+            text3,
+            onValueChange = { text3 = it },
+            modifier = Modifier.weight(1f)
+        )
+
+        val interactionSource = remember { MutableInteractionSource() }
+        val isButtonFocused by interactionSource.collectIsFocusedAsState()
+        val buttonFocusRequester = remember { FocusRequester() }
+        Button(
+            onClick = { buttonFocusRequester.requestFocus() },
+            Modifier
+                .weight(1f)
+                .focusRequester(buttonFocusRequester)
+                .focusable(interactionSource = interactionSource)
+        ) {
+            Text(if (isButtonFocused) "Focused" else "Click to focus")
+        }
+    }
+}
+
+private class AndroidFieldRow(context: Context) : LinearLayout(context) {
+    init {
+        orientation = VERTICAL
+        layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT)
+
+        val row = LinearLayout(context)
+        row.orientation = HORIZONTAL
+        addView(row, LayoutParams(MATCH_PARENT, WRAP_CONTENT))
+
+        val text1 = EditText(context)
+        text1.inputType = EditorInfo.TYPE_CLASS_NUMBER
+        row.addView(text1, LayoutParams(0, WRAP_CONTENT, 1f))
+        val text2 = EditText(context)
+        row.addView(text2, LayoutParams(0, WRAP_CONTENT, 1f))
+        val button = AndroidButton(context)
+        fun updateButtonText() {
+            button.text = if (button.isFocused) "Focused" else "Click to focus"
+        }
+        updateButtonText()
+        button.isFocusableInTouchMode = true
+        button.setOnClickListener { button.requestFocus() }
+        button.setOnFocusChangeListener { _, _ -> updateButtonText() }
+        row.addView(button, LayoutParams(0, WRAP_CONTENT, 1f))
+
+        val innerCompose = ComposeView(context)
+        innerCompose.setContent {
+            Column(
+                Modifier
+                    .border(1.dp, Color.Black, shape = RoundedCornerShape(8.dp))
+                    .padding(4.dp)
+            ) {
+                Text("Inner Compose Fields")
+                FocusableFieldRow()
+            }
+        }
+        addView(innerCompose, LayoutParams(MATCH_PARENT, WRAP_CONTENT))
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt
index e8cf9b0..a938ed8 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfoTest.kt
@@ -17,6 +17,7 @@
 package androidx.compose.foundation.lazy.grid
 
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.PaddingValues
@@ -25,8 +26,8 @@
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.lazy.GridCells
 import androidx.compose.foundation.lazy.LazyGridLayoutInfo
-import androidx.compose.foundation.lazy.LazyVerticalGrid
 import androidx.compose.foundation.lazy.LazyGridState
+import androidx.compose.foundation.lazy.LazyVerticalGrid
 import androidx.compose.foundation.lazy.items
 import androidx.compose.foundation.lazy.rememberLazyGridState
 import androidx.compose.runtime.Composable
@@ -251,13 +252,13 @@
     }
 
     @Test
-    fun viewportOffsetsAreCorrect() {
+    fun viewportOffsetsAndSizeAreCorrect() {
         val sizePx = 45
         val sizeDp = with(rule.density) { sizePx.toDp() }
         lateinit var state: LazyGridState
         rule.setContent {
             LazyVerticalGrid(
-                modifier = Modifier.size(sizeDp),
+                modifier = Modifier.height(sizeDp).width(sizeDp * 2),
                 // reverseLayout = reverseLayout,
                 state = rememberLazyGridState().also { state = it },
                 cells = GridCells.Fixed(2)
@@ -271,11 +272,12 @@
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(0)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx)
+            assertThat(state.layoutInfo.viewportSize).isEqualTo(IntSize(sizePx * 2, sizePx))
         }
     }
 
     @Test
-    fun viewportOffsetsAreCorrectWithContentPadding() {
+    fun viewportOffsetsAndSizeAreCorrectWithContentPadding() {
         val sizePx = 45
         val startPaddingPx = 10
         val endPaddingPx = 15
@@ -289,8 +291,13 @@
         lateinit var state: LazyGridState
         rule.setContent {
             LazyVerticalGrid(
-                modifier = Modifier.size(sizeDp),
-                contentPadding = PaddingValues(top = topPaddingDp, bottom = bottomPaddingDp),
+                modifier = Modifier.height(sizeDp).width(sizeDp * 2),
+                contentPadding = PaddingValues(
+                    top = topPaddingDp,
+                    bottom = bottomPaddingDp,
+                    start = 2.dp,
+                    end = 2.dp
+                ),
                 // reverseLayout = reverseLayout,
                 state = rememberLazyGridState().also { state = it },
                 cells = GridCells.Fixed(2)
@@ -304,6 +311,8 @@
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(-startPaddingPx)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
+            // TODO(b/211753558) currently failing because we need to port aosp/1903956 to grids
+            // assertThat(state.layoutInfo.viewportSize).isEqualTo(IntSize(sizePx * 2, sizePx))
         }
     }
 
@@ -327,6 +336,48 @@
         }
     }
 
+    @Test
+    fun reverseLayoutIsCorrect() {
+        lateinit var state: LazyGridState
+        rule.setContent {
+            LazyVerticalGrid(
+                state = rememberLazyGridState().also { state = it },
+                // reverseLayout = reverseLayout,
+                modifier = Modifier.width(gridWidthDp).height(itemSizeDp * 3.5f),
+                cells = GridCells.Fixed(2)
+            ) {
+                items((0..11).toList()) {
+                    Box(Modifier.size(itemSizeDp))
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.layoutInfo.reverseLayout).isEqualTo(false/*reverseLayout*/)
+        }
+    }
+
+    @Test
+    fun orientationIsCorrect() {
+        lateinit var state: LazyGridState
+        rule.setContent {
+            LazyVerticalGrid(
+                state = rememberLazyGridState().also { state = it },
+                // reverseLayout = reverseLayout,
+                modifier = Modifier.width(gridWidthDp).height(itemSizeDp * 3.5f),
+                cells = GridCells.Fixed(2)
+            ) {
+                items((0..11).toList()) {
+                    Box(Modifier.size(itemSizeDp))
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.layoutInfo.orientation).isEqualTo(Orientation.Vertical)
+        }
+    }
+
     fun LazyGridLayoutInfo.assertVisibleItems(
         count: Int,
         itemsPerRow: Int,
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt
index ba84f74..3c3ff16 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridTest.kt
@@ -188,13 +188,13 @@
             .scrollBy(y = 103.dp, density = rule.density)
 
         rule.onNodeWithTag("1")
-            .assertDoesNotExist()
+            .assertIsNotDisplayed()
 
         rule.onNodeWithTag("2")
             .assertIsNotDisplayed()
 
         rule.onNodeWithTag("3")
-            .assertIsNotDisplayed()
+            .assertDoesNotExist()
 
         rule.onNodeWithTag("4")
             .assertIsDisplayed()
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt
index 1a270eb..caf0497 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutTest.kt
@@ -56,6 +56,7 @@
                 override val itemsCount: Int = 0
                 override fun getKey(index: Int) = Unit
                 override val keyToIndexMap: Map<Any, Int> = emptyMap()
+                override fun getContentType(index: Int): Any? = null
             }
         }
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
index 93cdcc9..62d8083 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/BaseLazyListTestWithOrientation.kt
@@ -22,6 +22,7 @@
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.ScrollableDefaults
 import androidx.compose.foundation.gestures.animateScrollBy
+import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxWidth
@@ -187,9 +188,15 @@
         reverseLayout: Boolean = false,
         flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
         userScrollEnabled: Boolean = true,
+        spacedBy: Dp = 0.dp,
         content: LazyListScope.() -> Unit
     ) {
         if (vertical) {
+            val verticalArrangement = when {
+                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                !reverseLayout -> Arrangement.Top
+                else -> Arrangement.Bottom
+            }
             LazyColumn(
                 modifier = modifier,
                 state = state,
@@ -197,9 +204,15 @@
                 reverseLayout = reverseLayout,
                 flingBehavior = flingBehavior,
                 userScrollEnabled = userScrollEnabled,
+                verticalArrangement = verticalArrangement,
                 content = content
             )
         } else {
+            val horizontalArrangement = when {
+                spacedBy != 0.dp -> Arrangement.spacedBy(spacedBy)
+                !reverseLayout -> Arrangement.Start
+                else -> Arrangement.End
+            }
             LazyRow(
                 modifier = modifier,
                 state = state,
@@ -207,6 +220,7 @@
                 reverseLayout = reverseLayout,
                 flingBehavior = flingBehavior,
                 userScrollEnabled = userScrollEnabled,
+                horizontalArrangement = horizontalArrangement,
                 content = content
             )
         }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt
index f48c22d..3b3cbea 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListLayoutInfoTest.kt
@@ -16,11 +16,9 @@
 
 package androidx.compose.foundation.lazy.list
 
-import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.requiredSize
-import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyListLayoutInfo
 import androidx.compose.foundation.lazy.LazyListState
 import androidx.compose.foundation.lazy.items
@@ -31,15 +29,14 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
 import kotlinx.coroutines.runBlocking
 import org.junit.Before
-import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -47,16 +44,20 @@
 @MediumTest
 @RunWith(Parameterized::class)
 class LazyListLayoutInfoTest(
-    private val reverseLayout: Boolean
-) {
+    param: LayoutInfoTestParam
+) : BaseLazyListTestWithOrientation(param.orientation) {
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "reverseLayout={0}")
-        fun initParameters(): Array<Any> = arrayOf(false, true)
+        @Parameterized.Parameters(name = "{0}")
+        fun initParameters(): Array<Any> = arrayOf(
+            LayoutInfoTestParam(Orientation.Vertical, false),
+            LayoutInfoTestParam(Orientation.Vertical, true),
+            LayoutInfoTestParam(Orientation.Horizontal, false),
+            LayoutInfoTestParam(Orientation.Horizontal, true),
+        )
     }
 
-    @get:Rule
-    val rule = createComposeRule()
+    private val reverseLayout = param.reverseLayout
 
     private var itemSizePx: Int = 50
     private var itemSizeDp: Dp = Dp.Infinity
@@ -72,7 +73,7 @@
     fun visibleItemsAreCorrect() {
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumn(
+            LazyColumnOrRow(
                 state = rememberLazyListState().also { state = it },
                 reverseLayout = reverseLayout,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
@@ -92,7 +93,7 @@
     fun visibleItemsAreCorrectAfterScroll() {
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumn(
+            LazyColumnOrRow(
                 state = rememberLazyListState().also { state = it },
                 reverseLayout = reverseLayout,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
@@ -115,10 +116,10 @@
     fun visibleItemsAreCorrectWithSpacing() {
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumn(
+            LazyColumnOrRow(
                 state = rememberLazyListState().also { state = it },
                 reverseLayout = reverseLayout,
-                verticalArrangement = Arrangement.spacedBy(itemSizeDp),
+                spacedBy = itemSizeDp,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
             ) {
                 items((0..5).toList()) {
@@ -141,7 +142,7 @@
         lateinit var state: LazyListState
         val currentInfo = StableRef<LazyListLayoutInfo?>(null)
         rule.setContent {
-            LazyColumn(
+            LazyColumnOrRow(
                 state = rememberLazyListState().also { state = it },
                 reverseLayout = reverseLayout,
                 modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
@@ -177,7 +178,7 @@
             currentInfo = state.layoutInfo
         }
         rule.setContent {
-            LazyColumn(
+            LazyColumnOrRow(
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
@@ -206,7 +207,7 @@
         var count by mutableStateOf(10)
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumn(
+            LazyColumnOrRow(
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
@@ -227,13 +228,13 @@
     }
 
     @Test
-    fun viewportOffsetsAreCorrect() {
+    fun viewportOffsetsAndSizeAreCorrect() {
         val sizePx = 45
         val sizeDp = with(rule.density) { sizePx.toDp() }
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumn(
-                Modifier.requiredSize(sizeDp),
+            LazyColumnOrRow(
+                Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
@@ -246,26 +247,34 @@
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(0)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx)
+            assertThat(state.layoutInfo.viewportSize).isEqualTo(
+                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+            )
         }
     }
 
     @Test
-    fun viewportOffsetsAreCorrectWithContentPadding() {
+    fun viewportOffsetsAndSizeAreCorrectWithContentPadding() {
         val sizePx = 45
         val startPaddingPx = 10
         val endPaddingPx = 15
         val sizeDp = with(rule.density) { sizePx.toDp() }
-        val topPaddingDp = with(rule.density) {
+        val beforeContentPaddingDp = with(rule.density) {
             if (!reverseLayout) startPaddingPx.toDp() else endPaddingPx.toDp()
         }
-        val bottomPaddingDp = with(rule.density) {
+        val afterContentPaddingDp = with(rule.density) {
             if (!reverseLayout) endPaddingPx.toDp() else startPaddingPx.toDp()
         }
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumn(
-                Modifier.requiredSize(sizeDp),
-                contentPadding = PaddingValues(top = topPaddingDp, bottom = bottomPaddingDp),
+            LazyColumnOrRow(
+                Modifier.mainAxisSize(sizeDp).crossAxisSize(sizeDp * 2),
+                contentPadding = PaddingValues(
+                    beforeContent = beforeContentPaddingDp,
+                    afterContent = afterContentPaddingDp,
+                    beforeContentCrossAxis = 2.dp,
+                    afterContentCrossAxis = 2.dp
+                ),
                 reverseLayout = reverseLayout,
                 state = rememberLazyListState().also { state = it }
             ) {
@@ -278,6 +287,9 @@
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(-startPaddingPx)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
+            assertThat(state.layoutInfo.viewportSize).isEqualTo(
+                if (vertical) IntSize(sizePx * 2, sizePx) else IntSize(sizePx, sizePx * 2)
+            )
         }
     }
 
@@ -285,7 +297,7 @@
     fun emptyItemsInVisibleItemsInfo() {
         lateinit var state: LazyListState
         rule.setContent {
-            LazyColumn(
+            LazyColumnOrRow(
                 state = rememberLazyListState().also { state = it }
             ) {
                 item { Box(Modifier) }
@@ -300,6 +312,46 @@
         }
     }
 
+    @Test
+    fun reverseLayoutIsCorrect() {
+        lateinit var state: LazyListState
+        rule.setContent {
+            LazyColumnOrRow(
+                state = rememberLazyListState().also { state = it },
+                reverseLayout = reverseLayout,
+                modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
+            ) {
+                items((0..5).toList()) {
+                    Box(Modifier.requiredSize(itemSizeDp))
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.layoutInfo.reverseLayout).isEqualTo(reverseLayout)
+        }
+    }
+
+    @Test
+    fun orientationIsCorrect() {
+        lateinit var state: LazyListState
+        rule.setContent {
+            LazyColumnOrRow(
+                state = rememberLazyListState().also { state = it },
+                modifier = Modifier.requiredSize(itemSizeDp * 3.5f)
+            ) {
+                items((0..5).toList()) {
+                    Box(Modifier.requiredSize(itemSizeDp))
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(state.layoutInfo.orientation)
+                .isEqualTo(if (vertical) Orientation.Vertical else Orientation.Horizontal)
+        }
+    }
+
     fun LazyListLayoutInfo.assertVisibleItems(
         count: Int,
         startIndex: Int = 0,
@@ -321,5 +373,14 @@
     }
 }
 
+class LayoutInfoTestParam(
+    val orientation: Orientation,
+    val reverseLayout: Boolean
+) {
+    override fun toString(): String {
+        return "orientation=$orientation;reverseLayout=$reverseLayout"
+    }
+}
+
 @Stable
 class StableRef<T>(var value: T)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt
index f9d6f61..d6f0aa6 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListSlotsReuseTest.kt
@@ -18,9 +18,12 @@
 
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.items
 import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.testTag
@@ -28,6 +31,7 @@
 import androidx.compose.ui.test.assertIsNotDisplayed
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth
@@ -325,4 +329,117 @@
             .assertExists()
             .assertIsNotDisplayed()
     }
+
+    @Test
+    fun differentContentTypes() {
+        lateinit var state: LazyListState
+        rule.setContent {
+            state = rememberLazyListState()
+            LazyColumn(
+                Modifier.height(itemsSizeDp * 6.5f),
+                state
+            ) {
+                items(
+                    100,
+                    contentType = { if (it <= 2) 0 else 1 }
+                ) {
+                    Spacer(Modifier.height(itemsSizeDp).fillParentMaxWidth().testTag("$it"))
+                }
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollToItem(6)
+            }
+        }
+
+        rule.onNodeWithTag("6")
+            .assertIsDisplayed()
+
+        // two items of type 0 are left for reuse
+        rule.onNodeWithTag("0")
+            .assertExists()
+            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1")
+            .assertExists()
+            .assertIsNotDisplayed()
+        rule.onNodeWithTag("2")
+            .assertDoesNotExist()
+
+        // and two items of type 1
+        rule.onNodeWithTag("3")
+            .assertExists()
+            .assertIsNotDisplayed()
+        rule.onNodeWithTag("4")
+            .assertExists()
+            .assertIsNotDisplayed()
+        rule.onNodeWithTag("5")
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun differentTypesFromDifferentItemCalls() {
+        lateinit var state: LazyListState
+        rule.setContent {
+            state = rememberLazyListState()
+            LazyColumn(
+                Modifier.height(itemsSizeDp * 2.5f),
+                state
+            ) {
+                val content = @Composable { tag: String ->
+                    Spacer(Modifier.height(itemsSizeDp).width(10.dp).testTag(tag))
+                }
+                item(contentType = "not-to-reuse-0") {
+                    content("0")
+                }
+                item(contentType = "reuse") {
+                    content("1")
+                }
+                items(
+                    List(100) { it + 2 },
+                    contentType = { if (it == 10) "reuse" else "not-to-reuse-$it" }) {
+                    content("$it")
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollToItem(2)
+                // now items 0 and 1 are put into reusables
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertExists()
+            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1")
+            .assertExists()
+            .assertIsNotDisplayed()
+
+        rule.runOnIdle {
+            runBlocking {
+                state.scrollToItem(9)
+                // item 10 should reuse slot 1
+            }
+        }
+
+        rule.onNodeWithTag("0")
+            .assertExists()
+            .assertIsNotDisplayed()
+        rule.onNodeWithTag("1")
+            .assertDoesNotExist()
+        rule.onNodeWithTag("9")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("10")
+            .assertIsDisplayed()
+        rule.onNodeWithTag("11")
+            .assertIsDisplayed()
+    }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt
index 6f9587f..9cb0e46 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldInputServiceIntegrationTest.kt
@@ -16,8 +16,12 @@
 
 package androidx.compose.foundation.text
 
+import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.platform.LocalTextInputService
 import androidx.compose.ui.platform.testTag
@@ -25,8 +29,8 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardCapitalization
 import androidx.compose.ui.text.input.ImeOptions
+import androidx.compose.ui.text.input.KeyboardCapitalization
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.text.input.PlatformTextInputService
 import androidx.compose.ui.text.input.TextFieldValue
@@ -36,6 +40,7 @@
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.eq
+import com.nhaarman.mockitokotlin2.inOrder
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.times
 import com.nhaarman.mockitokotlin2.verify
@@ -50,11 +55,11 @@
     @get:Rule
     val rule = createComposeRule()
 
+    private val platformTextInputService = mock<PlatformTextInputService>()
+    private val textInputService = TextInputService(platformTextInputService)
+
     @Test
     fun textField_ImeOptions_isPassedTo_platformTextInputService() {
-        val platformTextInputService = mock<PlatformTextInputService>()
-        val textInputService = TextInputService(platformTextInputService)
-
         val testTag = "KeyboardOption"
         val value = TextFieldValue("abc")
         val imeOptions = ImeOptions(
@@ -67,17 +72,15 @@
 
         var focused = false
 
-        rule.setContent {
-            CompositionLocalProvider(LocalTextInputService provides textInputService) {
-                CoreTextField(
-                    value = value,
-                    imeOptions = imeOptions,
-                    modifier = Modifier
-                        .testTag(testTag)
-                        .onFocusChanged { focused = it.isFocused },
-                    onValueChange = {}
-                )
-            }
+        setContent {
+            CoreTextField(
+                value = value,
+                imeOptions = imeOptions,
+                modifier = Modifier
+                    .testTag(testTag)
+                    .onFocusChanged { focused = it.isFocused },
+                onValueChange = {}
+            )
         }
 
         rule.onNodeWithTag(testTag).performClick()
@@ -93,4 +96,53 @@
             )
         }
     }
+
+    @Test
+    fun textField_stopsThenStartsInput_whenFocusMovesBetweenTextFields() {
+        val value = TextFieldValue("abc")
+        val focusRequester1 = FocusRequester()
+        val focusRequester2 = FocusRequester()
+
+        setContent {
+            Column {
+                CoreTextField(
+                    value = value,
+                    onValueChange = {},
+                    modifier = Modifier.focusRequester(focusRequester1)
+                )
+                CoreTextField(
+                    value = value,
+                    onValueChange = {},
+                    modifier = Modifier.focusRequester(focusRequester2)
+                )
+            }
+        }
+        rule.runOnIdle {
+            focusRequester1.requestFocus()
+        }
+
+        // Focus the other field. The IME connection should restart only once.
+        rule.runOnIdle {
+            focusRequester2.requestFocus()
+        }
+
+        rule.runOnIdle {
+            inOrder(platformTextInputService) {
+                verify(platformTextInputService).startInput(any(), any(), any(), any())
+                // On Android, this stopInput should no-op because of the immediately-following call
+                // to startInput. See b/187746439.
+                verify(platformTextInputService).stopInput()
+                verify(platformTextInputService).startInput(any(), any(), any(), any())
+            }
+        }
+    }
+
+    private fun setContent(content: @Composable () -> Unit) {
+        rule.setContent {
+            CompositionLocalProvider(
+                LocalTextInputService provides textInputService,
+                content = content
+            )
+        }
+    }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt
index 83eb42d6..ae3ed31 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSoftKeyboardTest.kt
@@ -39,6 +39,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
+import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -195,7 +196,8 @@
             if (condition()) { latch.countDown() }
         }
     )
-    latch.await(timeoutMillis, TimeUnit.MILLISECONDS)
+    val conditionMet = latch.await(timeoutMillis, TimeUnit.MILLISECONDS)
+    assertThat(conditionMet).isTrue()
 }
 
 @RequiresApi(Build.VERSION_CODES.R)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
index 43c41d6..3b7236b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
@@ -41,9 +41,23 @@
      * When you specify the key the scroll position will be maintained based on the key, which
      * means if you add/remove items before the current visible item the item with the given key
      * will be kept as the first visible one.
+     * @param contentType the type of the content of this item. The item compositions of the same
+     * type could be reused more efficiently. Note that null is a valid type and items of such
+     * type will be considered compatible.
      * @param content the content of the item
      */
-    fun item(key: Any? = null, content: @Composable LazyItemScope.() -> Unit)
+    fun item(
+        key: Any? = null,
+        contentType: Any? = null,
+        content: @Composable LazyItemScope.() -> Unit
+    ) {
+        error("The method is not implemented")
+    }
+
+    @Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
+    fun item(key: Any? = null, content: @Composable LazyItemScope.() -> Unit) {
+        item(key, null, content)
+    }
 
     /**
      * Adds a [count] of items.
@@ -55,13 +69,28 @@
      * When you specify the key the scroll position will be maintained based on the key, which
      * means if you add/remove items before the current visible item the item with the given key
      * will be kept as the first visible one.
+     * @param contentType a factory of the content types for the item. The item compositions of
+     * the same type could be reused more efficiently. Note that null is a valid type and items of such
+     * type will be considered compatible.
      * @param itemContent the content displayed by a single item
      */
     fun items(
         count: Int,
         key: ((index: Int) -> Any)? = null,
+        contentType: (index: Int) -> Any? = { null },
         itemContent: @Composable LazyItemScope.(index: Int) -> Unit
-    )
+    ) {
+        error("The method is not implemented")
+    }
+
+    @Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
+    fun items(
+        count: Int,
+        key: ((index: Int) -> Any)? = null,
+        itemContent: @Composable LazyItemScope.(index: Int) -> Unit
+    ) {
+        items(count, key, { null }, itemContent)
+    }
 
     /**
      * Adds a sticky header item, which will remain pinned even when scrolling after it.
@@ -75,10 +104,17 @@
      * When you specify the key the scroll position will be maintained based on the key, which
      * means if you add/remove items before the current visible item the item with the given key
      * will be kept as the first visible one.
+     * @param contentType the type of the content of this item. The item compositions of the same
+     * type could be reused more efficiently. Note that null is a valid type and items of such
+     * type will be considered compatible.
      * @param content the content of the header
      */
     @ExperimentalFoundationApi
-    fun stickyHeader(key: Any? = null, content: @Composable LazyItemScope.() -> Unit)
+    fun stickyHeader(
+        key: Any? = null,
+        contentType: Any? = null,
+        content: @Composable LazyItemScope.() -> Unit
+    )
 }
 
 /**
@@ -91,16 +127,31 @@
  * When you specify the key the scroll position will be maintained based on the key, which
  * means if you add/remove items before the current visible item the item with the given key
  * will be kept as the first visible one.
+ * @param contentType a factory of the content types for the item. The item compositions of
+ * the same type could be reused more efficiently. Note that null is a valid type and items of such
+ * type will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.items(
     items: List<T>,
     noinline key: ((item: T) -> Any)? = null,
+    noinline contentType: (item: T) -> Any? = { null },
     crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
-) = items(items.size, if (key != null) { index: Int -> key(items[index]) } else null) {
+) = items(
+    count = items.size,
+    key = if (key != null) { index: Int -> key(items[index]) } else null,
+    contentType = { index: Int -> contentType(items[index]) }
+) {
     itemContent(items[it])
 }
 
+@Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
+inline fun <T> LazyListScope.items(
+    items: List<T>,
+    noinline key: ((item: T) -> Any)? = null,
+    crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items, key, itemContent = itemContent)
+
 /**
  * Adds a list of items where the content of an item is aware of its index.
  *
@@ -111,16 +162,31 @@
  * When you specify the key the scroll position will be maintained based on the key, which
  * means if you add/remove items before the current visible item the item with the given key
  * will be kept as the first visible one.
+ * @param contentType a factory of the content types for the item. The item compositions of
+ * the same type could be reused more efficiently. Note that null is a valid type and items of such
+ * type will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.itemsIndexed(
     items: List<T>,
     noinline key: ((index: Int, item: T) -> Any)? = null,
+    crossinline contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
     crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
-) = items(items.size, if (key != null) { index: Int -> key(index, items[index]) } else null) {
+) = items(
+    count = items.size,
+    key = if (key != null) { index: Int -> key(index, items[index]) } else null,
+    contentType = { index -> contentType(index, items[index]) }
+) {
     itemContent(it, items[it])
 }
 
+@Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
+inline fun <T> LazyListScope.itemsIndexed(
+    items: List<T>,
+    noinline key: ((index: Int, item: T) -> Any)? = null,
+    crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = itemsIndexed(items, key, itemContent = itemContent)
+
 /**
  * Adds an array of items.
  *
@@ -131,16 +197,31 @@
  * When you specify the key the scroll position will be maintained based on the key, which
  * means if you add/remove items before the current visible item the item with the given key
  * will be kept as the first visible one.
+ * @param contentType a factory of the content types for the item. The item compositions of
+ * the same type could be reused more efficiently. Note that null is a valid type and items of such
+ * type will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.items(
     items: Array<T>,
     noinline key: ((item: T) -> Any)? = null,
+    noinline contentType: (item: T) -> Any? = { null },
     crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
-) = items(items.size, if (key != null) { index: Int -> key(items[index]) } else null) {
+) = items(
+    count = items.size,
+    key = if (key != null) { index: Int -> key(items[index]) } else null,
+    contentType = { index: Int -> contentType(items[index]) }
+) {
     itemContent(items[it])
 }
 
+@Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
+inline fun <T> LazyListScope.items(
+    items: Array<T>,
+    noinline key: ((item: T) -> Any)? = null,
+    crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items, key, itemContent = itemContent)
+
 /**
  * Adds an array of items where the content of an item is aware of its index.
  *
@@ -151,16 +232,31 @@
  * When you specify the key the scroll position will be maintained based on the key, which
  * means if you add/remove items before the current visible item the item with the given key
  * will be kept as the first visible one.
+ * @param contentType a factory of the content types for the item. The item compositions of
+ * the same type could be reused more efficiently. Note that null is a valid type and items of such
+ * type will be considered compatible.
  * @param itemContent the content displayed by a single item
  */
 inline fun <T> LazyListScope.itemsIndexed(
     items: Array<T>,
     noinline key: ((index: Int, item: T) -> Any)? = null,
+    crossinline contentType: (index: Int, item: T) -> Any? = { _, _ -> null },
     crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
-) = items(items.size, if (key != null) { index: Int -> key(index, items[index]) } else null) {
+) = items(
+    count = items.size,
+    key = if (key != null) { index: Int -> key(index, items[index]) } else null,
+    contentType = { index -> contentType(index, items[index]) }
+) {
     itemContent(it, items[it])
 }
 
+@Deprecated("Use the non deprecated overload", level = DeprecationLevel.HIDDEN)
+inline fun <T> LazyListScope.itemsIndexed(
+    items: Array<T>,
+    noinline key: ((index: Int, item: T) -> Any)? = null,
+    crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = itemsIndexed(items, key, itemContent = itemContent)
+
 /**
  * The horizontally scrolling list that only composes and lays out the currently visible items.
  * The [content] block defines a DSL which allows you to emit items of different types. For
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridLayoutInfo.kt
index 3424c64..9d39afe 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridLayoutInfo.kt
@@ -17,6 +17,8 @@
 package androidx.compose.foundation.lazy
 
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.ui.unit.IntSize
 
 /**
  * Contains useful information about the currently displayed layout state of lazy grids like
@@ -42,7 +44,7 @@
 
     /**
      * The end offset of the layout's viewport. You can think of it as a maximum offset which
-     * would be visible. Usually it is a size of the lazy grid container plus a content padding.
+     * would be visible. Usually it is a size of the lazy grid container minus a content padding.
      *
      * You can use it to understand what items from [visibleItemsInfo] are fully visible.
      */
@@ -52,4 +54,19 @@
      * The total count of items passed to [LazyVerticalGrid].
      */
     val totalItemsCount: Int
+
+    /**
+     * The size of the viewport. It is the lazy grid layout size including all the content paddings.
+     */
+    val viewportSize: IntSize
+
+    /**
+     * The orientation of the lazy grid.
+     */
+    val orientation: Orientation
+
+    /**
+     * True if the direction of scrolling and layout is reversed.
+     */
+    val reverseLayout: Boolean
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridState.kt
index 3587465..e4b8335 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyGridState.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.MutatePriority
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.gestures.ScrollableState
 import androidx.compose.foundation.interaction.InteractionSource
@@ -39,6 +40,7 @@
 import androidx.compose.ui.layout.RemeasurementModifier
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
 import kotlin.math.abs
 
 /**
@@ -391,4 +393,7 @@
     override val viewportStartOffset = 0
     override val viewportEndOffset = 0
     override val totalItemsCount = 0
+    override val viewportSize = IntSize.Zero
+    override val orientation = Orientation.Vertical
+    override val reverseLayout = false
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
index 40acb47..b322d7f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
@@ -16,6 +16,9 @@
 
 package androidx.compose.foundation.lazy
 
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.ui.unit.IntSize
+
 /**
  * Contains useful information about the currently displayed layout state of lazy lists like
  * [LazyColumn] or [LazyRow]. For example you can get the list of currently displayed item.
@@ -39,7 +42,7 @@
 
     /**
      * The end offset of the layout's viewport. You can think of it as a maximum offset which
-     * would be visible. Usually it is a size of the lazy list container plus a content padding.
+     * would be visible. Usually it is a size of the lazy list container minus a content padding.
      *
      * You can use it to understand what items from [visibleItemsInfo] are fully visible.
      */
@@ -49,4 +52,19 @@
      * The total count of items passed to [LazyColumn] or [LazyRow].
      */
     val totalItemsCount: Int
+
+    /**
+     * The size of the viewport. It is the lazy list layout size including all the content paddings.
+     */
+    val viewportSize: IntSize get() = IntSize.Zero
+
+    /**
+     * The orientation of the lazy list.
+     */
+    val orientation: Orientation get() = Orientation.Vertical
+
+    /**
+     * True if the direction of scrolling and layout is reversed.
+     */
+    val reverseLayout: Boolean get() = false
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index 023be6e..7581a4f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -17,6 +17,7 @@
 package androidx.compose.foundation.lazy
 
 import androidx.compose.foundation.MutatePriority
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.gestures.ScrollableState
 import androidx.compose.foundation.interaction.InteractionSource
@@ -40,6 +41,7 @@
 import androidx.compose.ui.layout.RemeasurementModifier
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
 import kotlin.math.abs
 
 /**
@@ -375,4 +377,7 @@
     override val viewportStartOffset = 0
     override val viewportEndOffset = 0
     override val totalItemsCount = 0
+    override val viewportSize = IntSize.Zero
+    override val orientation = Orientation.Vertical
+    override val reverseLayout = false
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemsProviderImpl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemsProviderImpl.kt
index e9637ea..a3eeb88 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemsProviderImpl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemsProviderImpl.kt
@@ -101,6 +101,9 @@
 
     override val keyToIndexMap: Map<Any, Int> = generateKeyToIndexMap(nearestItemsRange, intervals)
 
+    // TODO(b/215372836) add content types support for grids.
+    override fun getContentType(index: Int): Any? = null
+
     private fun getIntervalForIndex(itemIndex: Int) = lastInterval.let {
         if (it != null && itemIndex in it.startIndex until it.startIndex + it.size) {
             it
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
index c2d04ea..144bf09 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
@@ -17,6 +17,7 @@
 package androidx.compose.foundation.lazy.grid
 
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.Placeable
@@ -67,7 +68,9 @@
             visibleItemsInfo = emptyList(),
             viewportStartOffset = -beforeContentPadding,
             viewportEndOffset = afterContentPadding,
-            totalItemsCount = 0
+            totalItemsCount = 0,
+            reverseLayout = reverseLayout,
+            orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal,
         )
     } else {
         var currentFirstLineIndex = firstVisibleLineIndex
@@ -239,6 +242,8 @@
             viewportEndOffset = maximumVisibleOffset,
             visibleItemsInfo = positionedItems,
             totalItemsCount = itemsCount,
+            reverseLayout = reverseLayout,
+            orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
         )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt
index 985a159..ec2e689 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasureResult.kt
@@ -17,11 +17,13 @@
 package androidx.compose.foundation.lazy.grid
 
 import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.lazy.LazyGridItemInfo
 import androidx.compose.foundation.lazy.LazyGridLayoutInfo
 import androidx.compose.foundation.lazy.layout.LazyLayoutItemInfo
 import androidx.compose.foundation.lazy.layout.LazyLayoutMeasureResult
 import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastMap
 
 /**
@@ -49,6 +51,10 @@
     override val viewportEndOffset: Int,
     /** see [LazyGridLayoutInfo.totalItemsCount] */
     override val totalItemsCount: Int,
+    /** see [LazyGridLayoutInfo.reverseLayout] */
+    override val reverseLayout: Boolean,
+    /** see [LazyGridLayoutInfo.orientation] */
+    override val orientation: Orientation,
 ) : LazyGridLayoutInfo, MeasureResult by measureResult {
     val lazyLayoutMeasureResult: LazyLayoutMeasureResult get() =
         object : LazyLayoutMeasureResult, MeasureResult by measureResult {
@@ -60,4 +66,7 @@
                     }
                 }
         }
+
+    override val viewportSize: IntSize
+        get() = IntSize(measureResult.width, measureResult.height)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
index f90e1fb..d0adc42 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayout.kt
@@ -21,6 +21,7 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.layout.SubcomposeLayout
 import androidx.compose.ui.layout.SubcomposeLayoutState
+import androidx.compose.ui.layout.SubcomposeSlotReusePolicy
 
 /**
  * A layout that only composes and lays out currently visible items. Can be used to build
@@ -36,7 +37,9 @@
     val state = remember { LazyLayoutState() }
     state.itemsProvider = itemsProvider
     val itemContentFactory = rememberItemContentFactory(state)
-    val subcomposeLayoutState = remember { SubcomposeLayoutState(MaxItemsToRetainForReuse) }
+    val subcomposeLayoutState = remember(itemContentFactory) {
+        SubcomposeLayoutState(LazyLayoutItemReusePolicy(itemContentFactory))
+    }
     prefetchPolicy?.let {
         LazyLayoutPrefetcher(prefetchPolicy, state, itemContentFactory, subcomposeLayoutState)
     }
@@ -65,6 +68,31 @@
     )
 }
 
+private class LazyLayoutItemReusePolicy(
+    private val factory: LazyLayoutItemContentFactory
+) : SubcomposeSlotReusePolicy {
+    private val countPerType = mutableMapOf<Any?, Int>()
+
+    override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {
+        countPerType.clear()
+        with(slotIds.iterator()) {
+            while (hasNext()) {
+                val slotId = next()
+                val type = factory.getContentType(slotId)
+                val currentCount = countPerType[type] ?: 0
+                if (currentCount == MaxItemsToRetainForReuse) {
+                    remove()
+                } else {
+                    countPerType[type] = currentCount + 1
+                }
+            }
+        }
+    }
+
+    override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean =
+        factory.getContentType(slotId) == factory.getContentType(reusableSlotId)
+}
+
 private const val MaxItemsToRetainForReuse = 2
 
 /**
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt
index 9230824..bdbc9cc 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory.kt
@@ -30,9 +30,8 @@
 @Composable
 internal fun rememberItemContentFactory(state: LazyLayoutState): LazyLayoutItemContentFactory {
     val saveableStateHolder = rememberSaveableStateHolder()
-    val itemsProvider = state.itemsProvider
-    return remember(itemsProvider) {
-        LazyLayoutItemContentFactory(saveableStateHolder, itemsProvider)
+    return remember(state) {
+        LazyLayoutItemContentFactory(saveableStateHolder) { state.itemsProvider.invoke() }
     }
 }
 
@@ -71,14 +70,34 @@
     }
 
     /**
+     * Returns the content type for the item with the given key. It is used to improve the item
+     * compositions reusing efficiency.
+     **/
+    fun getContentType(key: Any?): Any? {
+        val cachedContent = lambdasCache[key]
+        return if (cachedContent != null) {
+            cachedContent.type
+        } else {
+            val itemProvider = itemsProvider()
+            val index = itemProvider.keyToIndexMap[key]
+            if (index != null) {
+                itemProvider.getContentType(index)
+            } else {
+                null
+            }
+        }
+    }
+
+    /**
      * Return cached item content lambda or creates a new lambda and puts it in the cache.
      */
     fun getContent(index: Int, key: Any): @Composable () -> Unit {
-        val cachedContent = lambdasCache[key]
-        return if (cachedContent != null && cachedContent.lastKnownIndex == index) {
-            cachedContent.content
+        val cached = lambdasCache[key]
+        val type = itemsProvider().getContentType(index)
+        return if (cached != null && cached.lastKnownIndex == index && cached.type == type) {
+            cached.content
         } else {
-            val newContent = CachedItemContent(index, key)
+            val newContent = CachedItemContent(index, key, type)
             lambdasCache[key] = newContent
             newContent.content
         }
@@ -86,7 +105,8 @@
 
     private inner class CachedItemContent(
         initialIndex: Int,
-        val key: Any
+        val key: Any,
+        val type: Any?
     ) {
         var lastKnownIndex by mutableStateOf(initialIndex)
             private set
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemsProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemsProvider.kt
index ed553c5..584e93e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemsProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemsProvider.kt
@@ -33,4 +33,10 @@
      * the list as an optimization.
      **/
     val keyToIndexMap: Map<Any, Int>
+
+    /**
+     * Returns the content type for the item on this index. It is used to improve the item
+     * compositions reusing efficiency.
+     **/
+    fun getContentType(index: Int): Any?
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt
index 2f15422..b9ea0c8 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutState.kt
@@ -77,4 +77,6 @@
 
     override val keyToIndexMap: Map<Any, Int>
         get() = error("No items")
+
+    override fun getContentType(index: Int): Any = error("No items")
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListItemsProviderImpl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListItemsProviderImpl.kt
index 6c201be..a403bda 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListItemsProviderImpl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListItemsProviderImpl.kt
@@ -94,6 +94,12 @@
 
     override val keyToIndexMap: Map<Any, Int> = generateKeyToIndexMap(nearestItemsRange, list)
 
+    override fun getContentType(index: Int): Any? {
+        val interval = getIntervalForIndex(index)
+        val localIntervalIndex = index - interval.startIndex
+        return interval.content.type.invoke(localIntervalIndex)
+    }
+
     private fun getIntervalForIndex(itemIndex: Int) = lastInterval.let {
         if (it != null && itemIndex in it.startIndex until it.startIndex + it.size) {
             it
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasure.kt
index 2fd6f91..8fde536 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasure.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.lazy.list
 
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.ui.layout.MeasureResult
 import androidx.compose.ui.layout.Placeable
@@ -67,6 +68,8 @@
             viewportStartOffset = -beforeContentPadding,
             viewportEndOffset = afterContentPadding,
             totalItemsCount = 0,
+            reverseLayout = reverseLayout,
+            orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
         )
     } else {
         var currentFirstItemIndex = firstVisibleItemIndex
@@ -273,6 +276,8 @@
             viewportEndOffset = maximumVisibleOffset,
             visibleItemsInfo = positionedItems,
             totalItemsCount = itemsCount,
+            reverseLayout = reverseLayout,
+            orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal
         )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasureResult.kt
index 4f5d0003..da284d0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListMeasureResult.kt
@@ -16,11 +16,13 @@
 
 package androidx.compose.foundation.lazy.list
 
+import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.lazy.LazyListItemInfo
 import androidx.compose.foundation.lazy.LazyListLayoutInfo
 import androidx.compose.foundation.lazy.layout.LazyLayoutItemInfo
 import androidx.compose.foundation.lazy.layout.LazyLayoutMeasureResult
 import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastMap
 
 /**
@@ -47,6 +49,10 @@
     override val viewportEndOffset: Int,
     /** see [LazyListLayoutInfo.totalItemsCount] */
     override val totalItemsCount: Int,
+    /** see [LazyListLayoutInfo.reverseLayout] */
+    override val reverseLayout: Boolean,
+    /** see [LazyListLayoutInfo.orientation] */
+    override val orientation: Orientation
 ) : LazyListLayoutInfo, MeasureResult by measureResult {
     val lazyLayoutMeasureResult: LazyLayoutMeasureResult get() =
         object : LazyLayoutMeasureResult, MeasureResult by measureResult {
@@ -58,4 +64,7 @@
                     }
                 }
         }
+
+    override val viewportSize: IntSize
+        get() = IntSize(measureResult.width, measureResult.height)
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListScopeImpl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListScopeImpl.kt
index 87a33e3..7e2f0d3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListScopeImpl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyListScopeImpl.kt
@@ -34,39 +34,47 @@
     override fun items(
         count: Int,
         key: ((index: Int) -> Any)?,
+        contentType: (index: Int) -> Any?,
         itemContent: @Composable LazyItemScope.(index: Int) -> Unit
     ) {
         _intervals.add(
             count,
             LazyListIntervalContent(
                 key = key,
+                type = contentType,
                 content = { index -> @Composable { itemContent(index) } }
             )
         )
     }
 
-    override fun item(key: Any?, content: @Composable LazyItemScope.() -> Unit) {
+    override fun item(key: Any?, contentType: Any?, content: @Composable LazyItemScope.() -> Unit) {
         _intervals.add(
             1,
             LazyListIntervalContent(
                 key = if (key != null) { _: Int -> key } else null,
+                type = { contentType },
                 content = { @Composable { content() } }
             )
         )
     }
 
     @ExperimentalFoundationApi
-    override fun stickyHeader(key: Any?, content: @Composable LazyItemScope.() -> Unit) {
+    override fun stickyHeader(
+        key: Any?,
+        contentType: Any?,
+        content: @Composable LazyItemScope.() -> Unit
+    ) {
         val headersIndexes = _headerIndexes ?: mutableListOf<Int>().also {
             _headerIndexes = it
         }
         headersIndexes.add(_intervals.totalSize)
 
-        item(key, content)
+        item(key, contentType, content)
     }
 }
 
 internal class LazyListIntervalContent(
     val key: ((index: Int) -> Any)?,
+    val type: ((index: Int) -> Any?),
     val content: LazyItemScope.(index: Int) -> @Composable () -> Unit
 )
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
index a42bc23..accd805 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextFieldDelegate.kt
@@ -267,7 +267,8 @@
             onValueChange: (TextFieldValue) -> Unit,
             onImeActionPerformed: (ImeAction) -> Unit
         ): TextInputSession {
-            val textInputSession = restartInput(
+            // The keyboard will automatically be shown when the new IME connection is started.
+            return restartInput(
                 textInputService = textInputService,
                 value = value,
                 editProcessor = editProcessor,
@@ -275,10 +276,6 @@
                 onValueChange = onValueChange,
                 onImeActionPerformed = onImeActionPerformed
             )
-
-            textInputSession.showSoftwareKeyboard()
-
-            return textInputSession
         }
 
         /**
@@ -295,7 +292,8 @@
             onValueChange: (TextFieldValue) -> Unit
         ) {
             onValueChange(editProcessor.toTextFieldValue().copy(composition = null))
-            textInputSession.hideSoftwareKeyboard()
+            // Don't hide the keyboard when losing focus. If the target system needs that behavior,
+            // it can be implemented in the PlatformTextInputService.
             textInputSession.dispose()
         }
 
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
index b4caf02..f004e57 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
@@ -53,8 +53,10 @@
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.MeasurePolicy
 import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.constrainHeight
 import androidx.compose.ui.unit.constrainWidth
 import androidx.compose.ui.unit.dp
@@ -183,7 +185,7 @@
 ) = Scrollbar(
     adapter,
     modifier,
-    reverseLayout,
+    if (LocalLayoutDirection.current == LayoutDirection.Rtl) !reverseLayout else reverseLayout,
     style,
     interactionSource,
     isVertical = false
diff --git a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt
index 9248005..33012a7 100644
--- a/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt
+++ b/compose/foundation/foundation/src/test/kotlin/androidx/compose/foundation/text/TextFieldDelegateTest.kt
@@ -159,7 +159,6 @@
             eq(onEditorActionPerformed)
         )
 
-        verify(actual).showSoftwareKeyboard()
         assertThat(actual).isEqualTo(textInputSession)
     }
 
@@ -177,7 +176,6 @@
         TextFieldDelegate.onBlur(textInputSession, processor, onValueChange)
 
         inOrder(textInputSession) {
-            verify(textInputSession).hideSoftwareKeyboard()
             verify(textInputSession).dispose()
         }
         verify(onValueChange, times(1)).invoke(
diff --git a/compose/integration-tests/macrobenchmark-target/build.gradle b/compose/integration-tests/macrobenchmark-target/build.gradle
index 3b4567f..59af757 100644
--- a/compose/integration-tests/macrobenchmark-target/build.gradle
+++ b/compose/integration-tests/macrobenchmark-target/build.gradle
@@ -27,6 +27,7 @@
     // See aosp/1804059
     implementation projectOrArtifact(":lifecycle:lifecycle-common-java8")
     implementation(project(":compose:foundation:foundation-layout"))
+    implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:material:material"))
     implementation(project(":compose:runtime:runtime"))
     implementation(project(":compose:ui:ui"))
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml b/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
index 934f94f..595af14 100644
--- a/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
+++ b/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
@@ -76,5 +76,17 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+        <activity
+            android:name=".DifferentTypesListActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="androidx.compose.integration.macrobenchmark.target.DIFFERENT_TYPES_LIST_ACTIVITY" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
     </application>
 </manifest>
diff --git a/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/DifferentTypesListActivity.kt b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/DifferentTypesListActivity.kt
new file mode 100644
index 0000000..89d8de3
--- /dev/null
+++ b/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/compose/integration/macrobenchmark/target/DifferentTypesListActivity.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * 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 androidx.compose.integration.macrobenchmark.target
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.material.Card
+import androidx.compose.material.Checkbox
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+class DifferentTypesListActivity : ComponentActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        val itemCount = intent.getIntExtra(EXTRA_ITEM_COUNT, 3000)
+
+        setContent {
+            LazyColumn(
+                modifier = Modifier.fillMaxWidth().semantics { contentDescription = "IamLazy" }
+            ) {
+                items(count = itemCount, key = { it }, contentType = { it % 2 }) {
+                    if (it % 2 == 0) {
+                        EvenItem(it)
+                    } else {
+                        OddItem(it)
+                    }
+                }
+            }
+        }
+
+        launchIdlenessTracking()
+    }
+
+    companion object {
+        const val EXTRA_ITEM_COUNT = "ITEM_COUNT"
+    }
+}
+
+@Composable
+private fun OddItem(index: Int) {
+    Card(modifier = Modifier.padding(8.dp)) {
+        Row {
+            Text(
+                text = "Odd item $index",
+                modifier = Modifier.padding(16.dp)
+            )
+            Spacer(modifier = Modifier.weight(1f, fill = true))
+            Checkbox(
+                checked = false,
+                onCheckedChange = {},
+                modifier = Modifier.padding(16.dp)
+            )
+        }
+    }
+}
+
+@Composable
+private fun EvenItem(index: Int) {
+    Column(modifier = Modifier.padding(16.dp)) {
+        Text(text = "Even item title $index", fontSize = 17.sp)
+        Text(text = "Even item description")
+    }
+}
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/DifferentTypesListScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/DifferentTypesListScrollBenchmark.kt
new file mode 100644
index 0000000..bd78944
--- /dev/null
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/DifferentTypesListScrollBenchmark.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * 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 androidx.compose.integration.macrobenchmark
+
+import android.content.Intent
+import android.graphics.Point
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.FrameTimingGfxInfoMetric
+import androidx.benchmark.macro.FrameTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.Until
+import androidx.testutils.createCompilationParams
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class DifferentTypesListScrollBenchmark(
+    private val compilationMode: CompilationMode
+) {
+    @get:Rule
+    val benchmarkRule = MacrobenchmarkRule()
+
+    private lateinit var device: UiDevice
+
+    @Before
+    fun setUp() {
+        val instrumentation = InstrumentationRegistry.getInstrumentation()
+        device = UiDevice.getInstance(instrumentation)
+    }
+
+    @Test
+    fun start() {
+        benchmarkRule.measureRepeated(
+            packageName = PACKAGE_NAME,
+            metrics = listOf(FrameTimingMetric(), FrameTimingGfxInfoMetric()),
+            compilationMode = compilationMode,
+            iterations = 10,
+            setupBlock = {
+                val intent = Intent()
+                intent.action = ACTION
+                startActivityAndWait(intent)
+            }
+        ) {
+            val lazyColumn = device.findObject(By.desc(CONTENT_DESCRIPTION))
+            // Setting a gesture margin is important otherwise gesture nav is triggered.
+            lazyColumn.setGestureMargin(device.displayWidth / 5)
+            for (i in 1..10) {
+                // From center we scroll 2/3 of it which is 1/3 of the screen.
+                lazyColumn.drag(Point(0, lazyColumn.visibleCenter.y / 3))
+                device.wait(Until.findObject(By.desc(COMPOSE_IDLE)), 3000)
+            }
+        }
+    }
+
+    companion object {
+        private const val PACKAGE_NAME = "androidx.compose.integration.macrobenchmark.target"
+        private const val ACTION =
+            "androidx.compose.integration.macrobenchmark.target.DIFFERENT_TYPES_LIST_ACTIVITY"
+        private const val CONTENT_DESCRIPTION = "IamLazy"
+
+        private const val COMPOSE_IDLE = "COMPOSE-IDLE"
+
+        @Parameterized.Parameters(name = "compilation={0}")
+        @JvmStatic
+        fun parameters() = createCompilationParams()
+    }
+}
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index 9e4d42e9..9b25777 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -64,6 +64,21 @@
     method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
+  public final class CardDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation cardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation elevatedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation outlinedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    field public static final androidx.compose.material3.CardDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface CardElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+  }
+
+  public final class CardKt {
+  }
+
   @androidx.compose.runtime.Stable public interface CheckboxColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
@@ -317,7 +332,7 @@
   }
 
   public final class SurfaceKt {
-    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.InteractionSource? interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
diff --git a/compose/material3/material3/api/public_plus_experimental_current.txt b/compose/material3/material3/api/public_plus_experimental_current.txt
index f3f851e..c93b548 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -64,6 +64,24 @@
     method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
+  public final class CardDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation cardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation elevatedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation outlinedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    field public static final androidx.compose.material3.CardDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface CardElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+  }
+
+  public final class CardKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.InteractionSource? interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ElevatedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.InteractionSource? interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void OutlinedCard(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.InteractionSource? interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke border, optional androidx.compose.material3.CardElevation elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
   @androidx.compose.runtime.Stable public interface CheckboxColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
@@ -375,7 +393,7 @@
   }
 
   public final class SurfaceKt {
-    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.InteractionSource? interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index 9e4d42e9..9b25777 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -64,6 +64,21 @@
     method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
+  public final class CardDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation cardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation elevatedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.CardElevation outlinedCardElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float draggedElevation);
+    field public static final androidx.compose.material3.CardDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface CardElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource? interactionSource);
+  }
+
+  public final class CardKt {
+  }
+
   @androidx.compose.runtime.Stable public interface CheckboxColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
@@ -317,7 +332,7 @@
   }
 
   public final class SurfaceKt {
-    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.InteractionSource? interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
     property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
index 612aa8a..3d50af6 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
@@ -55,6 +55,18 @@
     examples = ButtonsExamples,
 )
 
+private val Card = Component(
+    id = nextId(),
+    name = "Card",
+    description = "Cards contain content and actions that relate information about a subject.",
+    // No card icon
+    tintIcon = true,
+    guidelinesUrl = "$StyleGuidelinesUrl/cards",
+    docsUrl = "$PackageSummaryUrl#card",
+    sourceUrl = "$Material3SourceUrl/Card.kt",
+    examples = CardExamples
+)
+
 private val Color = Component(
     id = nextId(),
     name = "Color",
@@ -210,6 +222,7 @@
 /** Components for the catalog, ordered alphabetically by name. */
 val Components = listOf(
     Buttons,
+    Card,
     Checkboxes,
     Color,
     Dialogs,
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
index fbdce5c..450590ab 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
@@ -23,10 +23,15 @@
 import androidx.compose.material3.samples.AlertDialogWithIconSample
 import androidx.compose.material3.samples.ButtonSample
 import androidx.compose.material3.samples.ButtonWithIconSample
+import androidx.compose.material3.samples.CardSample
 import androidx.compose.material3.samples.CheckboxSample
 import androidx.compose.material3.samples.CircularProgressIndicatorSample
+import androidx.compose.material3.samples.ClickableCardSample
+import androidx.compose.material3.samples.ClickableElevatedCardSample
+import androidx.compose.material3.samples.ClickableOutlinedCardSample
 import androidx.compose.material3.samples.ColorSchemeSample
 import androidx.compose.material3.samples.ElevatedButtonSample
+import androidx.compose.material3.samples.ElevatedCardSample
 import androidx.compose.material3.samples.EnterAlwaysSmallTopAppBar
 import androidx.compose.material3.samples.ExitUntilCollapsedLargeTopAppBar
 import androidx.compose.material3.samples.ExitUntilCollapsedMediumTopAppBar
@@ -42,6 +47,7 @@
 import androidx.compose.material3.samples.NavigationRailSample
 import androidx.compose.material3.samples.NavigationRailWithOnlySelectedLabelsSample
 import androidx.compose.material3.samples.OutlinedButtonSample
+import androidx.compose.material3.samples.OutlinedCardSample
 import androidx.compose.material3.samples.PinnedSmallTopAppBar
 import androidx.compose.material3.samples.RadioButtonSample
 import androidx.compose.material3.samples.RadioGroupSample
@@ -99,6 +105,53 @@
         ) { ButtonWithIconSample() }
     )
 
+private const val CardsExampleDescription = "Cards examples"
+private const val CardsExampleSourceUrl = "$SampleSourceUrl/CardSamples.kt"
+val CardExamples = listOf(
+    Example(
+        name = ::CardSample.name,
+        description = CardsExampleDescription,
+        sourceUrl = CardsExampleSourceUrl
+    ) {
+        CardSample()
+    },
+    Example(
+        name = ::ClickableCardSample.name,
+        description = CardsExampleDescription,
+        sourceUrl = CardsExampleSourceUrl
+    ) {
+        ClickableCardSample()
+    },
+    Example(
+        name = ::ElevatedCardSample.name,
+        description = CardsExampleDescription,
+        sourceUrl = CardsExampleSourceUrl
+    ) {
+        ElevatedCardSample()
+    },
+    Example(
+        name = ::ClickableElevatedCardSample.name,
+        description = CardsExampleDescription,
+        sourceUrl = CardsExampleSourceUrl
+    ) {
+        ClickableElevatedCardSample()
+    },
+    Example(
+        name = ::OutlinedCardSample.name,
+        description = CardsExampleDescription,
+        sourceUrl = CardsExampleSourceUrl
+    ) {
+        OutlinedCardSample()
+    },
+    Example(
+        name = ::ClickableOutlinedCardSample.name,
+        description = CardsExampleDescription,
+        sourceUrl = CardsExampleSourceUrl
+    ) {
+        ClickableOutlinedCardSample()
+    }
+)
+
 private const val ColorExampleDescription = "Color examples"
 private const val ColorExampleSourceUrl = "$SampleSourceUrl/ColorSamples.kt"
 val ColorExamples =
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
new file mode 100644
index 0000000..9c77d67
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/CardSamples.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.material3.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.Card
+import androidx.compose.material3.ElevatedCard
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.OutlinedCard
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun CardSample() {
+    Card(Modifier.size(width = 180.dp, height = 100.dp)) {
+        // Card content
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun ClickableCardSample() {
+    var count by remember { mutableStateOf(0) }
+    val interactionSource = remember { MutableInteractionSource() }
+    Card(
+        interactionSource = interactionSource,
+        modifier = Modifier.size(width = 180.dp, height = 100.dp)
+            .clickable(
+                interactionSource = interactionSource,
+                indication = null,
+                onClick = { count++ })
+    ) {
+        Box(Modifier.fillMaxSize()) {
+            Text("Count: $count", Modifier.align(Alignment.Center))
+        }
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun ElevatedCardSample() {
+    ElevatedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
+        // Card content
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun ClickableElevatedCardSample() {
+    val interactionSource = remember { MutableInteractionSource() }
+    var count by remember { mutableStateOf(0) }
+    ElevatedCard(
+        interactionSource = interactionSource,
+        modifier = Modifier.size(width = 180.dp, height = 100.dp)
+            .clickable(
+                interactionSource = interactionSource,
+                indication = null,
+                onClick = { count++ }
+            )
+    ) {
+        Box(Modifier.fillMaxSize()) {
+            Text("Count: $count", Modifier.align(Alignment.Center))
+        }
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun OutlinedCardSample() {
+    OutlinedCard(Modifier.size(width = 180.dp, height = 100.dp)) {
+        // Card content
+    }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun ClickableOutlinedCardSample() {
+    val interactionSource = remember { MutableInteractionSource() }
+    var count by remember { mutableStateOf(0) }
+    OutlinedCard(
+        interactionSource = interactionSource,
+        modifier = Modifier.size(width = 180.dp, height = 100.dp)
+            .clickable(
+                interactionSource = interactionSource,
+                indication = null,
+                onClick = { count++ }
+            )
+    ) {
+        Box(Modifier.fillMaxSize()) {
+            Text("Count: $count", Modifier.align(Alignment.Center))
+        }
+    }
+}
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SurfaceSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SurfaceSamples.kt
new file mode 100644
index 0000000..e9d5a68
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/SurfaceSamples.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.material3.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+
+@Sampled
+@Composable
+fun SurfaceSample() {
+    Surface {
+        Text("Text on Surface")
+    }
+}
+
+@Sampled
+@Composable
+fun ClickableSurfaceSample() {
+    var count by remember { mutableStateOf(0) }
+    val interactionSource = remember { MutableInteractionSource() }
+    Surface(
+        // Passing a null indication here because surface applies indication internally when given
+        // an interaction-source.
+        modifier = Modifier.clickable(interactionSource, indication = null, onClick = { count++ }),
+        interactionSource = interactionSource,
+    ) {
+        Text("Clickable Surface. Count: $count")
+    }
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ColorSchemeScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ColorSchemeScreenshotTest.kt
new file mode 100644
index 0000000..55b7bf1
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ColorSchemeScreenshotTest.kt
@@ -0,0 +1,368 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.material3
+
+import android.os.Build
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.luminance
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@MediumTest
+@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+@OptIn(ExperimentalTestApi::class, ExperimentalMaterial3Api::class)
+class ColorSchemeScreenshotTest(private val scheme: ColorSchemeWrapper) {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+
+    @Test
+    fun colorScheme() {
+        rule.setMaterialContent(scheme.colorScheme) {
+            Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
+                ColorSchemeDemo()
+            }
+        }
+        assertToggeableAgainstGolden("color_scheme_${scheme.name}")
+    }
+
+    private fun assertToggeableAgainstGolden(goldenName: String) {
+        rule.onNodeWithTag(Tag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, goldenName)
+    }
+
+    // Provide the ColorScheme and their name parameter in a ColorSchemeWrapper.
+    // This makes sure that the default method name and the initial Scuba image generated
+    // name is as expected.
+    companion object {
+        private val LightCustomColorScheme = lightColorScheme(
+            primary = Color(0xFF984816),
+            onPrimary = Color(0xFFFFFFFF),
+            primaryContainer = Color(0xFFFFDBC9),
+            onPrimaryContainer = Color(0xFF341000),
+            inversePrimary = Color(0xFFFFB68F),
+            secondary = Color(0xFF765849),
+            onSecondary = Color(0xFFFFFFFF),
+            secondaryContainer = Color(0xFFFFDBC9),
+            onSecondaryContainer = Color(0xFF2B160B),
+            tertiary = Color(0xFF656032),
+            onTertiary = Color(0xFFFFFFFF),
+            tertiaryContainer = Color(0xFFEBE4AA),
+            onTertiaryContainer = Color(0xFF1F1C00),
+            background = Color(0xFFFCFCFC),
+            onBackground = Color(0xFF201A17),
+            surface = Color(0xFFFCFCFC),
+            onSurface = Color(0xFF201A17),
+            surfaceVariant = Color(0xFFF4DED5),
+            onSurfaceVariant = Color(0xFF53443D),
+            inverseSurface = Color(0xFF362F2C),
+            inverseOnSurface = Color(0xFFFBEEE9),
+            error = Color(0xFFBA1B1B),
+            onError = Color(0xFFFFFFFF),
+            errorContainer = Color(0xFFFFDAD4),
+            onErrorContainer = Color(0xFF410001),
+            outline = Color(0xFF85736B),
+        )
+
+        private val DarkCustomColorScheme = darkColorScheme(
+            primary = Color(0xFFFFB68F),
+            onPrimary = Color(0xFF562000),
+            primaryContainer = Color(0xFF793100),
+            onPrimaryContainer = Color(0xFFFFDBC9),
+            inversePrimary = Color(0xFF984816),
+            secondary = Color(0xFFE6BEAC),
+            onSecondary = Color(0xFF432B1E),
+            secondaryContainer = Color(0xFF5C4032),
+            onSecondaryContainer = Color(0xFFFFDBC9),
+            tertiary = Color(0xFFCFC890),
+            onTertiary = Color(0xFF353107),
+            tertiaryContainer = Color(0xFF4C481C),
+            onTertiaryContainer = Color(0xFFEBE4AA),
+            background = Color(0xFF201A17),
+            onBackground = Color(0xFFEDE0DB),
+            surface = Color(0xFF201A17),
+            onSurface = Color(0xFFEDE0DB),
+            surfaceVariant = Color(0xFF53443D),
+            onSurfaceVariant = Color(0xFFD7C2B9),
+            inverseSurface = Color(0xFFEDE0DB),
+            inverseOnSurface = Color(0xFF362F2C),
+            error = Color(0xFFFFB4A9),
+            onError = Color(0xFF680003),
+            errorContainer = Color(0xFF930006),
+            onErrorContainer = Color(0xFFFFDAD4),
+            outline = Color(0xFFA08D85),
+        )
+
+        @Parameterized.Parameters(name = "{0}")
+        @JvmStatic
+        fun parameters() = arrayOf(
+            ColorSchemeWrapper("light", lightColorScheme()),
+            ColorSchemeWrapper("light_dynamic", LightCustomColorScheme),
+            ColorSchemeWrapper("dark", darkColorScheme()),
+            ColorSchemeWrapper("dark_dynamic", DarkCustomColorScheme),
+        )
+    }
+
+    class ColorSchemeWrapper(val name: String, val colorScheme: ColorScheme) {
+        override fun toString(): String {
+            return name
+        }
+    }
+
+    private val Tag = "ColorScheme"
+}
+
+@Composable
+private fun ColorSchemeDemo() {
+    val colorScheme = MaterialTheme.colorScheme
+    Row(
+        modifier = Modifier.padding(8.dp),
+    ) {
+        Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) {
+            Text("Surfaces", style = MaterialTheme.typography.bodyLarge)
+            ColorTile(
+                text = "On Background",
+                color = colorScheme.onBackground,
+            )
+            ColorTile(
+                text = "Background",
+                color = colorScheme.background,
+            )
+            Spacer(modifier = Modifier.height(16.dp))
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "On Surface",
+                        color = colorScheme.onSurface,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "On Surface Variant",
+                        color = colorScheme.onSurfaceVariant,
+                    )
+                },
+            )
+            ColorTile(text = "Surface", color = colorScheme.surface)
+            Spacer(modifier = Modifier.height(16.dp))
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "Inverse Primary",
+                        color = colorScheme.inversePrimary,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "Inverse On Surface",
+                        color = colorScheme.inverseOnSurface,
+                    )
+                },
+            )
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "Surface Variant",
+                        color = colorScheme.surfaceVariant,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "Inverse Surface",
+                        color = colorScheme.inverseSurface,
+                    )
+                },
+            )
+        }
+        Spacer(modifier = Modifier.width(24.dp))
+        Column(Modifier.weight(1f).verticalScroll(rememberScrollState())) {
+            Text("Content", style = MaterialTheme.typography.bodyLarge)
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "On Primary Container",
+                        color = colorScheme.onPrimaryContainer,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "On Primary",
+                        color = colorScheme.onPrimary,
+                    )
+                },
+            )
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "Primary Container",
+                        color = colorScheme.primaryContainer,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "Primary",
+                        color = colorScheme.primary,
+                    )
+                },
+            )
+            Spacer(modifier = Modifier.height(16.dp))
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "On Secondary Container",
+                        color = colorScheme.onSecondaryContainer,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "On Secondary",
+                        color = colorScheme.onSecondary,
+                    )
+                },
+            )
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "Secondary Container",
+                        color = colorScheme.secondaryContainer,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "Secondary",
+                        color = colorScheme.secondary,
+                    )
+                },
+            )
+            Spacer(modifier = Modifier.height(16.dp))
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "On Tertiary Container",
+                        color = colorScheme.onTertiaryContainer,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "On Tertiary",
+                        color = colorScheme.onTertiary,
+                    )
+                },
+            )
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "Tertiary Container",
+                        color = colorScheme.tertiaryContainer,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "Tertiary",
+                        color = colorScheme.tertiary,
+                    )
+                },
+            )
+            Spacer(modifier = Modifier.height(16.dp))
+            Text("Utility", style = MaterialTheme.typography.bodyLarge)
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "On Error",
+                        color = colorScheme.onError,
+                    )
+                },
+                rightTile = {
+                    ColorTile(
+                        text = "Outline",
+                        color = colorScheme.outline,
+                    )
+                }
+            )
+            DoubleTile(
+                leftTile = {
+                    ColorTile(
+                        text = "Error",
+                        color = colorScheme.error,
+                    )
+                },
+                rightTile = { Box(Modifier.fillMaxWidth()) },
+            )
+        }
+    }
+}
+
+@Composable
+private fun DoubleTile(leftTile: @Composable () -> Unit, rightTile: @Composable () -> Unit) {
+    Row(modifier = Modifier.fillMaxWidth()) {
+        Box(modifier = Modifier.weight(1f)) { leftTile() }
+        Box(modifier = Modifier.weight(1f)) { rightTile() }
+    }
+}
+
+@Composable
+private fun ColorTile(text: String, color: Color) {
+    var borderColor = Color.Transparent
+    if (color == Color.Black) {
+        borderColor = Color.White
+    } else if (color == Color.White) borderColor = Color.Black
+
+    Surface(
+        modifier = Modifier.height(48.dp).fillMaxWidth(),
+        color = color,
+        border = BorderStroke(1.dp, borderColor),
+    ) {
+        Text(
+            text,
+            Modifier.padding(4.dp),
+            style =
+            MaterialTheme.typography.bodyMedium.copy(
+                if (color.luminance() < .25) Color.White else Color.Black
+            )
+        )
+    }
+}
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.kt
index 55cc1905..e5de4b1 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.kt
@@ -125,6 +125,8 @@
         onSecondary = tonalPalette.secondary100,
         secondaryContainer = tonalPalette.secondary90,
         onSecondaryContainer = tonalPalette.secondary10,
+        tertiary = tonalPalette.tertiary40,
+        onTertiary = tonalPalette.tertiary100,
         tertiaryContainer = tonalPalette.tertiary90,
         onTertiaryContainer = tonalPalette.tertiary10,
         background = tonalPalette.neutral99,
@@ -161,6 +163,8 @@
         onSecondary = tonalPalette.secondary20,
         secondaryContainer = tonalPalette.secondary30,
         onSecondaryContainer = tonalPalette.secondary90,
+        tertiary = tonalPalette.tertiary80,
+        onTertiary = tonalPalette.tertiary20,
         tertiaryContainer = tonalPalette.tertiary30,
         onTertiaryContainer = tonalPalette.tertiary90,
         background = tonalPalette.neutral10,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
new file mode 100644
index 0000000..01c7215
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Card.kt
@@ -0,0 +1,466 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.material3
+
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.VectorConverter
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.interaction.DragInteraction
+import androidx.compose.foundation.interaction.FocusInteraction
+import androidx.compose.foundation.interaction.HoverInteraction
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.material3.tokens.ElevatedCardTokens
+import androidx.compose.material3.tokens.FilledCardTokens
+import androidx.compose.material3.tokens.OutlinedCardTokens
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.unit.Dp
+import kotlinx.coroutines.flow.collect
+
+/**
+ * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design filled card</a>.
+ *
+ * Cards contain content and actions about a single subject. Filled cards provide subtle separation
+ * from the background. This has less emphasis than elevated or outlined cards.
+ *
+ * This card will react to interactions when the given [interactionSource] is not null.
+ *
+ * Static card sample:
+ * @sample androidx.compose.material3.samples.CardSample
+ *
+ * Clickable card sample:
+ * @sample androidx.compose.material3.samples.ClickableCardSample
+ *
+ * @param modifier Modifier to be applied to the layout of the card.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Card. You can create and pass in your own remembered
+ * [MutableInteractionSource] to observe [Interaction]s that will customize the appearance
+ * / behavior of this card in different states. Cards with null interaction source will not react to
+ * interactions.
+ * @param shape Defines the card's shape.
+ * @param containerColor The container color of the card.
+ * @param contentColor The preferred content color provided by this card to its children.
+ * Defaults to either the matching content color for [containerColor], or if [containerColor]
+ * is not a color from the theme, this will keep the same value set above this card.
+ * @param border [BorderStroke] to draw on top of the card.
+ * @param elevation [CardElevation] used to resolve the elevation for this card when the
+ * [interactionSource] emits its states. The resolved values control the size of the shadow below
+ * the card, as well as its tonal elevation. When [containerColor] is [ColorScheme.surface], a
+ * higher tonal elevation value will result in a darker card color in light theme and lighter color
+ * in dark theme. See also [Surface].
+ */
+@ExperimentalMaterial3Api
+@Composable
+fun Card(
+    modifier: Modifier = Modifier,
+    interactionSource: InteractionSource? = null,
+    shape: Shape = FilledCardTokens.ContainerShape,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(FilledCardTokens.ContainerColor),
+    contentColor: Color = contentColorFor(containerColor),
+    border: BorderStroke? = null,
+    elevation: CardElevation = CardDefaults.cardElevation(),
+    content: @Composable ColumnScope.() -> Unit
+) {
+    val cardContent = @Composable { Column(content = content) }
+    Surface(
+        modifier = modifier,
+        interactionSource = interactionSource,
+        shape = shape,
+        color = containerColor,
+        contentColor = contentColor,
+        tonalElevation = elevation.tonalElevation(interactionSource).value,
+        shadowElevation = elevation.shadowElevation(interactionSource).value,
+        border = border,
+        content = cardContent
+    )
+}
+
+/**
+ * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design elevated card</a>.
+ *
+ * Elevated cards contain content and actions about a single subject. They have a drop shadow,
+ * providing more separation from the background than filled cards, but less than outlined cards.
+ *
+ * This card will react to interactions when the given [interactionSource] is not null.
+ *
+ * Static elevated card sample:
+ * @sample androidx.compose.material3.samples.ElevatedCardSample
+ *
+ * Clickable elevated card sample:
+ * @sample androidx.compose.material3.samples.ClickableElevatedCardSample
+ *
+ * @param modifier Modifier to be applied to the layout of the card.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Card. You can create and pass in your own remembered
+ * [MutableInteractionSource] to observe [Interaction]s that will customize the appearance
+ * / behavior of this card in different states. Cards with null interaction source will not react to
+ * interactions.
+ * @param shape Defines the card's shape.
+ * @param containerColor The container color of the card.
+ * @param contentColor The preferred content color provided by this card to its children.
+ * Defaults to either the matching content color for [containerColor], or if [containerColor]
+ * is not a color from the theme, this will keep the same value set above this card.
+ * @param elevation [CardElevation] used to resolve the elevation for this card when the
+ * [interactionSource] emits its states. The resolved values control the size of the shadow below
+ * the card, as well as its tonal elevation. When [containerColor] is [ColorScheme.surface], a
+ * higher tonal elevation value will result in a darker card color in light theme and lighter color
+ * in dark theme. See also [Surface].
+ */
+@ExperimentalMaterial3Api
+@Composable
+fun ElevatedCard(
+    modifier: Modifier = Modifier,
+    interactionSource: InteractionSource? = null,
+    shape: Shape = ElevatedCardTokens.ContainerShape,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(ElevatedCardTokens.ContainerColor),
+    contentColor: Color = contentColorFor(containerColor),
+    elevation: CardElevation = CardDefaults.elevatedCardElevation(),
+    content: @Composable ColumnScope.() -> Unit
+) = Card(
+    modifier = modifier,
+    interactionSource = interactionSource,
+    shape = shape,
+    containerColor = containerColor,
+    contentColor = contentColor,
+    border = null,
+    elevation = elevation,
+    content = content
+)
+
+/**
+ * <a href="https://m3.material.io/components/cards/overview" class="external" target="_blank">Material Design outlined card</a>.
+ *
+ * Outlined cards contain content and actions about a single subject. They have a visual boundary
+ * around the container. This can provide greater emphasis than the other types.
+ *
+ * This card will react to interactions when the given [interactionSource] is not null.
+ *
+ * Static outlined card sample:
+ * @sample androidx.compose.material3.samples.OutlinedCardSample
+ *
+ * Clickable outlined card sample:
+ * @sample androidx.compose.material3.samples.ClickableOutlinedCardSample
+ *
+ * @param modifier Modifier to be applied to the layout of the card.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Card. You can create and pass in your own remembered
+ * [MutableInteractionSource] to observe [Interaction]s that will customize the appearance
+ * / behavior of this card in different states. Cards with null interaction source will not react to
+ * interactions.
+ * @param shape Defines the card's shape.
+ * @param containerColor The container color of the card.
+ * @param contentColor The preferred content color provided by this card to its children.
+ * Defaults to either the matching content color for [containerColor], or if [containerColor]
+ * is not a color from the theme, this will keep the same value set above this card.
+ * @param border [BorderStroke] to draw on top of the card.
+ * @param elevation [CardElevation] used to resolve the elevation for this card when the
+ * [interactionSource] emits its states. The resolved values control the size of the shadow below
+ * the card, as well as its tonal elevation. When [containerColor] is [ColorScheme.surface], a
+ * higher tonal elevation value will result in a darker card color in light theme and lighter color
+ * in dark theme. See also [Surface].
+ */
+@ExperimentalMaterial3Api
+@Composable
+fun OutlinedCard(
+    modifier: Modifier = Modifier,
+    interactionSource: InteractionSource? = null,
+    shape: Shape = OutlinedCardTokens.ContainerShape,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(OutlinedCardTokens.ContainerColor),
+    contentColor: Color = contentColorFor(containerColor),
+    border: BorderStroke = BorderStroke(
+        OutlinedCardTokens.OutlineWidth,
+        MaterialTheme.colorScheme.fromToken(OutlinedCardTokens.OutlineColor)
+    ),
+    elevation: CardElevation = CardDefaults.outlinedCardElevation(),
+    content: @Composable ColumnScope.() -> Unit
+) = Card(
+    modifier = modifier,
+    interactionSource = interactionSource,
+    shape = shape,
+    containerColor = containerColor,
+    contentColor = contentColor,
+    border = border,
+    elevation = elevation,
+    content = content
+)
+
+/**
+ * Represents the elevation for a card in different states.
+ *
+ * - See [CardDefaults.cardElevation] for the default elevation used in a [Card].
+ * - See [CardDefaults.elevatedCardElevation] for the default elevation used in an [ElevatedCard].
+ * - See [CardDefaults.outlinedCardElevation] for the default elevation used in an [OutlinedCard].
+ */
+@Stable
+interface CardElevation {
+    /**
+     * Represents the tonal elevation used in a card, depending on its [interactionSource].
+     *
+     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
+     *
+     * For all Material cards with elevation, this returns the same value as [shadowElevation].
+     *
+     * - See [shadowElevation] for an elevation that draws a shadow around the card's bounds.
+     *
+     * @param interactionSource the [InteractionSource] for this card
+     */
+    @Composable
+    fun tonalElevation(interactionSource: InteractionSource?): State<Dp>
+
+    /**
+     * Represents the shadow elevation used in a button, depending on the [interactionSource].
+     *
+     * Shadow elevation is used to apply a drop shadow around the card to give it higher emphasis.
+     *
+     * For all Material cards with elevation, this returns the same value as [tonalElevation].
+     *
+     * - See [tonalElevation] for an elevation that applies a color shift to the surface.
+     *
+     * @param interactionSource the [InteractionSource] for this card
+     */
+    @Composable
+    fun shadowElevation(interactionSource: InteractionSource?): State<Dp>
+}
+
+/**
+ * Contains the default values used by all card types.
+ */
+object CardDefaults {
+
+    /**
+     * Creates a [CardElevation] that will animate between the provided values according to the
+     * Material specification for a [Card].
+     *
+     * @param defaultElevation the elevation used when the [Card] is has no other [Interaction]s.
+     * @param pressedElevation the elevation used when the [Card] is pressed.
+     * @param focusedElevation the elevation used when the [Card] is focused.
+     * @param hoveredElevation the elevation used when the [Card] is hovered.
+     * @param draggedElevation the elevation used when the [Card] is dragged.
+     */
+    @Composable
+    fun cardElevation(
+        defaultElevation: Dp = FilledCardTokens.ContainerElevation,
+        pressedElevation: Dp = FilledCardTokens.PressedContainerElevation,
+        focusedElevation: Dp = FilledCardTokens.FocusContainerElevation,
+        hoveredElevation: Dp = FilledCardTokens.HoverContainerElevation,
+        draggedElevation: Dp = FilledCardTokens.DraggedContainerElevation
+    ): CardElevation {
+        return remember(
+            defaultElevation,
+            pressedElevation,
+            focusedElevation,
+            hoveredElevation,
+            draggedElevation
+        ) {
+            DefaultCardElevation(
+                defaultElevation = defaultElevation,
+                pressedElevation = pressedElevation,
+                focusedElevation = focusedElevation,
+                hoveredElevation = hoveredElevation,
+                draggedElevation = draggedElevation,
+            )
+        }
+    }
+
+    /**
+     * Creates a [CardElevation] that will animate between the provided values according to the
+     * Material specification for an [ElevatedCard].
+     *
+     * @param defaultElevation the elevation used when the [ElevatedCard] is has no other
+     * [Interaction]s.
+     * @param pressedElevation the elevation used when the [ElevatedCard] is pressed.
+     * @param focusedElevation the elevation used when the [ElevatedCard] is focused.
+     * @param hoveredElevation the elevation used when the [ElevatedCard] is hovered.
+     * @param draggedElevation the elevation used when the [ElevatedCard] is dragged.
+     */
+    @Composable
+    fun elevatedCardElevation(
+        defaultElevation: Dp = ElevatedCardTokens.ContainerElevation,
+        pressedElevation: Dp = ElevatedCardTokens.PressedContainerElevation,
+        focusedElevation: Dp = ElevatedCardTokens.FocusContainerElevation,
+        hoveredElevation: Dp = ElevatedCardTokens.HoverContainerElevation,
+        draggedElevation: Dp = ElevatedCardTokens.DraggedContainerElevation
+    ): CardElevation {
+        return remember(
+            defaultElevation,
+            pressedElevation,
+            focusedElevation,
+            hoveredElevation,
+            draggedElevation
+        ) {
+            DefaultCardElevation(
+                defaultElevation = defaultElevation,
+                pressedElevation = pressedElevation,
+                focusedElevation = focusedElevation,
+                hoveredElevation = hoveredElevation,
+                draggedElevation = draggedElevation,
+            )
+        }
+    }
+
+    /**
+     * Creates a [CardElevation] that will animate between the provided values according to the
+     * Material specification for an [OutlinedCard].
+     *
+     * @param defaultElevation the elevation used when the [OutlinedCard] is has no other
+     * [Interaction]s.
+     * @param pressedElevation the elevation used when the [OutlinedCard] is pressed.
+     * @param focusedElevation the elevation used when the [OutlinedCard] is focused.
+     * @param hoveredElevation the elevation used when the [OutlinedCard] is hovered.
+     * @param draggedElevation the elevation used when the [OutlinedCard] is dragged.
+     */
+    @Composable
+    fun outlinedCardElevation(
+        defaultElevation: Dp = OutlinedCardTokens.ContainerElevation,
+        pressedElevation: Dp = defaultElevation,
+        focusedElevation: Dp = defaultElevation,
+        hoveredElevation: Dp = defaultElevation,
+        draggedElevation: Dp = OutlinedCardTokens.DraggedContainerElevation
+    ): CardElevation {
+        return remember(
+            defaultElevation,
+            pressedElevation,
+            focusedElevation,
+            hoveredElevation,
+            draggedElevation
+        ) {
+            DefaultCardElevation(
+                defaultElevation = defaultElevation,
+                pressedElevation = pressedElevation,
+                focusedElevation = focusedElevation,
+                hoveredElevation = hoveredElevation,
+                draggedElevation = draggedElevation,
+            )
+        }
+    }
+}
+
+/**
+ * Default [CardElevation] implementation.
+ *
+ * This default implementation supports animating the elevation for pressed, focused, hovered, and
+ * dragged interactions.
+ */
+@Immutable
+private class DefaultCardElevation(
+    private val defaultElevation: Dp,
+    private val pressedElevation: Dp,
+    private val focusedElevation: Dp,
+    private val hoveredElevation: Dp,
+    private val draggedElevation: Dp,
+) : CardElevation {
+    @Composable
+    override fun tonalElevation(interactionSource: InteractionSource?): State<Dp> {
+        if (interactionSource == null) {
+            return remember { mutableStateOf(defaultElevation) }
+        }
+        return animateElevation(interactionSource = interactionSource)
+    }
+
+    @Composable
+    override fun shadowElevation(interactionSource: InteractionSource?): State<Dp> {
+        if (interactionSource == null) {
+            return remember { mutableStateOf(defaultElevation) }
+        }
+        return animateElevation(interactionSource = interactionSource)
+    }
+
+    @Composable
+    private fun animateElevation(interactionSource: InteractionSource): State<Dp> {
+        val interactions = remember { mutableStateListOf<Interaction>() }
+        LaunchedEffect(interactionSource) {
+            interactionSource.interactions.collect { interaction ->
+                when (interaction) {
+                    is HoverInteraction.Enter -> {
+                        interactions.add(interaction)
+                    }
+                    is HoverInteraction.Exit -> {
+                        interactions.remove(interaction.enter)
+                    }
+                    is FocusInteraction.Focus -> {
+                        interactions.add(interaction)
+                    }
+                    is FocusInteraction.Unfocus -> {
+                        interactions.remove(interaction.focus)
+                    }
+                    is PressInteraction.Press -> {
+                        interactions.add(interaction)
+                    }
+                    is PressInteraction.Release -> {
+                        interactions.remove(interaction.press)
+                    }
+                    is PressInteraction.Cancel -> {
+                        interactions.remove(interaction.press)
+                    }
+                    is DragInteraction.Start -> {
+                        interactions.add(interaction)
+                    }
+                    is DragInteraction.Stop -> {
+                        interactions.remove(interaction.start)
+                    }
+                    is DragInteraction.Cancel -> {
+                        interactions.remove(interaction.start)
+                    }
+                }
+            }
+        }
+
+        val interaction = interactions.lastOrNull()
+
+        val target = when (interaction) {
+            is PressInteraction.Press -> pressedElevation
+            is HoverInteraction.Enter -> hoveredElevation
+            is FocusInteraction.Focus -> focusedElevation
+            is DragInteraction.Start -> draggedElevation
+            else -> defaultElevation
+        }
+
+        val animatable = remember { Animatable(target, Dp.VectorConverter) }
+
+        LaunchedEffect(target) {
+            val lastInteraction = when (animatable.targetValue) {
+                pressedElevation -> PressInteraction.Press(Offset.Zero)
+                hoveredElevation -> HoverInteraction.Enter()
+                focusedElevation -> FocusInteraction.Focus()
+                draggedElevation -> DragInteraction.Start()
+                else -> null
+            }
+            animatable.animateElevation(
+                from = lastInteraction,
+                to = interaction,
+                target = target
+            )
+        }
+
+        return animatable.asState()
+    }
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
index 88e74ef..5062093 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
@@ -22,10 +22,13 @@
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.clickable
+import androidx.compose.foundation.indication
 import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.InteractionSource
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
 import androidx.compose.foundation.layout.Box
+import androidx.compose.material.ripple.rememberRipple
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.NonRestartableComposable
@@ -51,9 +54,10 @@
  * elevation, which influences how that piece of surface visually relates to other surfaces and how
  * that surface is modified by tonal variance.
  *
- * If you want to have a [Surface] that handles clicks, consider using another overload.
+ * This Surface is a plain container that doesn't handle gestures / states. However, it accepts an
+ * [InteractionSource] parameter, which allows controlling its appearance in different states.
  *
- * The [Surface] is responsible for:
+ * The Surface is responsible for:
  *
  * 1) Clipping: Surface clips its children to the shape specified by [shape]
  *
@@ -82,7 +86,15 @@
  *
  * 5) Blocking touch propagation behind the surface.
  *
+ * Clickable surface sample:
+ * @sample androidx.compose.material3.samples.ClickableSurfaceSample
+ *
+ * Static surface sample:
+ * @sample androidx.compose.material3.samples.SurfaceSample
+ *
  * @param modifier Modifier to be applied to the layout corresponding to the surface
+ * @param interactionSource An InteractionSource that allows controlling the surface appearance
+ * in different states
  * @param shape Defines the surface's shape as well its shadow.
  * @param color The background color. Use [Color.Transparent] to have no color.
  * @param contentColor The preferred content color provided by this Surface to its children.
@@ -100,6 +112,7 @@
 @NonRestartableComposable
 fun Surface(
     modifier: Modifier = Modifier,
+    interactionSource: InteractionSource? = null,
     shape: Shape = RectangleShape,
     color: Color = MaterialTheme.colorScheme.surface,
     contentColor: Color = contentColorFor(color),
@@ -110,6 +123,7 @@
 ) {
     Surface(
         modifier = modifier,
+        interactionSource = interactionSource,
         shape = shape,
         color = color,
         contentColor = contentColor,
@@ -118,7 +132,7 @@
         border = border,
         content = content,
         clickAndSemanticsModifier =
-            Modifier.semantics(mergeDescendants = false) {}.pointerInput(Unit) {}
+        Modifier.semantics(mergeDescendants = false) {}.pointerInput(Unit) {}
     )
 }
 
@@ -211,6 +225,7 @@
 ) {
     Surface(
         modifier = modifier.minimumTouchTargetSize(),
+        interactionSource = null,
         shape = shape,
         color = color,
         contentColor = contentColor,
@@ -219,20 +234,21 @@
         border = border,
         content = content,
         clickAndSemanticsModifier =
-            Modifier.clickable(
-                interactionSource = interactionSource,
-                indication = indication,
-                enabled = enabled,
-                onClickLabel = onClickLabel,
-                role = role,
-                onClick = onClick
-            )
+        Modifier.clickable(
+            interactionSource = interactionSource,
+            indication = indication,
+            enabled = enabled,
+            onClickLabel = onClickLabel,
+            role = role,
+            onClick = onClick
+        )
     )
 }
 
 @Composable
 private fun Surface(
     modifier: Modifier,
+    interactionSource: InteractionSource?,
     shape: Shape,
     color: Color,
     contentColor: Color,
@@ -253,12 +269,18 @@
         LocalContentColor provides contentColor,
         LocalAbsoluteTonalElevation provides absoluteElevation
     ) {
+        val interactionModifier = if (interactionSource != null) {
+            Modifier.indication(interactionSource, rememberRipple())
+        } else {
+            Modifier
+        }
         Box(
             modifier
                 .shadow(shadowElevation, shape, clip = false)
                 .then(if (border != null) Modifier.border(border, shape) else Modifier)
                 .background(color = backgroundColor, shape = shape)
                 .clip(shape)
+                .then(interactionModifier)
                 .then(clickAndSemanticsModifier),
             propagateMinConstraints = true
         ) { content() }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedCardTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedCardTokens.kt
new file mode 100644
index 0000000..806f27d
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedCardTokens.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.ui.unit.dp
+
+internal object ElevatedCardTokens {
+    val ContainerColor = ColorSchemeKeyTokens.Surface
+    val ContainerElevation = ElevationTokens.Level1
+    val ContainerShape = ShapeTokens.Medium
+    val DraggedContainerElevation = ElevationTokens.Level4
+    val DraggedStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val FocusContainerElevation = ElevationTokens.Level1
+    val FocusStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val HoverContainerElevation = ElevationTokens.Level2
+    val HoverStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val IconColor = ColorSchemeKeyTokens.Primary
+    val IconSize = 24.0.dp
+    val PressedContainerElevation = ElevationTokens.Level1
+    val PressedStateLayerColor = ColorSchemeKeyTokens.OnSurface
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledCardTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledCardTokens.kt
new file mode 100644
index 0000000..a4d59b7
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledCardTokens.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.ui.unit.dp
+
+internal object FilledCardTokens {
+    val ContainerColor = ColorSchemeKeyTokens.SurfaceVariant
+    val ContainerElevation = ElevationTokens.Level0
+    val ContainerShape = ShapeTokens.Medium
+    val DraggedContainerElevation = ElevationTokens.Level3
+    val DraggedStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val FocusContainerElevation = ElevationTokens.Level0
+    val FocusStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val HoverContainerElevation = ElevationTokens.Level1
+    val HoverStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val IconColor = ColorSchemeKeyTokens.Primary
+    val IconSize = 24.0.dp
+    val PressedContainerElevation = ElevationTokens.Level0
+    val PressedStateLayerColor = ColorSchemeKeyTokens.OnSurface
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedCardTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedCardTokens.kt
new file mode 100644
index 0000000..217b545
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedCardTokens.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.ui.unit.dp
+
+internal object OutlinedCardTokens {
+    val ContainerColor = ColorSchemeKeyTokens.Surface
+    val ContainerElevation = ElevationTokens.Level0
+    val ContainerShape = ShapeTokens.Medium
+    val DraggedContainerElevation = ElevationTokens.Level3
+    val DraggedOutlineColor = ColorSchemeKeyTokens.Outline
+    val DraggedStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val FocusContainerElevation = ElevationTokens.Level0
+    val FocusOutlineColor = ColorSchemeKeyTokens.OnSurface
+    val FocusStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val HoverContainerElevation = ElevationTokens.Level1
+    val HoverOutlineColor = ColorSchemeKeyTokens.Outline
+    val HoverStateLayerColor = ColorSchemeKeyTokens.OnSurface
+    val IconColor = ColorSchemeKeyTokens.Primary
+    val IconSize = 24.0.dp
+    val OutlineColor = ColorSchemeKeyTokens.Outline
+    val OutlineWidth = 1.0.dp
+    val PressedContainerElevation = ElevationTokens.Level0
+    val PressedOutlineColor = ColorSchemeKeyTokens.Outline
+    val PressedStateLayerColor = ColorSchemeKeyTokens.OnSurface
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
index fc679b9..98a18e4 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
@@ -28,5 +28,5 @@
      * IMPORTANT: Whenever updating this value, please make sure to also update `versionTable` and
      * `minimumRuntimeVersionInt` in `VersionChecker.kt` of the compiler.
      */
-    const val version: Int = 6100
+    const val version: Int = 6200
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
index c985b20..77016cd 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
@@ -335,6 +335,14 @@
     private val observations = IdentityScopeMap<RecomposeScopeImpl>()
 
     /**
+     * A set of scopes that were invalidated conditionally (that is they were invalidated by a
+     * [derivedStateOf] object) by a call from [recordModificationsOf]. They need to be held in the
+     * [observations] map until invalidations are drained for composition as a later call to
+     * [recordModificationsOf] might later cause them to be unconditionally invalidated.
+     */
+    private val conditionallyInvalidatedScopes = HashSet<RecomposeScopeImpl>()
+
+    /**
      * A map of object read during derived states to the corresponding derived state.
      */
     private val derivedStates = IdentityScopeMap<DerivedState<*>>()
@@ -446,9 +454,11 @@
                 // Do nothing, just start composing.
             }
             PendingApplyNoModifications -> error("pending composition has not been applied")
-            is Set<*> -> addPendingInvalidationsLocked(toRecord as Set<Any>)
+            is Set<*> -> {
+                addPendingInvalidationsLocked(toRecord as Set<Any>, forgetConditionalScopes = true)
+            }
             is Array<*> -> for (changed in toRecord as Array<Set<Any>>) {
-                addPendingInvalidationsLocked(changed)
+                addPendingInvalidationsLocked(changed, forgetConditionalScopes = true)
             }
             else -> error("corrupt pendingModifications drain: $pendingModifications")
         }
@@ -460,9 +470,11 @@
             PendingApplyNoModifications -> {
                 // No work to do
             }
-            is Set<*> -> addPendingInvalidationsLocked(toRecord as Set<Any>)
+            is Set<*> -> {
+                addPendingInvalidationsLocked(toRecord as Set<Any>, forgetConditionalScopes = false)
+            }
             is Array<*> -> for (changed in toRecord as Array<Set<Any>>) {
-                addPendingInvalidationsLocked(changed)
+                addPendingInvalidationsLocked(changed, forgetConditionalScopes = false)
             }
             null -> error(
                 "calling recordModificationsOf and applyChanges concurrently is not supported"
@@ -546,7 +558,7 @@
 
     override fun prepareCompose(block: () -> Unit) = composer.prepareCompose(block)
 
-    private fun addPendingInvalidationsLocked(values: Set<Any>) {
+    private fun addPendingInvalidationsLocked(values: Set<Any>, forgetConditionalScopes: Boolean) {
         var invalidated: HashSet<RecomposeScopeImpl>? = null
 
         fun invalidate(value: Any) {
@@ -555,11 +567,15 @@
                     !observationsProcessed.remove(value, scope) &&
                     scope.invalidateForResult(value) != InvalidationResult.IGNORED
                 ) {
-                    val set = invalidated
-                        ?: HashSet<RecomposeScopeImpl>().also {
-                            invalidated = it
-                        }
-                    set.add(scope)
+                    if (scope.isConditional && !forgetConditionalScopes) {
+                        conditionallyInvalidatedScopes.add(scope)
+                    } else {
+                        val set = invalidated
+                            ?: HashSet<RecomposeScopeImpl>().also {
+                                invalidated = it
+                            }
+                        set.add(scope)
+                    }
                 }
             }
         }
@@ -574,8 +590,16 @@
                 }
             }
         }
-        invalidated?.let {
-            observations.removeValueIf { scope -> scope in it }
+
+        if (forgetConditionalScopes && conditionallyInvalidatedScopes.isNotEmpty()) {
+            observations.removeValueIf { scope ->
+                scope in conditionallyInvalidatedScopes || invalidated?.let { scope in it } == true
+            }
+            conditionallyInvalidatedScopes.clear()
+        } else {
+            invalidated?.let {
+                observations.removeValueIf { scope -> scope in it }
+            }
         }
     }
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
index fe36d27..d050ce0 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/RecomposeScopeImpl.kt
@@ -221,6 +221,12 @@
     }
 
     /**
+     * Returns true if the scope is observing derived state which might make this scope
+     * conditionally invalidated.
+     */
+    val isConditional: Boolean get() = trackedDependencies != null
+
+    /**
      * Determine if the scope should be considered invalid.
      *
      * @param instances The set of objects reported as invalidating this scope.
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt
index cc3b024..db77fc2 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionAndDerivedStateTests.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.runtime
 
+import androidx.compose.runtime.mock.Linear
 import androidx.compose.runtime.mock.Text
 import androidx.compose.runtime.mock.compositionTest
 import androidx.compose.runtime.mock.expectChanges
@@ -317,21 +318,57 @@
         advance()
         revalidate()
     }
+
+    @Test // Regression test for 215402574
+    fun observingBothNormalAndDerivedInSameScope() = compositionTest {
+        val a = mutableStateOf(0)
+        val b = derivedStateOf { a.value > 0 }
+        val c = mutableStateOf(false)
+
+        compose {
+            Linear {
+                if (b.value) Text("B is true")
+                if (c.value) Text("C is true")
+            }
+        }
+
+        validate {
+            Linear {
+                if (b.value) Text("B is true")
+                if (c.value) Text("C is true")
+            }
+        }
+
+        a.value++
+        expectChanges()
+        revalidate()
+
+        a.value++
+        advance()
+        revalidate()
+
+        a.value++
+        Snapshot.sendApplyNotifications()
+
+        c.value = true
+        advance()
+        revalidate()
+    }
 }
 
 @Composable
-fun DisplayItem(name: String, state: State<Int>) {
+private fun DisplayItem(name: String, state: State<Int>) {
     Text("$name = ${state.value}")
 }
 
 @Composable
-fun DisplayIndirect(name: String, state: State<Int>) {
+private fun DisplayIndirect(name: String, state: State<Int>) {
     DisplayItem(name, state)
 }
 
 @Composable
-fun Display(vararg names: Pair<String, State<Int>>) {
+private fun Display(vararg names: Pair<String, State<Int>>) {
     for ((name, state) in names) {
         DisplayIndirect(name, state)
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui-inspection/build.gradle b/compose/ui/ui-inspection/build.gradle
index 8ee77ac..42d1a84 100644
--- a/compose/ui/ui-inspection/build.gradle
+++ b/compose/ui/ui-inspection/build.gradle
@@ -80,7 +80,7 @@
     externalNativeBuild {
         cmake {
             path "src/main/cpp/CMakeLists.txt"
-            version "3.22.1"
+            version libs.versions.cmake.get()
         }
     }
 
diff --git a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
index df1c3a7..1987326 100644
--- a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
+++ b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
@@ -82,7 +82,7 @@
                 try {
                     base.evaluate()
                 } finally {
-                    runOnUiThread(scene::dispose)
+                    runOnUiThread(scene::close)
                 }
 
                 coroutineDispatcher.cleanupTestCoroutines()
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt
index d49277a..7480feb 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/TextActionsTest.kt
@@ -30,6 +30,7 @@
 import androidx.compose.ui.test.util.expectErrorMessageStartsWith
 import androidx.compose.ui.text.input.ImeAction
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
@@ -89,6 +90,7 @@
         }
     }
 
+    @FlakyTest(bugId = 215584831)
     @Test
     fun sendTextTwice_shouldAppend() {
         var lastSeenText = ""
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
index b6bbaf24..c7a8ef09 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
@@ -26,6 +26,7 @@
 import java.io.File
 import java.security.MessageDigest
 import org.jetbrains.skia.Data
+import org.jetbrains.skia.makeFromFile
 import org.jetbrains.skia.Typeface as SkTypeface
 
 internal val GenericFontFamiliesMapping by lazy {
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 8b3e7cd..ee01f33 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -1974,11 +1974,13 @@
   public final class SubcomposeLayoutKt {
     method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
     method @androidx.compose.runtime.Composable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
   }
 
   public final class SubcomposeLayoutState {
-    ctor public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
     ctor public SubcomposeLayoutState();
+    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
     method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
@@ -1990,6 +1992,11 @@
     method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
+  public interface SubcomposeSlotReusePolicy {
+    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
+    method public void getSlotsToRetain(java.util.Set<java.lang.Object> slotIds);
+  }
+
   public final class TestModifierUpdaterKt {
   }
 
@@ -2813,6 +2820,9 @@
 
 package androidx.compose.ui.text.input {
 
+  public final class CursorAnchorInfoBuilderKt {
+  }
+
   public final class InputState_androidKt {
   }
 
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index adcd0ba..ff1af02 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -2136,11 +2136,13 @@
   public final class SubcomposeLayoutKt {
     method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
     method @androidx.compose.runtime.Composable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
   }
 
   public final class SubcomposeLayoutState {
-    ctor public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
     ctor public SubcomposeLayoutState();
+    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
     method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
@@ -2152,6 +2154,11 @@
     method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
+  public interface SubcomposeSlotReusePolicy {
+    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
+    method public void getSlotsToRetain(java.util.Set<java.lang.Object> slotIds);
+  }
+
   public final class TestModifierUpdaterKt {
   }
 
@@ -3016,6 +3023,9 @@
 
 package androidx.compose.ui.text.input {
 
+  public final class CursorAnchorInfoBuilderKt {
+  }
+
   public final class InputState_androidKt {
   }
 
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index f1a809c..64c270d 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -1975,11 +1975,13 @@
   public final class SubcomposeLayoutKt {
     method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
     method @androidx.compose.runtime.Composable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
   }
 
   public final class SubcomposeLayoutState {
-    ctor public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
     ctor public SubcomposeLayoutState();
+    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
     method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
@@ -1991,6 +1993,11 @@
     method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
+  public interface SubcomposeSlotReusePolicy {
+    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
+    method public void getSlotsToRetain(java.util.Set<java.lang.Object> slotIds);
+  }
+
   public final class TestModifierUpdaterKt {
   }
 
@@ -2849,6 +2856,9 @@
 
 package androidx.compose.ui.text.input {
 
+  public final class CursorAnchorInfoBuilderKt {
+  }
+
   public final class InputState_androidKt {
   }
 
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index 1298ec8..d1fc117 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -177,6 +177,7 @@
                 implementation(libs.mockitoKotlin)
                 implementation(libs.robolectric)
                 implementation(project(":compose:ui:ui-test-junit4"))
+                implementation(project(":compose:ui:ui-test-font"))
                 implementation(project(":compose:test-utils"))
             }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/CursorAnchorInfoBuilderTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/CursorAnchorInfoBuilderTest.kt
new file mode 100644
index 0000000..8bad90c
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/CursorAnchorInfoBuilderTest.kt
@@ -0,0 +1,303 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.ui.input
+
+import android.graphics.Matrix
+import android.view.inputmethod.CursorAnchorInfo
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.MultiParagraph
+import androidx.compose.ui.text.TextRange
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.TextLayoutInput
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.font.test.R
+import androidx.compose.ui.text.font.toFontFamily
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.build
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.sp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import kotlin.math.ceil
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class CursorAnchorInfoBuilderTest {
+
+    private val fontFamilyMeasureFont = Font(
+        resId = R.font.sample_font,
+        weight = FontWeight.Normal,
+        style = FontStyle.Normal
+    ).toFontFamily()
+
+    private val context = InstrumentationRegistry.getInstrumentation().context
+    private val defaultDensity = Density(density = 1f)
+    private val matrix = Matrix()
+
+    @Test
+    fun testSelectionDefault() {
+        val textFieldValue = TextFieldValue()
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.selectionStart).isEqualTo(0)
+        assertThat(cursorAnchorInfo.selectionEnd).isEqualTo(0)
+    }
+
+    @Test
+    fun testSelectionCursor() {
+        val textFieldValue = TextFieldValue("abc", selection = TextRange(2))
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.selectionStart).isEqualTo(2)
+        assertThat(cursorAnchorInfo.selectionEnd).isEqualTo(2)
+    }
+
+    @Test
+    fun testSelectionRange() {
+        val textFieldValue = TextFieldValue("abc", selection = TextRange(1, 2))
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.selectionStart).isEqualTo(1)
+        assertThat(cursorAnchorInfo.selectionEnd).isEqualTo(2)
+    }
+
+    @Test
+    fun testCompositionNone() {
+        val textFieldValue = TextFieldValue(composition = null)
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(-1)
+        assertThat(cursorAnchorInfo.composingText).isNull()
+    }
+
+    @Test
+    fun testCompositionCoveringAllString() {
+        val text = "abc"
+        val textFieldValue = TextFieldValue(text, composition = TextRange(0, text.length))
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(0)
+        assertThat(cursorAnchorInfo.composingText.toString()).isEqualTo(text)
+    }
+
+    @Test
+    fun testCompositionCoveringPortionOfString() {
+        val word1 = "123 "
+        val word2 = "456"
+        val word3 = " 789"
+        val textFieldValue = TextFieldValue(
+            word1 + word2 + word3,
+            composition = TextRange(word1.length, (word1 + word2).length)
+        )
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(word1.length)
+        assertThat(cursorAnchorInfo.composingText.toString()).isEqualTo(word2)
+    }
+
+    @Test
+    fun testResetsBetweenExecutions() {
+        val text = "abc"
+        val textFieldValue = TextFieldValue(text, composition = TextRange(0, text.length))
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.composingText.toString()).isEqualTo(text)
+        assertThat(cursorAnchorInfo.composingTextStart).isEqualTo(textFieldValue.composition!!.min)
+
+        val cursorAnchorInfo1 = builder.build(
+            TextFieldValue("abcd"),
+            getTextLayoutResult(textFieldValue.text),
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo1.composingText).isNull()
+        assertThat(cursorAnchorInfo1.composingTextStart).isEqualTo(-1)
+    }
+
+    @Test
+    fun testInsertionMarkerCursor() {
+        val fontSize = 10.sp
+        val textFieldValue = TextFieldValue("abc", selection = TextRange(1))
+        val textLayoutResult = getTextLayoutResult(textFieldValue.text, fontSize = fontSize)
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            textLayoutResult,
+            matrix
+        )
+
+        val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
+        assertThat(cursorAnchorInfo.insertionMarkerHorizontal).isEqualTo(fontSizeInPx)
+        assertThat(cursorAnchorInfo.insertionMarkerTop).isEqualTo(0f)
+        assertThat(cursorAnchorInfo.insertionMarkerBottom).isEqualTo(fontSizeInPx)
+        assertThat(cursorAnchorInfo.insertionMarkerBaseline).isEqualTo(fontSizeInPx)
+        assertThat(cursorAnchorInfo.insertionMarkerFlags).isEqualTo(0)
+    }
+
+    @Test
+    fun testInsertionMarkerSelectionIsSameWithCursor() {
+        val textFieldValue = TextFieldValue(
+            "abc",
+            selection = TextRange(1, 2)
+        )
+        val textLayoutResult = getTextLayoutResult(textFieldValue.text)
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo1 = builder.build(
+            textFieldValue,
+            textLayoutResult,
+            matrix
+        )
+
+        val cursorAnchorInfo2 = builder.build(
+            textFieldValue.copy(selection = TextRange(1)),
+            textLayoutResult,
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo1.insertionMarkerHorizontal).isEqualTo(
+            cursorAnchorInfo2.insertionMarkerHorizontal
+        )
+        assertThat(cursorAnchorInfo1.insertionMarkerTop).isEqualTo(
+            cursorAnchorInfo2.insertionMarkerTop
+        )
+        assertThat(cursorAnchorInfo1.insertionMarkerBottom).isEqualTo(
+            cursorAnchorInfo2.insertionMarkerBottom
+        )
+        assertThat(cursorAnchorInfo1.insertionMarkerBaseline).isEqualTo(
+            cursorAnchorInfo2.insertionMarkerBottom
+        )
+    }
+
+    @Test
+    fun testInsertionMarkerRtl() {
+        val fontSize = 10.sp
+        val fontSizeInPx = with(defaultDensity) { fontSize.toPx() }
+
+        val textFieldValue = TextFieldValue("\u05D0\u05D1\u05D2", selection = TextRange(0))
+        val width = 3 * fontSizeInPx
+        val textLayoutResult = getTextLayoutResult(
+            textFieldValue.text,
+            fontSize = fontSize,
+            width = width
+        )
+        val builder = CursorAnchorInfo.Builder()
+
+        val cursorAnchorInfo = builder.build(
+            textFieldValue,
+            textLayoutResult,
+            matrix
+        )
+
+        assertThat(cursorAnchorInfo.insertionMarkerHorizontal).isEqualTo(width)
+        assertThat(cursorAnchorInfo.insertionMarkerTop).isEqualTo(0f)
+        assertThat(cursorAnchorInfo.insertionMarkerBottom).isEqualTo(fontSizeInPx)
+        assertThat(cursorAnchorInfo.insertionMarkerBaseline).isEqualTo(fontSizeInPx)
+        assertThat(cursorAnchorInfo.insertionMarkerFlags).isEqualTo(CursorAnchorInfo.FLAG_IS_RTL)
+    }
+
+    private fun getTextLayoutResult(
+        text: String,
+        fontSize: TextUnit = 12.sp,
+        width: Float = Float.MAX_VALUE
+    ): TextLayoutResult {
+        val intWidth = ceil(width).toInt()
+
+        val input = TextLayoutInput(
+            text = AnnotatedString(text),
+            style = TextStyle(
+                fontFamily = fontFamilyMeasureFont,
+                fontSize = fontSize
+            ),
+            placeholders = listOf(),
+            maxLines = Int.MAX_VALUE,
+            softWrap = true,
+            overflow = TextOverflow.Visible,
+            density = defaultDensity,
+            layoutDirection = LayoutDirection.Ltr,
+            resourceLoader = TestFontResourceLoader(context),
+            constraints = Constraints(maxWidth = intWidth)
+        )
+
+        val paragraph = MultiParagraph(
+            annotatedString = input.text,
+            style = input.style,
+            width = width,
+            density = input.density,
+            resourceLoader = input.resourceLoader
+        )
+
+        return TextLayoutResult(
+            input, paragraph, IntSize(intWidth, ceil(paragraph.height).toInt())
+        )
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TestFontResourceLoader.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TestFontResourceLoader.kt
new file mode 100644
index 0000000..4f8f56b
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/TestFontResourceLoader.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.ui.input
+
+import android.content.Context
+import android.graphics.Typeface
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.ResourceFont
+import androidx.core.content.res.ResourcesCompat
+
+class TestFontResourceLoader(val context: Context) : Font.ResourceLoader {
+    override fun load(font: Font): Typeface {
+        return when (font) {
+            is ResourceFont -> ResourcesCompat.getFont(context, font.resId)!!
+            else -> throw IllegalArgumentException("Unknown font type: ${font.javaClass.name}")
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
index 481a8af..e1a7e76 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
@@ -45,7 +45,6 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.graphics.asAndroidBitmap
-import androidx.compose.ui.layout.RootMeasurePolicy.measure
 import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
 import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.LocalDensity
@@ -841,7 +840,7 @@
     @Test
     fun slotsKeptForReuse() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
-        val state = SubcomposeLayoutState(2)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(2))
 
         composeItems(state, items)
 
@@ -850,44 +849,44 @@
         }
 
         assertNodes(
-            exists = /*active*/ listOf(2, 3) + /*reusable*/ listOf(1, 4),
-            doesNotExist = /*disposed*/ listOf(0)
+            exists = /*active*/ listOf(2, 3) + /*reusable*/ listOf(0, 1),
+            doesNotExist = /*disposed*/ listOf(4)
         )
     }
 
     @Test
     fun newSlotIsUsingReusedSlot() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
-        val state = SubcomposeLayoutState(2)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(2))
 
         composeItems(state, items)
 
         rule.runOnIdle {
             items.value = listOf(2, 3)
-            // 1 and 4 are now in reusable buffer
+            // 0 and 1 are now in reusable buffer
         }
 
         rule.runOnIdle {
             items.value = listOf(2, 3, 5)
-            // the last reusable slot (4) will be used for composing 5
+            // the last reusable slot (1) will be used for composing 5
         }
 
         assertNodes(
-            exists = /*active*/ listOf(2, 3, 5) + /*reusable*/ listOf(1),
-            doesNotExist = /*disposed*/ listOf(0, 4)
+            exists = /*active*/ listOf(2, 3, 5) + /*reusable*/ listOf(0),
+            doesNotExist = /*disposed*/ listOf(1, 4)
         )
     }
 
     @Test
     fun theSameSlotIsUsedWhileItIsInReusableList() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
-        val state = SubcomposeLayoutState(2)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(2))
 
         composeItems(state, items)
 
         rule.runOnIdle {
             items.value = listOf(2, 3)
-            // 1 and 4 are now in reusable buffer
+            // 0 and 1 are now in reusable buffer
         }
 
         rule.runOnIdle {
@@ -896,44 +895,44 @@
         }
 
         assertNodes(
-            exists = /*active*/ listOf(2, 3, 1) + /*reusable*/ listOf(4)
+            exists = /*active*/ listOf(2, 3, 1) + /*reusable*/ listOf(0)
         )
     }
 
     @Test
     fun prefetchIsUsingReusableNodes() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
-        val state = SubcomposeLayoutState(2)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(2))
 
         composeItems(state, items)
 
         rule.runOnIdle {
             items.value = listOf(2, 3)
-            // 1 and 4 are now in reusable buffer
+            // 0 and 1 are now in reusable buffer
         }
 
         rule.runOnIdle {
             state.precompose(5) {
                 ItemContent(5)
             }
-            // prefetch should take slot 4 from reuse
+            // prefetch should take slot 1 from reuse
         }
 
         assertNodes(
-            exists = /*active*/ listOf(2, 3) + /*prefetch*/ listOf(5) + /*reusable*/ listOf(1)
+            exists = /*active*/ listOf(2, 3) + /*prefetch*/ listOf(5) + /*reusable*/ listOf(0)
         )
     }
 
     @Test
     fun prefetchSlotWhichIsInReusableList() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
-        val state = SubcomposeLayoutState(3)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(3))
 
         composeItems(state, items)
 
         rule.runOnIdle {
             items.value = listOf(2)
-            // 1, 3 and 4 are now in reusable buffer
+            // 0, 1, 3 are now in reusable buffer
         }
 
         rule.runOnIdle {
@@ -944,15 +943,15 @@
         }
 
         assertNodes(
-            exists = /*active*/ listOf(2) + /*prefetch*/ listOf(3) + /*reusable*/ listOf(1, 4),
-            doesNotExist = listOf(0)
+            exists = /*active*/ listOf(2) + /*prefetch*/ listOf(3) + /*reusable*/ listOf(0, 1),
+            doesNotExist = listOf(4)
         )
     }
 
     @Test
     fun nothingIsReusedWhenMaxSlotsAre0() {
         val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
-        val state = SubcomposeLayoutState(0)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(0))
 
         composeItems(state, items)
 
@@ -969,7 +968,7 @@
     @Test
     fun reuse1Node() {
         val items = mutableStateOf(listOf(0, 1, 2, 3))
-        val state = SubcomposeLayoutState(1)
+        val state = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
 
         composeItems(state, items)
 
@@ -978,8 +977,8 @@
         }
 
         assertNodes(
-            exists = /*active*/ listOf(0, 1) + /*reusable*/ listOf(3),
-            doesNotExist = /*disposed*/ listOf(2)
+            exists = /*active*/ listOf(0, 1) + /*reusable*/ listOf(2),
+            doesNotExist = /*disposed*/ listOf(3)
         )
     }
 
@@ -991,7 +990,7 @@
         var lastRememberedComposedModifierSlot: Any? = null
 
         rule.setContent {
-            SubcomposeLayout(remember { SubcomposeLayoutState(1) }) { _ ->
+            SubcomposeLayout(remember { SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)) }) {
                 val slot = slotState.value
                 subcompose(slot) {
                     ReusableContent(slot) {
@@ -1261,7 +1260,7 @@
             remeasuresCount++
             layout(10, 10) {}
         }
-        val layoutState = mutableStateOf(SubcomposeLayoutState(1))
+        val layoutState = mutableStateOf(SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)))
 
         rule.setContent {
             val slot = slotState.value
@@ -1286,7 +1285,7 @@
             assertThat(remeasuresCount).isEqualTo(2)
             remeasuresCount = 0
             slotState.value = 2 // slot 0 should be reused
-            layoutState.value = SubcomposeLayoutState(1)
+            layoutState.value = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
         }
 
         rule.runOnIdle {
@@ -1303,7 +1302,7 @@
             remeasuresCount++
             layout(10, 10) {}
         }
-        val layoutState = mutableStateOf(SubcomposeLayoutState(1))
+        val layoutState = mutableStateOf(SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)))
 
         rule.setContent {
             val slot = slotState.value
@@ -1323,7 +1322,7 @@
             assertThat(remeasuresCount).isEqualTo(1)
             remeasuresCount = 0
             slotState.value = 1 // slot 0 should be reused
-            layoutState.value = SubcomposeLayoutState(1)
+            layoutState.value = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
         }
 
         rule.runOnIdle {
@@ -1334,7 +1333,7 @@
 
     @Test
     fun reusableNodeIsKeptAsReusableAfterStateUpdate() {
-        val layoutState = mutableStateOf(SubcomposeLayoutState(1))
+        val layoutState = mutableStateOf(SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)))
         val needChild = mutableStateOf(true)
         var disposed = false
 
@@ -1358,7 +1357,7 @@
         rule.runOnIdle {
             // the composition is still active in the reusable pool
             assertThat(disposed).isFalse()
-            layoutState.value = SubcomposeLayoutState(1)
+            layoutState.value = SubcomposeLayoutState(SubcomposeSlotReusePolicy(1))
         }
 
         rule.runOnIdle { needChild.value = false }
@@ -1366,7 +1365,7 @@
 
     @Test
     fun passingSmallerMaxSlotsToRetainForReuse() {
-        val layoutState = mutableStateOf(SubcomposeLayoutState(1))
+        val layoutState = mutableStateOf(SubcomposeLayoutState(SubcomposeSlotReusePolicy(1)))
         val needChild = mutableStateOf(true)
         var disposed = false
 
@@ -1390,7 +1389,7 @@
         rule.runOnIdle {
             // the composition is still active in the reusable pool
             assertThat(disposed).isFalse()
-            layoutState.value = SubcomposeLayoutState(0)
+            layoutState.value = SubcomposeLayoutState(SubcomposeSlotReusePolicy(0))
         }
 
         rule.runOnIdle {
@@ -1399,6 +1398,189 @@
         }
     }
 
+    @Test
+    fun customPolicy_retainingExactItem() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        val policy = object : SubcomposeSlotReusePolicy {
+            override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {
+                assertThat(slotIds).containsExactly(1, 2, 4).inOrder()
+                slotIds.remove(1)
+                slotIds.remove(4)
+            }
+
+            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                assertThat(reusableSlotId).isEqualTo(2)
+                return true
+            }
+        }
+        val state = SubcomposeLayoutState(policy)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf(0, 3)
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(0, 3) + /*reusable*/ listOf(2),
+            doesNotExist = /*disposed*/ listOf(1, 4)
+        )
+
+        rule.runOnIdle {
+            items.value = listOf(0, 3, 5)
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(0, 3, 5) + /*reusable*/ emptyList(),
+            doesNotExist = /*disposed*/ listOf(1, 2, 4)
+        )
+    }
+
+    @Test
+    fun customPolicy_lastUsedItemsAreFirstInSet() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        var expectedReusable = arrayOf<Int>()
+        val policy = object : SubcomposeSlotReusePolicy {
+            override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {
+                assertThat(slotIds).containsExactly(*expectedReusable).inOrder()
+            }
+
+            override fun areCompatible(slotId: Any?, reusableSlotId: Any?) = true
+        }
+        val state = SubcomposeLayoutState(policy)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            expectedReusable = arrayOf(1, 2, 3, 4)
+            items.value = listOf(0)
+        }
+
+        rule.runOnIdle {
+            expectedReusable = arrayOf(1, 2, 3)
+            items.value = listOf(0, 4)
+        }
+
+        rule.runOnIdle {
+            expectedReusable = arrayOf(4, 1, 2, 3)
+            items.value = listOf(0)
+        }
+    }
+
+    @Test
+    fun customPolicy_disposedPrefetchedItemIsFirstInSet() {
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4))
+        var expectedReusable = arrayOf<Int>()
+        var callbackCalled = false
+        var expectedSlotId: Any? = null
+        var expectedreusableSlotId: Any? = null
+        val policy = object : SubcomposeSlotReusePolicy {
+            override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {
+                callbackCalled = true
+                assertThat(slotIds).containsExactly(*expectedReusable).inOrder()
+            }
+
+            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                assertThat(slotId).isEqualTo(expectedSlotId)
+                assertThat(reusableSlotId).isEqualTo(expectedreusableSlotId)
+                return true
+            }
+        }
+        val state = SubcomposeLayoutState(policy)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            expectedReusable = arrayOf(1, 2, 3, 4)
+            items.value = listOf(0)
+        }
+
+        rule.runOnIdle {
+            assertThat(callbackCalled).isTrue()
+            callbackCalled = false
+
+            expectedSlotId = 5
+            expectedreusableSlotId = 4
+            val handle = state.precompose(5, {}) // it should reuse slot 4
+            expectedReusable = arrayOf(5, 1, 2, 3)
+            handle.dispose()
+            assertThat(callbackCalled).isTrue()
+        }
+    }
+
+    @Test
+    fun customPolicy_retainingOddNumbers() {
+        fun isOdd(number: Any?): Boolean {
+            return (number as Int) % 2 == 1
+        }
+        val items = mutableStateOf(listOf(0, 1, 2, 3, 4, 5, 6))
+        val policy = object : SubcomposeSlotReusePolicy {
+            override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {
+                slotIds.removeAll { !isOdd(it) }
+            }
+
+            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                return isOdd(slotId) && isOdd(reusableSlotId)
+            }
+        }
+        val state = SubcomposeLayoutState(policy)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf()
+        }
+
+        assertNodes(
+            exists = /*active*/ emptyList<Int>() + /*reusable*/ listOf(1, 3, 5),
+            doesNotExist = /*disposed*/ listOf(0, 2, 4, 6)
+        )
+
+        rule.runOnIdle {
+            items.value = listOf(8, 9, 10)
+            // new slots composed for 8 and 10
+            // 5 is reused for 9
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(8, 9, 10) + /*reusable*/ listOf(1, 3),
+            doesNotExist = /*disposed*/ listOf(5)
+        )
+    }
+
+    @Test
+    fun customPolicy_reusingSecondSlotFromTheEnd() {
+        fun isOdd(number: Any?): Boolean {
+            return (number as Int) % 2 == 1
+        }
+        val items = mutableStateOf(listOf(0, 1, 2, 3))
+        val policy = object : SubcomposeSlotReusePolicy {
+            override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {}
+
+            override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean {
+                return isOdd(slotId) == isOdd(reusableSlotId)
+            }
+        }
+        val state = SubcomposeLayoutState(policy)
+
+        composeItems(state, items)
+
+        rule.runOnIdle {
+            items.value = listOf()
+        }
+
+        assertNodes(exists = /*active*/ emptyList<Int>() + /*reusable*/ listOf(0, 1, 2, 3))
+
+        rule.runOnIdle {
+            items.value = listOf(10) // slot 2 should be reused
+        }
+
+        assertNodes(
+            exists = /*active*/ listOf(10) + /*reusable*/ listOf(0, 1, 3),
+            doesNotExist = /*disposed*/ listOf(2)
+        )
+    }
+
     private fun composeItems(
         state: SubcomposeLayoutState,
         items: MutableState<List<Int>>
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt
index 46dbe8b..3a2c291 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/LocalSoftwareKeyboardControllerTest.kt
@@ -19,7 +19,6 @@
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.text.BasicText
-import androidx.compose.foundation.text.BasicTextField
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.SideEffect
@@ -32,7 +31,6 @@
 import androidx.compose.ui.text.input.TextInputService
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
-import com.nhaarman.mockitokotlin2.inOrder
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.never
 import com.nhaarman.mockitokotlin2.times
@@ -103,34 +101,6 @@
     }
 
     @Test
-    fun localSoftwareKeybardController_whenFocused_delegatesToPlatformService() {
-        val platformTextInputService = mock<PlatformTextInputService>()
-        val textInputService = TextInputService(platformTextInputService)
-        var controller: SoftwareKeyboardController? = null
-
-        rule.setContent {
-            CompositionLocalProvider(
-                LocalTextInputService provides textInputService
-            ) {
-                controller = LocalSoftwareKeyboardController.current
-                BasicTextField("string", {})
-            }
-        }
-
-        rule.onNodeWithText("string").performClick()
-
-        rule.runOnIdle {
-            controller?.hide()
-            controller?.show()
-            inOrder(platformTextInputService) {
-                verify(platformTextInputService).showSoftwareKeyboard() // focus
-                verify(platformTextInputService).hideSoftwareKeyboard() // explicit call
-                verify(platformTextInputService).showSoftwareKeyboard() // explicit call
-            }
-        }
-    }
-
-    @Test
     fun showHideSoftKeyboard_dontCrash_beforeSession() {
         var keyboardController: SoftwareKeyboardController? = null
         rule.setContent {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index fe2a378..affb903 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
@@ -936,7 +936,7 @@
      * runs the latest command.
      */
     suspend fun keyboardVisibilityEventLoop() {
-        textInputServiceAndroid.keyboardVisibilityEventLoop()
+        textInputServiceAndroid.textInputCommandEventLoop()
     }
 
     /**
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoBuilder.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoBuilder.kt
new file mode 100644
index 0000000..3855cc3
--- /dev/null
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/CursorAnchorInfoBuilder.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.ui.text.input
+
+import android.graphics.Matrix
+import android.view.inputmethod.CursorAnchorInfo
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.style.ResolvedTextDirection
+
+/**
+ * Helper function to build [CursorAnchorInfo](https://developer.android.com/reference/android/view/inputmethod/CursorAnchorInfo).
+ *
+ * @param textFieldValue required to set text, composition and selection information into the
+ * CursorAnchorInfo.
+ * @param textLayoutResult TextLayoutResult for the [textFieldValue] used to enter cursor and
+ * character information
+ * @param matrix Matrix used to convert local coordinates to global coordinates.
+ */
+internal fun CursorAnchorInfo.Builder.build(
+    textFieldValue: TextFieldValue,
+    textLayoutResult: TextLayoutResult,
+    matrix: Matrix
+): CursorAnchorInfo {
+    reset()
+
+    setMatrix(matrix)
+
+    val selectionStart = textFieldValue.selection.min
+    val selectionEnd = textFieldValue.selection.max
+    setSelectionRange(selectionStart, selectionEnd)
+
+    setInsertionMarker(selectionStart, textLayoutResult)
+
+    // set composition
+    val compositionStart = textFieldValue.composition?.min ?: -1
+    val compositionEnd = textFieldValue.composition?.max ?: -1
+
+    if (compositionStart in 0 until compositionEnd) {
+        setComposingText(
+            compositionStart,
+            textFieldValue.text.subSequence(compositionStart, compositionEnd)
+        )
+    }
+
+    return build()
+}
+
+private fun CursorAnchorInfo.Builder.setInsertionMarker(
+    selectionStart: Int,
+    textLayoutResult: TextLayoutResult
+): CursorAnchorInfo.Builder {
+    if (selectionStart < 0) return this
+
+    val cursorRect = textLayoutResult.getCursorRect(selectionStart)
+    val isRtl = textLayoutResult.getBidiRunDirection(selectionStart) == ResolvedTextDirection.Rtl
+
+    var flags = 0
+    if (isRtl) flags = flags or CursorAnchorInfo.FLAG_IS_RTL
+
+    // Sets the location of the text insertion point (zero width cursor) as a rectangle in local
+    // coordinates.
+    setInsertionMarkerLocation(
+        cursorRect.left,
+        cursorRect.top,
+        cursorRect.bottom,
+        cursorRect.bottom,
+        flags
+    )
+
+    return this
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
index c837616..da91076a 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroid.android.kt
@@ -26,9 +26,13 @@
 import android.view.inputmethod.InputConnection
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.text.TextRange
+import androidx.compose.ui.text.input.TextInputServiceAndroid.TextInputCommand.HideKeyboard
+import androidx.compose.ui.text.input.TextInputServiceAndroid.TextInputCommand.ShowKeyboard
+import androidx.compose.ui.text.input.TextInputServiceAndroid.TextInputCommand.StartInput
+import androidx.compose.ui.text.input.TextInputServiceAndroid.TextInputCommand.StopInput
 import androidx.core.view.inputmethod.EditorInfoCompat
-import kotlinx.coroutines.channels.Channel
 import kotlin.math.roundToInt
+import kotlinx.coroutines.channels.Channel
 
 private const val DEBUG_CLASS = "TextInputServiceAndroid"
 
@@ -39,7 +43,22 @@
     val view: View,
     private val inputMethodManager: InputMethodManager
 ) : PlatformTextInputService {
-    /** True if the currently editable composable has connected */
+
+    /**
+     * Commands that can be sent into [textInputCommandChannel] to be processed by
+     * [textInputCommandEventLoop].
+     */
+    private enum class TextInputCommand {
+        StartInput,
+        StopInput,
+        ShowKeyboard,
+        HideKeyboard;
+    }
+
+    /**
+     * True if the currently editable composable has connected. This is used to tell the platform
+     * when it asks if the compose view is a text editor.
+     */
     private var editorHasFocus = false
 
     /**
@@ -62,10 +81,12 @@
     private var focusedRect: android.graphics.Rect? = null
 
     /**
-     * A channel that is used to send ShowKeyboard/HideKeyboard commands. Send 'true' for
-     * show Keyboard and 'false' to hide keyboard.
+     * A channel that is used to debounce rapid operations such as showing/hiding the keyboard and
+     * starting/stopping input, so we can make the minimal number of calls on the
+     * [inputMethodManager]. The [TextInputCommand]s sent to this channel are processed by
+     * [textInputCommandEventLoop].
      */
-    private val showKeyboardChannel = Channel<Boolean>(Channel.CONFLATED)
+    private val textInputCommandChannel = Channel<TextInputCommand>(Channel.UNLIMITED)
 
     private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
         // focusedRect is null if there is not ongoing text input session. So safe to request
@@ -136,7 +157,9 @@
         onEditCommand: (List<EditCommand>) -> Unit,
         onImeActionPerformed: (ImeAction) -> Unit
     ) {
-        if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.startInput") }
+        if (DEBUG) {
+            Log.d(TAG, "$DEBUG_CLASS.startInput")
+        }
 
         editorHasFocus = true
         state = value
@@ -144,53 +167,141 @@
         this.onEditCommand = onEditCommand
         this.onImeActionPerformed = onImeActionPerformed
 
-        view.post {
-            restartInput()
-            showSoftwareKeyboard()
-        }
+        // Don't actually send the command to the IME yet, it may be overruled by a subsequent call
+        // to stopInput.
+        textInputCommandChannel.trySend(StartInput)
     }
 
     override fun stopInput() {
-        if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.stopInput") }
+        if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.stopInput")
 
         editorHasFocus = false
         onEditCommand = {}
         onImeActionPerformed = {}
         focusedRect = null
 
-        restartInput()
-        editorHasFocus = false
-    }
-
-    private fun restartInput() {
-        if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.restartInput")
-        inputMethodManager.restartInput(view)
+        // Don't actually send the command to the IME yet, it may be overruled by a subsequent call
+        // to startInput.
+        textInputCommandChannel.trySend(StopInput)
     }
 
     override fun showSoftwareKeyboard() {
-        if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.showSoftwareKeyboard") }
-        showKeyboardChannel.trySend(true)
+        if (DEBUG) {
+            Log.d(TAG, "$DEBUG_CLASS.showSoftwareKeyboard")
+        }
+        textInputCommandChannel.trySend(ShowKeyboard)
     }
 
     override fun hideSoftwareKeyboard() {
-        if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.hideSoftwareKeyboard") }
-        showKeyboardChannel.trySend(false)
+        if (DEBUG) {
+            Log.d(TAG, "$DEBUG_CLASS.hideSoftwareKeyboard")
+        }
+        textInputCommandChannel.trySend(HideKeyboard)
     }
 
-    suspend fun keyboardVisibilityEventLoop() {
+    /**
+     * Processes commands from the [textInputCommandChannel] to make the appropriate calls on the
+     * [inputMethodManager].
+     */
+    suspend fun textInputCommandEventLoop() {
         // TODO(b/180071033): Allow for more IMPLICIT flag to be passed.
-        for (showKeyboard in showKeyboardChannel) {
-            // Even though we are using a conflated channel, and the producers and consumers are
-            // on the same thread, there is a possibility that we have a stale value in the channel
-            // because we start consuming from it before we finish producing all the values. We poll
-            // to make sure that we use the most recent value.
-            if (showKeyboardChannel.tryReceive().getOrNull() ?: showKeyboard) {
-                if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.keyboardVisibilityEventLoop.showSoftInput") }
-                inputMethodManager.showSoftInput(view)
-            } else {
-                if (DEBUG) { Log.d(TAG, "$DEBUG_CLASS.keyboardVisibilityEventLoop.hideSoftInput") }
-                inputMethodManager.hideSoftInputFromWindow(view.windowToken)
+        for (initialCommand in textInputCommandChannel) {
+            // When focus changes to a non-Compose view, the system will take care of managing the
+            // keyboard (via ImeFocusController) so we don't need to do anything. This can happen
+            // when a Compose text field is focused, then the user taps on an EditText view.
+            // And any commands that come in while we're not focused should also just be ignored,
+            // since no unfocused view should be messing with the keyboard.
+            // TODO(b/215761849) When focus moves to a different ComposeView than this one, this
+            //  logic doesn't work and the keyboard is not hidden.
+            if (!view.isFocused) {
+                // All queued commands should be ignored, so drain them out of the channel to avoid
+                // waking up this coroutine again immediately.
+                do {
+                    val command = textInputCommandChannel.tryReceive()
+                } while (command.isSuccess)
+                continue
             }
+
+            // Multiple commands may have been queued up in the channel while this function was
+            // waiting to be resumed. We don't execute the commands as they come in because making a
+            // bunch of calls to change the actual IME quickly can result in flickers. Instead, we
+            // manually coalesce the commands to figure out the minimum number of IME operations we
+            // need to get to the desired final state.
+            // The queued commands effectively operate on a simple state machine consisting of two
+            // flags:
+            //   1. Whether to start a new input connection (true), tear down the input connection
+            //      (false), or leave the current connection as-is (null).
+            var startInput: Boolean? = null
+            //   2. Whether to show the keyboard (true), hide the keyboard (false), or leave the
+            //      keyboard visibility as-is (null).
+            var showKeyboard: Boolean? = null
+
+            // And a function that performs the appropriate state transition given a command.
+            fun TextInputCommand.applyToState() {
+                when (this) {
+                    StartInput -> {
+                        // Any commands before restarting the input are meaningless since they would
+                        // apply to the connection we're going to tear down and recreate.
+                        // Starting a new connection implicitly stops the previous connection.
+                        startInput = true
+                        // It doesn't make sense to start a new connection without the keyboard
+                        // showing.
+                        showKeyboard = true
+                    }
+                    StopInput -> {
+                        startInput = false
+                        // It also doesn't make sense to keep the keyboard visible if it's not
+                        // connected to anything. Note that this is different than the Android
+                        // default behavior for Views, which is to keep the keyboard showing even
+                        // after the view that the IME was shown for loses focus.
+                        // See this doc for some notes and discussion on whether we should auto-hide
+                        // or match Android:
+                        // https://docs.google.com/document/d/1o-y3NkfFPCBhfDekdVEEl41tqtjjqs8jOss6txNgqaw/edit?resourcekey=0-o728aLn51uXXnA4Pkpe88Q#heading=h.ieacosb5rizm
+                        showKeyboard = false
+                    }
+                    ShowKeyboard,
+                    HideKeyboard -> {
+                        // Any keyboard visibility commands sent after input is stopped but before
+                        // input is started should be ignored.
+                        // Otherwise, the last visibility command sent either before the last stop
+                        // command, or after the last start command, is the one that should take
+                        // effect.
+                        if (startInput != false) {
+                            showKeyboard = this == ShowKeyboard
+                        }
+                    }
+                }
+            }
+
+            // Feed all the queued commands into the state machine.
+            var command: TextInputCommand? = initialCommand
+            while (command != null) {
+                command.applyToState()
+                if (DEBUG) {
+                    Log.d(
+                        TAG,
+                        "$DEBUG_CLASS.textInputCommandEventLoop.$command " +
+                            "(startInput=$startInput, showKeyboard=$showKeyboard)"
+                    )
+                }
+                command = textInputCommandChannel.tryReceive().getOrNull()
+            }
+
+            // Now that we've calculated what operations we need to perform on the actual input
+            // manager, perform them.
+            // If the keyboard visibility was changed after starting a new connection, we need to
+            // perform that operation change after starting it.
+            // If the keyboard visibility was changed before closing the connection, we need to
+            // perform that operation before closing the connection so it doesn't no-op.
+            if (startInput == true) {
+                restartInputImmediately()
+            }
+            showKeyboard?.also(::setKeyboardVisibleImmediately)
+            if (startInput == false) {
+                restartInputImmediately()
+            }
+
+            if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.textInputCommandEventLoop.finished")
         }
     }
 
@@ -234,7 +345,7 @@
         }
 
         if (restartInput) {
-            restartInput()
+            restartInputImmediately()
         } else {
             ic?.updateInputState(this.state, inputMethodManager, view)
         }
@@ -262,6 +373,22 @@
             }
         }
     }
+
+    /** Immediately restart the IME connection, bypassing the [textInputCommandChannel]. */
+    private fun restartInputImmediately() {
+        if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.restartInputImmediately")
+        inputMethodManager.restartInput(view)
+    }
+
+    /** Immediately show or hide the keyboard, bypassing the [textInputCommandChannel]. */
+    private fun setKeyboardVisibleImmediately(visible: Boolean) {
+        if (DEBUG) Log.d(TAG, "$DEBUG_CLASS.setKeyboardVisibleImmediately(visible=$visible)")
+        if (visible) {
+            inputMethodManager.showSoftInput(view)
+        } else {
+            inputMethodManager.hideSoftInputFromWindow(view.windowToken)
+        }
+    }
 }
 
 /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
index 2487243..c21a692 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/SubcomposeLayout.kt
@@ -141,18 +141,34 @@
 /**
  * State used by [SubcomposeLayout].
  *
- * @param maxSlotsToRetainForReuse when non-zero the layout will keep active up to this count
- * slots which we were used but not used anymore instead of disposing them. Later when you try to
- * compose a new slot instead of creating a completely new slot the layout would reuse the
- * previous slot which allows to do less work especially if the slot contents are similar.
+ * [slotReusePolicy] the policy defining what slots should be retained to be reused later.
  */
 class SubcomposeLayoutState(
-    private val maxSlotsToRetainForReuse: Int
+    private val slotReusePolicy: SubcomposeSlotReusePolicy
 ) {
     /**
      * State used by [SubcomposeLayout].
      */
-    constructor() : this(0)
+    constructor() : this(NoOpSubcomposeSlotReusePolicy)
+
+    /**
+     * State used by [SubcomposeLayout].
+     *
+     * @param maxSlotsToRetainForReuse when non-zero the layout will keep active up to this count
+     * slots which we were used but not used anymore instead of disposing them. Later when you try to
+     * compose a new slot instead of creating a completely new slot the layout would reuse the
+     * previous slot which allows to do less work especially if the slot contents are similar.
+     */
+    @Deprecated(
+        "This constructor is deprecated",
+        ReplaceWith(
+            "SubcomposeLayoutState(SubcomposeSlotReusePolicy(maxSlotsToRetainForReuse))",
+            "androidx.compose.ui.layout.SubcomposeSlotReusePolicy"
+        )
+    )
+    constructor(maxSlotsToRetainForReuse: Int) : this(
+       SubcomposeSlotReusePolicy(maxSlotsToRetainForReuse)
+    )
 
     private var _state: LayoutNodeSubcompositionsState? = null
     private val state: LayoutNodeSubcompositionsState
@@ -162,13 +178,11 @@
 
     // Pre-allocated lambdas to update LayoutNode
     internal val setRoot: LayoutNode.(SubcomposeLayoutState) -> Unit = {
-        _state = subcompositionsState as? LayoutNodeSubcompositionsState
-            ?: LayoutNodeSubcompositionsState(this, maxSlotsToRetainForReuse).also {
+        _state =
+            subcompositionsState ?: LayoutNodeSubcompositionsState(this, slotReusePolicy).also {
                 subcompositionsState = it
             }
-        // it will keep up to maxSlotsToRetainForReuse currently attached reusable nodes.
-        // we do that because the new value of maxSlotsToRetainForReuse could be smaller.
-        state.disposeAfterIndex(0)
+        state.slotReusePolicy = slotReusePolicy
     }
     internal val setCompositionContext:
         LayoutNode.(CompositionContext) -> Unit =
@@ -215,6 +229,36 @@
 }
 
 /**
+ * This policy allows [SubcomposeLayout] to retain some of slots which we were used but not
+ * used anymore instead of disposing them. Next time when you try to compose a new slot instead of
+ * creating a completely new slot the layout would reuse the kept slot. This allows to do less
+ * work especially if the slot contents are similar.
+ */
+interface SubcomposeSlotReusePolicy {
+    /**
+     * This function will be called with [slotIds] mutable set initially populated with the slot
+     * ids available to reuse. You can remove from the set slots you don't want to retain so
+     * they are available to be reused in the future.
+     */
+    fun getSlotsToRetain(slotIds: MutableSet<Any?>)
+
+    /**
+     * Returns true if the content previously composed with [reusableSlotId] is compatible with
+     * the content which is going to be composed for [slotId].
+     * Slots could be considered incompatible if they display completely different types of the UI.
+     */
+    fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean
+}
+
+/**
+ * Creates [SubcomposeSlotReusePolicy] which retains the fixed amount of slots.
+ *
+ * @param maxSlotsToRetainForReuse the [SubcomposeLayout] will retain up to this amount of slots.
+ */
+fun SubcomposeSlotReusePolicy(maxSlotsToRetainForReuse: Int): SubcomposeSlotReusePolicy =
+    FixedCountSubcomposeSlotReusePolicy(maxSlotsToRetainForReuse)
+
+/**
  * The inner state containing all the information about active slots and their compositions.
  * It is stored inside LayoutNode object as in fact we need to keep 1-1 mapping between this state
  * and the node: when we compose a slot we first create a virtual LayoutNode child to this node
@@ -223,18 +267,28 @@
  * when a new SubcomposeLayoutState is applied to SubcomposeLayout and even when the
  * SubcomposeLayout's LayoutNode is reused via the ReusableComposeNode mechanism.
  */
-private class LayoutNodeSubcompositionsState(
+internal class LayoutNodeSubcompositionsState(
     private val root: LayoutNode,
-    private val maxSlotsToRetainForReuse: Int
+    slotReusePolicy: SubcomposeSlotReusePolicy
 ) {
     var compositionContext: CompositionContext? = null
 
+    var slotReusePolicy: SubcomposeSlotReusePolicy = slotReusePolicy
+        set(value) {
+            if (field !== value) {
+                field = value
+                // apply the new policy
+                disposeOrReuseStartingFromIndex(0)
+            }
+        }
+
     private var currentIndex = 0
     private val nodeToNodeState = mutableMapOf<LayoutNode, NodeState>()
     // this map contains active slotIds (without precomposed or reusable nodes)
     private val slotIdToNode = mutableMapOf<Any?, LayoutNode>()
     private val scope = Scope()
     private val precomposeMap = mutableMapOf<Any?, LayoutNode>()
+    private val reusableSlotIdsCache = mutableSetOf<Any?>()
 
     /**
      * `root.foldedChildren` list consist of:
@@ -261,10 +315,8 @@
                 check(precomposedCount > 0)
                 precomposedCount--
                 precomposed
-            } else if (reusableCount > 0) {
-                takeNodeFromReusables(slotId)
             } else {
-                createNodeAt(currentIndex)
+                takeNodeFromReusables(slotId) ?: createNodeAt(currentIndex)
             }
         }
 
@@ -329,27 +381,36 @@
             }
     }
 
-    fun disposeAfterIndex(currentIndex: Int) {
-        val precomposedNodesSectionStart = root.foldedChildren.size - precomposedCount
-        val reusableNodesSectionStart = maxOf(
-            currentIndex,
-            precomposedNodesSectionStart - maxSlotsToRetainForReuse
-        )
+    private fun getSlotIdAtIndex(index: Int): Any? {
+        val node = root.foldedChildren[index]
+        return nodeToNodeState[node]!!.slotId
+    }
 
-        // keep up to maxCountOfSlotsToReuse last nodes to be reused later
-        reusableCount = precomposedNodesSectionStart - reusableNodesSectionStart
-        for (i in reusableNodesSectionStart until reusableNodesSectionStart + reusableCount) {
-            val node = root.foldedChildren[i]
-            val state = nodeToNodeState[node]!!
-            // remove them from slotIdToNode so they are not considered active
-            slotIdToNode.remove(state.slotId)
-        }
+    fun disposeOrReuseStartingFromIndex(startIndex: Int) {
+        reusableCount = 0
+        val lastReusableIndex = root.foldedChildren.size - precomposedCount - 1
+        if (startIndex <= lastReusableIndex) {
+            // construct the set of available slot ids
+            reusableSlotIdsCache.clear()
+            for (i in startIndex..lastReusableIndex) {
+                reusableSlotIdsCache.add(getSlotIdAtIndex(i))
+            }
 
-        // dispose the rest of the nodes
-        val nodesToDispose = reusableNodesSectionStart - currentIndex
-        if (nodesToDispose > 0) {
-            ignoreRemeasureRequests {
-                root.removeAt(currentIndex, nodesToDispose)
+            slotReusePolicy.getSlotsToRetain(reusableSlotIdsCache)
+            // iterating backwards so it is easier to remove items
+            var i = lastReusableIndex
+            while (i >= startIndex) {
+                val slotId = getSlotIdAtIndex(i)
+                if (reusableSlotIdsCache.contains(slotId)) {
+                    reusableCount++
+                } else {
+                    ignoreRemeasureRequests {
+                        root.removeAt(i, 1)
+                    }
+                }
+                // remove it from slotIdToNode so it is not considered active
+                slotIdToNode.remove(slotId)
+                i--
             }
         }
 
@@ -364,31 +425,49 @@
         }
     }
 
-    private fun takeNodeFromReusables(slotId: Any?): LayoutNode {
-        check(reusableCount > 0)
+    private fun takeNodeFromReusables(slotId: Any?): LayoutNode? {
+        if (reusableCount == 0) {
+            return null
+        }
         val reusableNodesSectionEnd = root.foldedChildren.size - precomposedCount
         val reusableNodesSectionStart = reusableNodesSectionEnd - reusableCount
-        var index = reusableNodesSectionStart
-        while (true) {
-            val node = root.foldedChildren[index]
-            val nodeState = nodeToNodeState.getValue(node)
-            if (nodeState.slotId == slotId) {
+        var index = reusableNodesSectionEnd - 1
+        var chosenIndex = -1
+        // first try to find a node with exactly the same slotId
+        while (index >= reusableNodesSectionStart) {
+            if (getSlotIdAtIndex(index) == slotId) {
                 // we have a node with the same slotId
-                break
-            } else if (index == reusableNodesSectionEnd - 1) {
-                // it is the last available reusable node
-                nodeState.slotId = slotId
+                chosenIndex = index
                 break
             } else {
-                index++
+                index--
             }
         }
-        if (index != reusableNodesSectionStart) {
-            // we need to rearrange the items
-            move(index, reusableNodesSectionStart, 1)
+        if (chosenIndex == -1) {
+            // try to find a first compatible slotId from the end of the section
+            index = reusableNodesSectionEnd - 1
+            while (index >= reusableNodesSectionStart) {
+                val node = root.foldedChildren[index]
+                val nodeState = nodeToNodeState[node]!!
+                if (slotReusePolicy.areCompatible(slotId, nodeState.slotId)) {
+                    nodeState.slotId = slotId
+                    chosenIndex = index
+                    break
+                }
+                index--
+            }
         }
-        reusableCount--
-        return root.foldedChildren[reusableNodesSectionStart]
+        return if (chosenIndex == -1) {
+            // no compatible nodes found
+            null
+        } else {
+            if (index != reusableNodesSectionStart) {
+                // we need to rearrange the items
+                move(index, reusableNodesSectionStart, 1)
+            }
+            reusableCount--
+            root.foldedChildren[reusableNodesSectionStart]
+        }
     }
 
     private fun disposeNode(node: LayoutNode) {
@@ -421,7 +500,7 @@
                 override fun placeChildren() {
                     currentIndex = indexAfterMeasure
                     result.placeChildren()
-                    disposeAfterIndex(currentIndex)
+                    disposeOrReuseStartingFromIndex(currentIndex)
                 }
             }
         }
@@ -441,13 +520,13 @@
         makeSureStateIsConsistent()
         if (!slotIdToNode.containsKey(slotId)) {
             val node = precomposeMap.getOrPut(slotId) {
-                if (reusableCount > 0) {
-                    val node = takeNodeFromReusables(slotId)
+                val reusedNode = takeNodeFromReusables(slotId)
+                if (reusedNode != null) {
                     // now move this node to the end where we keep precomposed items
-                    val nodeIndex = root.foldedChildren.indexOf(node)
+                    val nodeIndex = root.foldedChildren.indexOf(reusedNode)
                     move(nodeIndex, root.foldedChildren.size, 1)
                     precomposedCount++
-                    node
+                    reusedNode
                 } else {
                     createNodeAt(root.foldedChildren.size).also {
                         precomposedCount++
@@ -460,20 +539,15 @@
             override fun dispose() {
                 val node = precomposeMap.remove(slotId)
                 if (node != null) {
-                    val itemIndex = root.foldedChildren.indexOf(node)
-                    check(itemIndex != -1)
-                    if (reusableCount < maxSlotsToRetainForReuse) {
-                        val reusableNodesSectionStart =
-                            root.foldedChildren.size - precomposedCount - reusableCount
-                        move(itemIndex, reusableNodesSectionStart, 1)
-                        reusableCount++
-                    } else {
-                        ignoreRemeasureRequests {
-                            root.removeAt(itemIndex, 1)
-                        }
-                    }
                     check(precomposedCount > 0)
+                    val itemIndex = root.foldedChildren.indexOf(node)
+                    check(itemIndex <= root.foldedChildren.size - precomposedCount)
+                    // move this item into the reusable section
+                    reusableCount++
                     precomposedCount--
+                    val reusableStart = root.foldedChildren.size - precomposedCount - reusableCount
+                    move(itemIndex, reusableStart, 1)
+                    disposeOrReuseStartingFromIndex(reusableStart)
                 }
             }
         }
@@ -527,3 +601,34 @@
             [email protected](slotId, content)
     }
 }
+
+private class FixedCountSubcomposeSlotReusePolicy(
+    private val maxSlotsToRetainForReuse: Int
+) : SubcomposeSlotReusePolicy {
+
+    override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {
+        if (slotIds.size > maxSlotsToRetainForReuse) {
+            var count = 0
+            with(slotIds.iterator()) {
+                // keep first maxSlotsToRetainForReuse items
+                while (hasNext()) {
+                    next()
+                    count++
+                    if (count > maxSlotsToRetainForReuse) {
+                        remove()
+                    }
+                }
+            }
+        }
+    }
+
+    override fun areCompatible(slotId: Any?, reusableSlotId: Any?): Boolean = true
+}
+
+private object NoOpSubcomposeSlotReusePolicy : SubcomposeSlotReusePolicy {
+    override fun getSlotsToRetain(slotIds: MutableSet<Any?>) {
+        slotIds.clear()
+    }
+
+    override fun areCompatible(slotId: Any?, reusableSlotId: Any?) = false
+}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
index d9aeaf8..1e71a98 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
@@ -37,6 +37,7 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.LayoutInfo
 import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.LayoutNodeSubcompositionsState
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasurePolicy
 import androidx.compose.ui.layout.MeasureResult
@@ -588,7 +589,7 @@
     /**
      * The inner state associated with [androidx.compose.ui.layout.SubcomposeLayout].
      */
-    internal var subcompositionsState: Any? = null
+    internal var subcompositionsState: LayoutNodeSubcompositionsState? = null
 
     /**
      * The inner-most layer wrapper. Used for performance for LayoutNodeWrapper.findLayer().
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
index 08c470d..6c732eb 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
@@ -30,7 +30,7 @@
 import kotlinx.coroutines.swing.Swing
 import org.jetbrains.skia.Canvas
 import org.jetbrains.skiko.SkiaLayer
-import org.jetbrains.skiko.SkiaRenderer
+import org.jetbrains.skiko.SkikoView
 import java.awt.Cursor
 import java.awt.Dimension
 import java.awt.Graphics
@@ -126,7 +126,7 @@
     }
 
     init {
-        _component.renderer = object : SkiaRenderer {
+        _component.skikoView = object : SkikoView {
             override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
                 try {
                     scene.render(canvas, nanoTime)
@@ -201,7 +201,7 @@
 
     fun dispose() {
         check(!isDisposed)
-        scene.dispose()
+        scene.close()
         events.cancel()
         _component.dispose()
         _initContent = null
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
index ffa8a08..7af7326 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
@@ -101,7 +101,7 @@
      * Clear-up all acquired resources and stop all pending work
      */
     fun dispose() {
-        scene.dispose()
+        scene.close()
         coroutineScope.cancel()
     }
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
index 0f89475..8f809c6 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
@@ -170,6 +170,7 @@
     val (owner, composition) = remember {
         val owner = SkiaBasedOwner(
             platformInputService = scene.platformInputService,
+            component = scene.component,
             density = density,
             isPopup = true,
             isFocusable = focusable,
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
index a8f8501..2cf7a2c 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
@@ -75,7 +75,7 @@
         }
 
     fun dispose() {
-        scene.dispose()
+        scene.close()
         frameDispatcher.cancel()
     }
 
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
index 8c3f358..1193bb8 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/SkiaLayerTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.platform
 
+import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.RenderEffect
@@ -28,6 +29,8 @@
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.round
 import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
 import org.junit.Rule
 import org.junit.Test
 import kotlin.math.PI
@@ -312,6 +315,58 @@
         assertEquals(IntOffset(-10 * 4 + 60, 100 * 2 + 7), matrix.map(Offset(100f, 10f)).round())
     }
 
+    @Test
+    fun `is in layer`() {
+        layer.resize(IntSize(0, 0))
+        layer.updateProperties(
+            clip = false
+        )
+
+        assertTrue(layer.isInLayer(Offset(-1f, -1f)))
+        assertTrue(layer.isInLayer(Offset(0f, 0f)))
+        assertTrue(layer.isInLayer(Offset(1f, 1f)))
+
+        layer.resize(IntSize(0, 0))
+        layer.updateProperties(
+            clip = true
+        )
+
+        assertFalse(layer.isInLayer(Offset(-1f, -1f)))
+        assertFalse(layer.isInLayer(Offset(0f, 0f)))
+        assertFalse(layer.isInLayer(Offset(1f, 1f)))
+
+        layer.resize(IntSize(0, 0))
+        layer.updateProperties(
+            clip = true,
+            shape = CircleShape
+        )
+
+        assertFalse(layer.isInLayer(Offset(-1f, -1f)))
+        assertFalse(layer.isInLayer(Offset(0f, 0f)))
+        assertFalse(layer.isInLayer(Offset(1f, 1f)))
+
+        layer.resize(IntSize(1, 2))
+        layer.updateProperties(
+            clip = true
+        )
+
+        assertFalse(layer.isInLayer(Offset(-1f, -1f)))
+        assertTrue(layer.isInLayer(Offset(0f, 0f)))
+        assertTrue(layer.isInLayer(Offset(0f, 1f)))
+        assertFalse(layer.isInLayer(Offset(0f, 2f)))
+        assertFalse(layer.isInLayer(Offset(1f, 0f)))
+
+        layer.resize(IntSize(100, 200))
+        layer.updateProperties(
+            clip = true,
+            shape = CircleShape
+        )
+
+        assertFalse(layer.isInLayer(Offset(5f, 5f)))
+        assertFalse(layer.isInLayer(Offset(95f, 195f)))
+        assertTrue(layer.isInLayer(Offset(50f, 100f)))
+    }
+
     private fun TestSkiaLayer() = SkiaLayer(
         Density(1f, 1f),
         invalidateParentLayer = {},
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
index c358016..d195d8d 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
@@ -35,7 +35,6 @@
 import androidx.compose.ui.platform.PlatformComponent
 import androidx.compose.ui.platform.SkiaBasedOwner
 import androidx.compose.ui.platform.PlatformInput
-import androidx.compose.ui.platform.SkiaRootForTest
 import androidx.compose.ui.platform.DummyPlatformComponent
 import androidx.compose.ui.platform.EmptyDispatcher
 import androidx.compose.ui.platform.FlushCoroutineDispatcher
@@ -59,19 +58,19 @@
 }
 
 /**
- * Virtual container that encapsulates Compose UI content. UI content can be constructed via
+ * A virtual container that encapsulates Compose UI content. UI content can be constructed via
  * [setContent] method and with any Composable that manipulates [LayoutNode] tree.
  *
  * To draw content on [Canvas], you can use [render] method.
  *
  * To specify available size for the content, you should use [constraints].
  *
- * After [ComposeScene] will no longer needed, you should call [dispose] method, so all resources
+ * After [ComposeScene] will no longer needed, you should call [close] method, so all resources
  * and subscriptions will be properly closed. Otherwise there can be a memory leak.
  */
 class ComposeScene internal constructor(
     coroutineContext: CoroutineContext,
-    private val component: PlatformComponent,
+    internal val component: PlatformComponent,
     density: Density,
     private val invalidate: () -> Unit
 ) {
@@ -128,9 +127,9 @@
     }
 
     /**
-     * All currently registered [SkiaRootForTest]s. After calling [setContent] the first root
-     * will be added. If there is an any Popup is present in the content, it will be added as
-     * another [SkiaRootForTest]
+     * All currently registered [RootForTest]s. After calling [setContent] the first root
+     * will be added. If there is an any [Popup] is present in the content, it will be added as
+     * another [RootForTest]
      */
     val roots: Set<RootForTest> get() = list
 
@@ -153,12 +152,12 @@
      */
     var density: Density = density
         set(value) {
-            check(!isDisposed) { "ComposeScene is disposed" }
+            check(!isClosed) { "ComposeScene is closed" }
             field = value
             mainOwner?.density = value
         }
 
-    private var isDisposed = false
+    private var isClosed = false
 
     init {
         GlobalSnapshotManager.ensureStarted()
@@ -176,12 +175,12 @@
      *
      * After calling this method, you cannot call any other method of this [ComposeScene].
      */
-    fun dispose() {
+    fun close() {
         composition?.dispose()
         mainOwner?.dispose()
         recomposer.cancel()
         job.cancel()
-        isDisposed = true
+        isClosed = true
     }
 
     private fun dispatchCommand(command: () -> Unit) {
@@ -198,26 +197,25 @@
         recomposer.hasPendingWork ||
         dispatcher.hasTasks()
 
-    internal fun attach(skiaBasedOwner: SkiaBasedOwner) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        list.add(skiaBasedOwner)
-        skiaBasedOwner.onNeedRender = ::invalidateIfNeeded
-        skiaBasedOwner.onDispatchCommand = ::dispatchCommand
-        skiaBasedOwner.constraints = constraints
-        skiaBasedOwner.containerCursor = component
+    internal fun attach(owner: SkiaBasedOwner) {
+        check(!isClosed) { "ComposeScene is closed" }
+        list.add(owner)
+        owner.onNeedRender = ::invalidateIfNeeded
+        owner.onDispatchCommand = ::dispatchCommand
+        owner.constraints = constraints
         invalidateIfNeeded()
-        if (skiaBasedOwner.isFocusable) {
-            focusedOwner = skiaBasedOwner
+        if (owner.isFocusable) {
+            focusedOwner = owner
         }
     }
 
-    internal fun detach(skiaBasedOwner: SkiaBasedOwner) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        list.remove(skiaBasedOwner)
-        skiaBasedOwner.onDispatchCommand = null
-        skiaBasedOwner.onNeedRender = null
+    internal fun detach(owner: SkiaBasedOwner) {
+        check(!isClosed) { "ComposeScene is closed" }
+        list.remove(owner)
+        owner.onDispatchCommand = null
+        owner.onNeedRender = null
         invalidateIfNeeded()
-        if (skiaBasedOwner == focusedOwner) {
+        if (owner == focusedOwner) {
             focusedOwner = list.lastOrNull { it.isFocusable }
         }
     }
@@ -257,11 +255,12 @@
         onKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
         content: @Composable () -> Unit
     ) {
-        check(!isDisposed) { "ComposeScene is disposed" }
+        check(!isClosed) { "ComposeScene is closed" }
         composition?.dispose()
         mainOwner?.dispose()
         val mainOwner = SkiaBasedOwner(
             platformInputService,
+            component,
             density,
             onPreviewKeyEvent = onPreviewKeyEvent,
             onKeyEvent = onKeyEvent
@@ -295,7 +294,7 @@
      */
     val contentSize: IntSize
         get() {
-            check(!isDisposed) { "ComposeScene is disposed" }
+            check(!isClosed) { "ComposeScene is closed" }
             val mainOwner = mainOwner ?: return IntSize.Zero
             mainOwner.measureAndLayout()
             return IntSize(mainOwner.root.width, mainOwner.root.height)
@@ -306,7 +305,7 @@
      * animations in the content (or any other code, which uses [withFrameNanos]
      */
     fun render(canvas: Canvas, nanoTime: Long) {
-        check(!isDisposed) { "ComposeScene is disposed" }
+        check(!isClosed) { "ComposeScene is closed" }
         postponeInvalidation {
             // TODO(https://github.com/JetBrains/compose-jb/issues/1135):
             //  Temporarily workaround for flaky tests in WithComposeUiTest.
@@ -362,7 +361,7 @@
 //        buttons: PointerButtons? = null,
 //        keyboardModifiers: PointerKeyboardModifiers? = null,
     ): Unit = postponeInvalidation {
-        check(!isDisposed) { "ComposeScene is disposed" }
+        check(!isClosed) { "ComposeScene is closed" }
         when (eventType) {
             PointerEventType.Press -> isMousePressed = true
             PointerEventType.Release -> isMousePressed = false
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/OutlineCache.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/OutlineCache.skiko.kt
index 2b742dc..9eca11a 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/OutlineCache.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/OutlineCache.skiko.kt
@@ -38,7 +38,7 @@
         set(value) {
             if (value != field) {
                 field = value
-                update()
+                outline = createOutline()
             }
         }
 
@@ -46,7 +46,7 @@
         set(value) {
             if (value != field) {
                 field = value
-                update()
+                outline = createOutline()
             }
         }
 
@@ -54,7 +54,7 @@
         set(value) {
             if (value != field) {
                 field = value
-                update()
+                outline = createOutline()
             }
         }
 
@@ -62,19 +62,13 @@
         set(value) {
             if (value != field) {
                 field = value
-                update()
+                outline = createOutline()
             }
         }
 
-    var outline: Outline? = null
+    var outline: Outline = createOutline()
         private set
 
-    private fun update() {
-        outline = if (size != IntSize.Zero) {
-            val floatSize = size.toSize()
-            shape.createOutline(floatSize, layoutDirection, density)
-        } else {
-            null
-        }
-    }
+    private fun createOutline() =
+        shape.createOutline(size.toSize(), layoutDirection, density)
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
index 4b19010c3..f65d0cc 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
@@ -84,6 +84,7 @@
 )
 internal class SkiaBasedOwner(
     private val platformInputService: PlatformInput,
+    private val component: PlatformComponent,
     density: Density = Density(1f, 1f),
     val isPopup: Boolean = false,
     val isFocusable: Boolean = true,
@@ -237,7 +238,6 @@
     val needRender get() = needLayout || needDraw || needSendSyntheticEvents
     var onNeedRender: (() -> Unit)? = null
     var onDispatchCommand: ((Command) -> Unit)? = null
-    var containerCursor: PlatformComponentWithCursor? = null
 
     fun render(canvas: org.jetbrains.skia.Canvas) {
         needLayout = false
@@ -388,7 +388,7 @@
             }
         ).also {
             if (it.dispatchedToAPointerInputModifier) {
-                setPointerIcon(containerCursor, desiredPointerIcon)
+                setPointerIcon(component, desiredPointerIcon)
             }
         }
     }
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
index 142260a..84731b6 100644
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
@@ -126,7 +126,7 @@
             return 0f <= x && x < size.width && 0f <= y && y < size.height
         }
 
-        return isInOutline(outlineCache.outline!!, x, y)
+        return isInOutline(outlineCache.outline, x, y)
     }
 
     private fun getMatrix(inverse: Boolean): Matrix {
@@ -237,9 +237,6 @@
                     is Outline.Rectangle -> canvas.clipRect(outline.rect)
                     is Outline.Rounded -> canvas.clipRoundRect(outline.roundRect)
                     is Outline.Generic -> canvas.clipPath(outline.path)
-                    null -> {
-                        // Nothing
-                    }
                 }
             }
 
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
new file mode 100644
index 0000000..2272a75
--- /dev/null
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/text/input/TextInputServiceAndroidCommandDebouncingTest.kt
@@ -0,0 +1,293 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.compose.ui.text.input
+
+import android.os.IBinder
+import android.view.View
+import android.view.inputmethod.ExtractedText
+import com.google.common.truth.Truth.assertThat
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.whenever
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.TestCoroutineScope
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class TextInputServiceAndroidCommandDebouncingTest {
+
+    private val view = mock<View>()
+    private val inputMethodManager = TestInputMethodManager()
+    private val service = TextInputServiceAndroid(view, inputMethodManager)
+    private val scope = TestCoroutineScope(Job())
+
+    @Before
+    fun setUp() {
+        // Default the view to focused because when it's not focused commands should be ignored.
+        whenever(view.isFocused).thenReturn(true)
+
+        // Pause the dispatcher so that tests can send multiple commands before they get processed
+        // by the command event loop. This simulates how events are processed when multiple back-to-
+        // back focus events send commands to the service before the coroutine resumes on the next
+        // main loop iteration.
+        scope.pauseDispatcher()
+        scope.launch { service.textInputCommandEventLoop() }
+    }
+
+    @After
+    fun tearDown() {
+        scope.cancel()
+    }
+
+    @Test
+    fun showKeyboard_callsShowKeyboard() {
+        service.showSoftwareKeyboard()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.showSoftInputCalls).hasSize(1)
+        assertThat(inputMethodManager.restartCalls).isEmpty()
+        assertThat(inputMethodManager.hideSoftInputCalls).isEmpty()
+    }
+
+    @Test
+    fun hideKeyboard_callsHideKeyboard() {
+        service.hideSoftwareKeyboard()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.hideSoftInputCalls).hasSize(1)
+        assertThat(inputMethodManager.restartCalls).isEmpty()
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+    }
+
+    @Test
+    fun startInput_callsRestartInput() {
+        service.startInput()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.restartCalls).hasSize(1)
+    }
+
+    @Test
+    fun startInput_callsShowKeyboard() {
+        service.startInput()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.showSoftInputCalls).hasSize(1)
+    }
+
+    @Test
+    fun stopInput_callsRestartInput() {
+        service.stopInput()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.restartCalls).hasSize(1)
+    }
+
+    @Test
+    fun stopInput_callsHideKeyboard() {
+        service.stopInput()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.hideSoftInputCalls).hasSize(1)
+    }
+
+    @Test
+    fun startThenStopInput_onlyCallsRestartOnce() {
+        service.startInput()
+        service.stopInput()
+        scope.advanceUntilIdle()
+
+        // Both startInput and stopInput restart the IMM. So calling those two methods back-to-back,
+        // in either order, should debounce to a single restart call. If they aren't de-duped, the
+        // keyboard may flicker if one of the calls configures the IME in a non-default way (e.g.
+        // number input).
+        assertThat(inputMethodManager.restartCalls).hasSize(1)
+    }
+
+    @Test
+    fun stopThenStartInput_onlyCallsRestartOnce() {
+        service.stopInput()
+        service.startInput()
+        scope.advanceUntilIdle()
+
+        // Both startInput and stopInput restart the IMM. So calling those two methods back-to-back,
+        // in either order, should debounce to a single restart call. If they aren't de-duped, the
+        // keyboard may flicker if one of the calls configures the IME in a non-default way (e.g.
+        // number input).
+        assertThat(inputMethodManager.restartCalls).hasSize(1)
+    }
+
+    @Test
+    fun showKeyboard_afterStopInput_isIgnored() {
+        service.stopInput()
+        service.showSoftwareKeyboard()
+        scope.advanceUntilIdle()
+
+        // After stopInput, there's no input connection, so any calls to show the keyboard should
+        // be ignored until the next call to startInput.
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+    }
+
+    @Test
+    fun hideKeyboard_afterStopInput_isIgnored() {
+        service.stopInput()
+        service.hideSoftwareKeyboard()
+        scope.advanceUntilIdle()
+
+        // stopInput will hide the keyboard implicitly, so both stopInput and hideSoftwareKeyboard
+        // have the effect "hide the keyboard". These two effects should be debounced and the IMM
+        // should only get a single hide call instead of two redundant calls.
+        assertThat(inputMethodManager.hideSoftInputCalls).hasSize(1)
+    }
+
+    @Test
+    fun multipleShowCallsAreDebounced() {
+        repeat(10) {
+            service.showSoftwareKeyboard()
+        }
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.showSoftInputCalls).hasSize(1)
+    }
+
+    @Test
+    fun multipleHideCallsAreDebounced() {
+        repeat(10) {
+            service.hideSoftwareKeyboard()
+        }
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.hideSoftInputCalls).hasSize(1)
+    }
+
+    @Test
+    fun showThenHideAreDebounced() {
+        service.showSoftwareKeyboard()
+        service.hideSoftwareKeyboard()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.showSoftInputCalls).hasSize(0)
+        assertThat(inputMethodManager.hideSoftInputCalls).hasSize(1)
+    }
+
+    @Test
+    fun hideThenShowAreDebounced() {
+        service.hideSoftwareKeyboard()
+        service.showSoftwareKeyboard()
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.showSoftInputCalls).hasSize(1)
+        assertThat(inputMethodManager.hideSoftInputCalls).hasSize(0)
+    }
+
+    @Test fun stopInput_isNotProcessedImmediately() {
+        service.stopInput()
+
+        assertThat(inputMethodManager.restartCalls).isEmpty()
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+        assertThat(inputMethodManager.hideSoftInputCalls).isEmpty()
+    }
+
+    @Test fun startInput_isNotProcessedImmediately() {
+        service.startInput()
+
+        assertThat(inputMethodManager.restartCalls).isEmpty()
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+        assertThat(inputMethodManager.hideSoftInputCalls).isEmpty()
+    }
+
+    @Test fun showSoftwareKeyboard_isNotProcessedImmediately() {
+        service.showSoftwareKeyboard()
+
+        assertThat(inputMethodManager.restartCalls).isEmpty()
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+        assertThat(inputMethodManager.hideSoftInputCalls).isEmpty()
+    }
+
+    @Test fun hideSoftwareKeyboard_isNotProcessedImmediately() {
+        service.hideSoftwareKeyboard()
+
+        assertThat(inputMethodManager.restartCalls).isEmpty()
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+        assertThat(inputMethodManager.hideSoftInputCalls).isEmpty()
+    }
+
+    @Test fun commandsAreIgnored_ifFocusLostBeforeProcessing() {
+        // Send command while view still has focus.
+        service.showSoftwareKeyboard()
+        // Blur the view.
+        whenever(view.isFocused).thenReturn(false)
+        // Process the queued commands.
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+    }
+
+    @Test fun commandsAreDrained_whenProcessedWithoutFocus() {
+        whenever(view.isFocused).thenReturn(false)
+        service.showSoftwareKeyboard()
+        service.hideSoftwareKeyboard()
+        scope.advanceUntilIdle()
+        whenever(view.isFocused).thenReturn(true)
+        scope.advanceUntilIdle()
+
+        assertThat(inputMethodManager.showSoftInputCalls).isEmpty()
+    }
+
+    private fun TextInputServiceAndroid.startInput() {
+        startInput(
+            TextFieldValue(),
+            ImeOptions.Default,
+            onEditCommand = {},
+            onImeActionPerformed = {}
+        )
+    }
+
+    private class TestInputMethodManager : InputMethodManager {
+        val restartCalls = mutableListOf<View>()
+        val showSoftInputCalls = mutableListOf<View>()
+        val hideSoftInputCalls = mutableListOf<IBinder?>()
+
+        override fun restartInput(view: View) {
+            restartCalls += view
+        }
+
+        override fun showSoftInput(view: View) {
+            showSoftInputCalls += view
+        }
+
+        override fun hideSoftInputFromWindow(windowToken: IBinder?) {
+            hideSoftInputCalls += windowToken
+        }
+
+        override fun updateExtractedText(view: View, token: Int, extractedText: ExtractedText) {
+        }
+
+        override fun updateSelection(
+            view: View,
+            selectionStart: Int,
+            selectionEnd: Int,
+            compositionStart: Int,
+            compositionEnd: Int
+        ) {
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
index 3e98566..40dc180 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/ShortcutInfoChangeListenerImplTest.java
@@ -242,6 +242,8 @@
                 .put("remainingTime", 0)
                 .put("timerStatus", "Unknown")
                 .put("vibrate", false)
+                .put("bootCount", 0)
+                .put("originalDurationMillis", 0)
                 .build();
         assertThat(allValues).containsExactly(expected);
     }
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmConverterTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmConverterTest.java
index 3a8e45d..073e4d8 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmConverterTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmConverterTest.java
@@ -45,33 +45,29 @@
     public void testConvert_returnsIndexable() throws Exception {
         TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
 
-        AlarmInstance previousInstance = new AlarmInstance.Builder("namespace", "instance1")
+        AlarmInstance previousInstance = new AlarmInstance.Builder(
+                "namespace", "instance1", "2020-01-01T00:00:00")
                 .setCreationTimestampMillis(1000)
                 .setStatus(AlarmInstance.STATUS_DISMISSED)
-                .setYear(2020)
-                .setMonth(Calendar.JANUARY)
-                .setDay(1)
                 .build();
-        AlarmInstance nextInstance = new AlarmInstance.Builder("namespace", "instance2")
+        AlarmInstance nextInstance = new AlarmInstance.Builder(
+                "namespace", "instance2", "2020-01-02T00:00:00")
                 .setCreationTimestampMillis(1000)
                 .setStatus(AlarmInstance.STATUS_SCHEDULED)
-                .setYear(2020)
-                .setMonth(Calendar.JANUARY)
-                .setDay(2)
                 .build();
         Alarm alarm = new Alarm.Builder("namespace", "id")
                 .setCreationTimestampMillis(1000)
-                .setTtlMillis(2000)
-                .setScore(1)
+                .setDocumentTtlMillis(2000)
+                .setDocumentScore(1)
                 .setName("alarm")
                 .setEnabled(true)
                 .setDaysOfWeek(Calendar.MONDAY, Calendar.TUESDAY)
                 .setHour(7)
                 .setMinute(30)
-                .setBlackoutStartTimeMillis(100)
-                .setBlackoutEndTimeMillis(200)
+                .setBlackoutPeriodStartDate("2020-02-01")
+                .setBlackoutPeriodEndDate("2020-03-01")
                 .setRingtone("clock://ringtone/1")
-                .setVibrate(true)
+                .setShouldVibrate(true)
                 .setPreviousInstance(previousInstance)
                 .setNextInstance(nextInstance)
                 .build();
@@ -123,8 +119,8 @@
                 .put("vibrate", true)
                 .put("enabled", true)
                 .put("identifier", "id")
-                .put("blackoutStartTimeMillis", 100)
-                .put("blackoutEndTimeMillis", 200)
+                .put("blackoutPeriodStartDate", "2020-02-01")
+                .put("blackoutPeriodEndDate", "2020-03-01")
                 .put("dayOfWeek", "Monday", "Tuesday")
                 .put("alarmInstances", expectedInstance1, expectedInstance2)
                 .build();
@@ -156,8 +152,6 @@
                 .put("vibrate", false)
                 .put("enabled", false)
                 .put("identifier", "id")
-                .put("blackoutStartTimeMillis", 0)
-                .put("blackoutEndTimeMillis", 0)
                 .build();
         assertThat(result).isEqualTo(expectedResult);
     }
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverterTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverterTest.java
index e5b9c85..fbc23b5 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverterTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverterTest.java
@@ -31,7 +31,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.Calendar;
 import java.util.TimeZone;
 
 @RunWith(AndroidJUnit4.class)
@@ -44,15 +43,11 @@
     public void testConvert_returnsIndexable() throws Exception {
         TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
 
-        AlarmInstance alarmInstance = new AlarmInstance.Builder("namespace", "id")
+        AlarmInstance alarmInstance = new AlarmInstance.Builder(
+                "namespace", "id", "2020-01-02T07:30:00")
                 .setCreationTimestampMillis(1000)
-                .setTtlMillis(2000)
-                .setScore(1)
-                .setYear(2020)
-                .setMonth(Calendar.JANUARY)
-                .setDay(2)
-                .setHour(7)
-                .setMinute(30)
+                .setDocumentTtlMillis(2000)
+                .setDocumentScore(1)
                 .setStatus(AlarmInstance.STATUS_SCHEDULED)
                 .setSnoozeDurationMillis(3000)
                 .build();
@@ -79,13 +74,9 @@
     @Test
     @SmallTest
     public void testConvert_differentTimeZone_returnsIndexableWithSameLocalTime() throws Exception {
-        AlarmInstance alarmInstance = new AlarmInstance.Builder("namespace", "id")
+        AlarmInstance alarmInstance = new AlarmInstance.Builder(
+                "namespace", "id", "2020-01-02T07:30:00")
                 .setCreationTimestampMillis(1000)
-                .setYear(2020)
-                .setMonth(Calendar.JANUARY)
-                .setDay(2)
-                .setHour(7)
-                .setMinute(30)
                 .setStatus(AlarmInstance.STATUS_SCHEDULED)
                 .build();
         Indexable.Builder expectedResultTemplate = new Indexable.Builder("AlarmInstance")
@@ -119,7 +110,8 @@
     public void testConvert_withoutOptionalFields_returnsIndexable() throws Exception {
         TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
 
-        AlarmInstance alarmInstance = new AlarmInstance.Builder("namespace", "id")
+        AlarmInstance alarmInstance = new AlarmInstance.Builder(
+                "namespace", "id", "2020-01-02T07:30:00")
                 // CurrentTime will be used if not set.
                 .setCreationTimestampMillis(1000)
                 .build();
@@ -136,9 +128,9 @@
                 .put(IndexableKeys.NAMESPACE, "namespace")
                 .put(IndexableKeys.TTL_MILLIS, 0)
                 .put(IndexableKeys.CREATION_TIMESTAMP_MILLIS, 1000)
-                .put("scheduledTime", "0002-12-31T00:00:00+0000")
                 .put("alarmStatus", "Unknown")
                 .put("snoozeLength", -1)
+                .put("scheduledTime", "2020-01-02T07:30:00+0000")
                 .build();
         assertThat(result).isEqualTo(expectedResult);
     }
diff --git a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/TimerConverterTest.java b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/TimerConverterTest.java
index 8607bcf..22c381f 100644
--- a/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/TimerConverterTest.java
+++ b/core/core-google-shortcuts/src/androidTest/java/androidx/core/google/shortcuts/converters/TimerConverterTest.java
@@ -62,17 +62,20 @@
         when(mTimeModelMock.getSystemClockElapsedRealtime()).thenReturn(10000L);
 
         Timer timer = new Timer.Builder("namespace", "id")
-                .setScore(10)
-                .setTtlMillis(60000)
+                .setDocumentScore(10)
+                .setDocumentTtlMillis(60000)
                 .setCreationTimestampMillis(1)
                 .setName("my timer")
                 .setDurationMillis(1000)
-                .setRemainingTimeMillis(10000)
+                .setRemainingTimeMillisSinceUpdate(10000)
                 .setRingtone(AlarmClock.VALUE_RINGTONE_SILENT)
                 .setStatus(Timer.STATUS_STARTED)
-                .setVibrate(true)
-                .setStartTimeMillis(3000)
-                .setStartTimeMillisInElapsedRealtime(5000)
+                .setShouldVibrate(true)
+                .setStartTimeMillis(
+                        /*startTimeMillis=*/3000,
+                        /*startTimeMillisInElapsedRealtime=*/5000,
+                        /*bootCount=*/1)
+                .setOriginalDurationMillis(800)
                 .build();
 
         Indexable result = mTimerConverter.convertGenericDocument(
@@ -99,6 +102,8 @@
                 .put("remainingTime", 10000)
                 .put("ringtone", "silent")
                 .put("vibrate", true)
+                .put("bootCount", 1)
+                .put("originalDurationMillis", 800)
                 .build();
         assertThat(result).isEqualTo(expectedResult);
     }
@@ -115,17 +120,20 @@
         when(mTimeModelMock.getSystemClockElapsedRealtime()).thenReturn(10000L);
 
         Timer timer = new Timer.Builder("namespace", "id")
-                .setScore(10)
-                .setTtlMillis(60000)
+                .setDocumentScore(10)
+                .setDocumentTtlMillis(60000)
                 .setCreationTimestampMillis(1)
                 .setName("my timer")
                 .setDurationMillis(1000)
-                .setRemainingTimeMillis(10000)
+                .setRemainingTimeMillisSinceUpdate(10000)
                 .setRingtone(AlarmClock.VALUE_RINGTONE_SILENT)
                 .setStatus(Timer.STATUS_STARTED)
-                .setVibrate(true)
-                .setStartTimeMillis(3000)
-                .setStartTimeMillisInElapsedRealtime(5000)
+                .setShouldVibrate(true)
+                .setStartTimeMillis(
+                        /*startTimeMillis=*/3000,
+                        /*startTimeMillisInElapsedRealtime=*/5000,
+                        /*bootCount=*/1)
+                .setOriginalDurationMillis(800)
                 .build();
 
         Indexable result = mTimerConverter.convertGenericDocument(
@@ -153,6 +161,8 @@
                 .put("remainingTime", 10000)
                 .put("ringtone", "silent")
                 .put("vibrate", true)
+                .put("bootCount", 1)
+                .put("originalDurationMillis", 800)
                 .build();
         assertThat(result).isEqualTo(expectedResult);
     }
@@ -182,6 +192,8 @@
                 .put("timerStatus", "Unknown")
                 .put("remainingTime", 0)
                 .put("vibrate", false)
+                .put("bootCount", 0)
+                .put("originalDurationMillis", 0)
                 .build();
         assertThat(result).isEqualTo(expectedResult);
     }
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmConverter.java
index a14c925..789e54a 100644
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmConverter.java
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmConverter.java
@@ -50,14 +50,15 @@
     private static final String HOUR_KEY = "hour";
     private static final String MINUTE_KEY = "minute";
     private static final String RINGTONE_KEY = "ringtone";
-    private static final String VIBRATE_KEY = "vibrate";
-    private static final String BLACKOUT_START_TIME_MILLIS_KEY = "blackoutStartTimeMillis";
-    private static final String BLACKOUT_END_TIME_MILLIS_KEY = "blackoutEndTimeMillis";
+    private static final String SHOULD_VIBRATE_KEY = "shouldVibrate";
+    private static final String BLACKOUT_PERIOD_START_DATE_KEY = "blackoutPeriodStartDate";
+    private static final String BLACKOUT_PERIOD_END_DATE_KEY = "blackoutPeriodEndDate";
     private static final String PREVIOUS_INSTANCE_KEY = "previousInstance";
     private static final String NEXT_INSTANCE_KEY = "nextInstance";
 
     // Keys for Indexables
     private static final String IDENTIFIER_KEY = "identifier";
+    private static final String VIBRATE_KEY = "vibrate";
     private static final String MESSAGE_KEY = "message";
     private static final String DAY_OF_WEEK_KEY = "dayOfWeek";
     private static final String ALARM_INSTANCES_KEY = "alarmInstances";
@@ -95,13 +96,13 @@
                 .put(HOUR_KEY, alarm.getPropertyLong(HOUR_KEY))
                 .put(MINUTE_KEY, alarm.getPropertyLong(MINUTE_KEY))
                 .put(RINGTONE_KEY, alarm.getPropertyString(RINGTONE_KEY))
-                .put(VIBRATE_KEY, alarm.getPropertyBoolean(VIBRATE_KEY))
+                .put(VIBRATE_KEY, alarm.getPropertyBoolean(SHOULD_VIBRATE_KEY))
                 .put(ENABLED_KEY, alarm.getPropertyBoolean(ENABLED_KEY))
                 .put(IDENTIFIER_KEY, alarm.getId())
-                .put(BLACKOUT_START_TIME_MILLIS_KEY,
-                        alarm.getPropertyLong(BLACKOUT_START_TIME_MILLIS_KEY))
-                .put(BLACKOUT_END_TIME_MILLIS_KEY,
-                        alarm.getPropertyLong(BLACKOUT_END_TIME_MILLIS_KEY));
+                .put(BLACKOUT_PERIOD_START_DATE_KEY,
+                        alarm.getPropertyString(BLACKOUT_PERIOD_START_DATE_KEY))
+                .put(BLACKOUT_PERIOD_END_DATE_KEY,
+                        alarm.getPropertyString(BLACKOUT_PERIOD_END_DATE_KEY));
 
         long[] daysOfWeek = alarm.getPropertyLongArray(DAYS_OF_WEEK_KEY);
         if (daysOfWeek != null) {
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverter.java
index 98f3f21..1fa4520 100644
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverter.java
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/AlarmInstanceConverter.java
@@ -30,7 +30,11 @@
 
 import com.google.firebase.appindexing.Indexable;
 
-import java.util.Calendar;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
 
 /**
  * Convert for the {@link AlarmInstance} built-in type.
@@ -42,11 +46,6 @@
     private static final String TAG = "AlarmInstanceConverter";
 
     // Keys from the AppSearch document
-    private static final String YEAR_KEY = "year";
-    private static final String MONTH_KEY = "month";
-    private static final String DAY_KEY = "day";
-    private static final String HOUR_KEY = "hour";
-    private static final String MINUTE_KEY = "minute";
     private static final String STATUS_KEY = "status";
     private static final String SNOOZE_DURATION_MILLIS_KEY = "snoozeDurationMillis";
 
@@ -64,6 +63,7 @@
     private static final String UNKNOWN = "Unknown";
 
     private static final String ALARM_INSTANCE_INDEXABLE_TYPE = "AlarmInstance";
+    private static final String SCHEDULED_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
 
     @NonNull
     @Override
@@ -76,17 +76,19 @@
                 ConverterUtils.buildBaseIndexableFromGenericDocument(context,
                         ALARM_INSTANCE_INDEXABLE_TYPE, alarmInstance);
 
-        int year = (int) alarmInstance.getPropertyLong(YEAR_KEY);
-        int month = (int) alarmInstance.getPropertyLong(MONTH_KEY);
-        int day = (int) alarmInstance.getPropertyLong(DAY_KEY);
-        int hour = (int) alarmInstance.getPropertyLong(HOUR_KEY);
-        int minute = (int) alarmInstance.getPropertyLong(MINUTE_KEY);
-        Calendar calendar = Calendar.getInstance();
-        calendar.set(year, month, day, hour, minute, 0);
-        calendar.set(Calendar.MILLISECOND, 0);
-
-        indexableBuilder.put(SCHEDULED_TIME_KEY, ConverterUtils.convertTimestampToISO8601Format(
-                calendar.getTimeInMillis(), calendar.getTimeZone()));
+        // Convert the scheduled time into a timezone dependent format
+        String scheduledTimeString = alarmInstance.getPropertyString(SCHEDULED_TIME_KEY);
+        if (scheduledTimeString != null) {
+            DateFormat format = new SimpleDateFormat(SCHEDULED_TIME_FORMAT, Locale.US);
+            try {
+                Date scheduledTime = format.parse(scheduledTimeString);
+                indexableBuilder.put(SCHEDULED_TIME_KEY,
+                        ConverterUtils.convertTimestampToISO8601Format(scheduledTime.getTime(),
+                                null));
+            } catch (ParseException e) {
+                Log.w(TAG, "Failed to parse scheduledTime: " + scheduledTimeString);
+            }
+        }
 
         int status = (int) alarmInstance.getPropertyLong(STATUS_KEY);
         switch (status) {
diff --git a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimerConverter.java b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimerConverter.java
index 0b7e505..6635901 100644
--- a/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimerConverter.java
+++ b/core/core-google-shortcuts/src/main/java/androidx/core/google/shortcuts/converters/TimerConverter.java
@@ -43,13 +43,16 @@
     // Keys from the AppSearch document
     private static final String NAME_KEY = "name";
     private static final String DURATION_MILLIS_KEY = "durationMillis";
-    private static final String REMAINING_TIME_MILLIS_KEY = "remainingTimeMillis";
+    private static final String REMAINING_TIME_MILLIS_SINCE_UPDATE_KEY =
+            "remainingTimeMillisSinceUpdate";
     private static final String RINGTONE_KEY = "ringtone";
     private static final String STATUS_KEY = "status";
-    private static final String VIBRATE_KEY = "vibrate";
+    private static final String SHOULD_VIBRATE_KEY = "shouldVibrate";
     private static final String START_TIME_MILLIS_KEY = "startTimeMillis";
     private static final String START_TIME_MILLIS_IN_ELAPSED_REALTIME_KEY =
             "startTimeMillisInElapsedRealtime";
+    private static final String BOOT_COUNT_KEY = "bootCount";
+    private static final String ORIGINAL_DURATION_MILLIS_KEY = "originalDurationMillis";
 
     // Keys for Indexables
     private static final String MESSAGE_KEY = "message";
@@ -59,6 +62,7 @@
     private static final String EXPIRE_TIME_CORRECTED_BY_START_TIME_IN_ELAPSED_REALTIME_KEY =
             "expireTimeCorrectedByStartTimeInElapsedRealtime";
     private static final String TIMER_STATUS_KEY = "timerStatus";
+    private static final String VIBRATE_KEY = "vibrate";
 
     // Enums for TimerStatus
     private static final String STARTED = "Started";
@@ -94,9 +98,13 @@
         indexableBuilder
                 .put(MESSAGE_KEY, timer.getPropertyString(NAME_KEY))
                 .put(LENGTH_KEY, timer.getPropertyLong(DURATION_MILLIS_KEY))
-                .put(REMAINING_TIME_KEY, timer.getPropertyLong(REMAINING_TIME_MILLIS_KEY))
+                .put(REMAINING_TIME_KEY,
+                        timer.getPropertyLong(REMAINING_TIME_MILLIS_SINCE_UPDATE_KEY))
                 .put(RINGTONE_KEY, timer.getPropertyString(RINGTONE_KEY))
-                .put(VIBRATE_KEY, timer.getPropertyBoolean(VIBRATE_KEY));
+                .put(VIBRATE_KEY, timer.getPropertyBoolean(SHOULD_VIBRATE_KEY))
+                .put(BOOT_COUNT_KEY, timer.getPropertyLong(BOOT_COUNT_KEY))
+                .put(ORIGINAL_DURATION_MILLIS_KEY,
+                        timer.getPropertyLong(ORIGINAL_DURATION_MILLIS_KEY));
 
         int timerStatus = (int) timer.getPropertyLong(STATUS_KEY);
         switch (timerStatus) {
@@ -126,7 +134,7 @@
 
         if (timerStatus == Timer.STATUS_STARTED) {
             long startTime = timer.getPropertyLong(START_TIME_MILLIS_KEY);
-            long remainingTime = timer.getPropertyLong(REMAINING_TIME_MILLIS_KEY);
+            long remainingTime = timer.getPropertyLong(REMAINING_TIME_MILLIS_SINCE_UPDATE_KEY);
 
             long expireTime = remainingTime + startTime;
             indexableBuilder.put(EXPIRE_TIME_KEY,
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index b9e5de9..553856cc 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1311,7 +1311,7 @@
     method public static androidx.core.graphics.Insets of(android.graphics.Rect);
     method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
     method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
-    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
     field public static final androidx.core.graphics.Insets NONE;
     field public final int bottom;
     field public final int left;
@@ -1350,7 +1350,7 @@
     method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
     method public static void clearColorFilter(android.graphics.drawable.Drawable);
     method public static int getAlpha(android.graphics.drawable.Drawable);
-    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
     method public static int getLayoutDirection(android.graphics.drawable.Drawable);
     method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
     method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
@@ -1363,20 +1363,20 @@
     method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
     method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
     method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
   }
 
   public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
     method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
     method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
     method @IdRes public int getResId();
     method public String getResPackage();
     method public int getType();
@@ -1384,9 +1384,9 @@
     method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
     method public void onPostParceling();
     method public void onPreParceling(boolean);
-    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
-    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
-    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
     method public android.os.Bundle toBundle();
     method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
     method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 3261120..41925b2 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -1311,7 +1311,7 @@
     method public static androidx.core.graphics.Insets of(android.graphics.Rect);
     method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
     method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
-    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
     field public static final androidx.core.graphics.Insets NONE;
     field public final int bottom;
     field public final int left;
@@ -1350,7 +1350,7 @@
     method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
     method public static void clearColorFilter(android.graphics.drawable.Drawable);
     method public static int getAlpha(android.graphics.drawable.Drawable);
-    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
     method public static int getLayoutDirection(android.graphics.drawable.Drawable);
     method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
     method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
@@ -1363,20 +1363,20 @@
     method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
     method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
     method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
   }
 
   public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
     method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
     method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
     method @IdRes public int getResId();
     method public String getResPackage();
     method public int getType();
@@ -1384,9 +1384,9 @@
     method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
     method public void onPostParceling();
     method public void onPreParceling(boolean);
-    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
-    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
-    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
     method public android.os.Bundle toBundle();
     method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
     method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index f39b4fe..f8684f8 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -1532,7 +1532,7 @@
     method public static androidx.core.graphics.Insets of(android.graphics.Rect);
     method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
     method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
-    method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
     method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
     field public static final androidx.core.graphics.Insets NONE;
     field public final int bottom;
@@ -1604,12 +1604,12 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
-    method public static void closeQuietly(java.io.Closeable!);
-    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context!, android.content.res.Resources!, int);
-    method public static boolean copyToFile(java.io.File!, java.io.InputStream!);
-    method public static boolean copyToFile(java.io.File!, android.content.res.Resources!, int);
-    method public static java.io.File? getTempFile(android.content.Context!);
-    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context!, android.os.CancellationSignal!, android.net.Uri!);
+    method public static void closeQuietly(java.io.Closeable?);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context, android.content.res.Resources, int);
+    method public static boolean copyToFile(java.io.File, java.io.InputStream);
+    method public static boolean copyToFile(java.io.File, android.content.res.Resources, int);
+    method public static java.io.File? getTempFile(android.content.Context);
+    method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context, android.os.CancellationSignal?, android.net.Uri);
   }
 
 }
@@ -1621,7 +1621,7 @@
     method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
     method public static void clearColorFilter(android.graphics.drawable.Drawable);
     method public static int getAlpha(android.graphics.drawable.Drawable);
-    method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
     method public static int getLayoutDirection(android.graphics.drawable.Drawable);
     method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
     method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
@@ -1634,7 +1634,7 @@
     method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
     method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
     method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
   }
 
   @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
@@ -1644,15 +1644,15 @@
     method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
     method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
     method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
     method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
-    method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.res.Resources!, String!, @DrawableRes int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
+    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
+    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
+    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.res.Resources?, String, @DrawableRes int);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
     method @IdRes public int getResId();
     method public String getResPackage();
@@ -1660,9 +1660,9 @@
     method public android.net.Uri getUri();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.io.InputStream? getUriInputStream(android.content.Context);
     method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
-    method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
-    method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
-    method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
+    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
+    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
     method public android.os.Bundle toBundle();
     method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
     method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index 79623f4..c1c27b8 100644
--- a/core/core/lint-baseline.xml
+++ b/core/core/lint-baseline.xml
@@ -3490,193 +3490,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                     ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                                       ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (!Objects.equals(foreground.getModel(), background.getModel())) {"
-        errorLine2="                                                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="92"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    &quot;Color models must match (&quot; + foreground.getModel() + &quot; vs. &quot;"
-        errorLine2="                                                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="94"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            + background.getModel() + &quot;)&quot;);"
-        errorLine2="                                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="95"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())"
-        errorLine2="                                                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="98"
-            column="73"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                : foreground.convert(background.getColorSpace());"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="100"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                : foreground.convert(background.getColorSpace());"
-        errorLine2="                                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="100"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float[] src = s.getComponents();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="102"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float[] dst = background.getComponents();"
-        errorLine2="                                 ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="103"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float sa = s.alpha();"
-        errorLine2="                     ~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="105"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float da = background.alpha() * (1.0f - sa);"
-        errorLine2="                              ~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="107"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        int ai = background.getComponentCount() - 1;"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="111"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
-        errorLine2="                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="127"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return Color.valueOf(dst, background.getColorSpace());"
-        errorLine2="                                             ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/ColorUtils.java"
-            line="127"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 24; however, the containing class androidx.core.os.ConfigurationCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return LocaleListCompat.wrap(configuration.getLocales());"
         errorLine2="                                                       ~~~~~~~~~~">
@@ -4282,204 +4095,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithBitmap((Bitmap) mObj1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="546"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmap((Bitmap) mObj1);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="550"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithBitmap("
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="552"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithResource(getResPackage(), mInt1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="557"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithData((byte[]) mObj1, mInt1, mInt2);"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="560"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                icon = Icon.createWithContentUri((String) mObj1);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="563"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmapContentUri(getUri());"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="567"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="580"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon("
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="582"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            icon.setTintList(mTintList);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="590"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            icon.setTintMode(mTintMode);"
-        errorLine2="                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="593"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return toIcon(context).loadDrawable(context);"
-        errorLine2="                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="641"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        return new AdaptiveIconDrawable(null,"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="694"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getType();"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1101"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getResPackage();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1129"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getResId();"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1158"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.drawable.IconCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return icon.getUri();"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
-            line="1186"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.graphics.Insets is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return android.graphics.Insets.of(left, top, right, bottom);"
-        errorLine2="                                       ~~">
-        <location
-            file="src/main/java/androidx/core/graphics/Insets.java"
-            line="198"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 24; however, the containing class androidx.core.os.LocaleListCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return wrap(new LocaleList(localeList));"
         errorLine2="                        ~~~~~~~~~~~~~~">
@@ -7087,39 +6702,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.PaintCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return paint.hasGlyph(string);"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PaintCompat.java"
-            line="52"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.graphics.PaintCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            paint.setBlendMode(blendMode != null ? obtainBlendModeFromCompat(blendMode) : null);"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PaintCompat.java"
-            line="127"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.PathUtils is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        float[] pathData = path.approximate(error);"
-        errorLine2="                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/PathUtils.java"
-            line="60"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 21; however, the containing class androidx.core.app.Person is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                .setName(bundle.getString(NAME_KEY))"
         errorLine2="                                ~~~~~~~~~">
@@ -9507,17 +9089,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.TypefaceCompatUtil is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, &quot;r&quot;, cancellationSignal)) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
-            line="110"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 23; however, the containing class androidx.core.os.UserManagerCompat is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            return context.getSystemService(UserManager.class).isUserUnlocked();"
         errorLine2="                           ~~~~~~~~~~~~~~~~">
diff --git a/core/core/src/androidTest/java/androidx/core/database/sqlite/SQLiteCursorCompatTest.java b/core/core/src/androidTest/java/androidx/core/database/sqlite/SQLiteCursorCompatTest.java
index b06bc3c..1a78245 100644
--- a/core/core/src/androidTest/java/androidx/core/database/sqlite/SQLiteCursorCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/database/sqlite/SQLiteCursorCompatTest.java
@@ -18,11 +18,8 @@
 
 import static org.junit.Assert.assertTrue;
 
-import android.database.Cursor;
 import android.database.sqlite.SQLiteCursor;
-import android.database.sqlite.SQLiteCursorDriver;
 import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQuery;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
@@ -36,18 +33,14 @@
     @Test
     public void setFillWindowForwardOnly() {
         final Boolean[] calledSetter = { false };
-        SQLiteDatabase db = SQLiteDatabase.create(new SQLiteDatabase.CursorFactory() {
-            @Override
-            public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver primaryQuery,
-                    String editTable, SQLiteQuery query) {
-                SQLiteCursor cursor = new SQLiteCursor(primaryQuery, editTable, query);
-                SQLiteCursorCompat.setFillWindowForwardOnly(cursor, true);
+        SQLiteDatabase db = SQLiteDatabase.create((db1, primaryQuery, editTable, query) -> {
+            SQLiteCursor cursor = new SQLiteCursor(primaryQuery, editTable, query);
+            SQLiteCursorCompat.setFillWindowForwardOnly(cursor, true);
 
-                // no easy way to read whether setter worked, so
-                // we just validate it can be called successfully
-                calledSetter[0] = true;
-                return cursor;
-            }
+            // no easy way to read whether setter worked, so
+            // we just validate it can be called successfully
+            calledSetter[0] = true;
+            return cursor;
         });
         db.execSQL("CREATE TABLE foo (num INTEGER);");
         db.query("foo", new String[] {"*"}, null, null, null, null, null);
diff --git a/core/core/src/androidTest/java/androidx/core/graphics/BlendModeColorFilterCompatTest.java b/core/core/src/androidTest/java/androidx/core/graphics/BlendModeColorFilterCompatTest.java
index facc1a3..a1222df 100644
--- a/core/core/src/androidTest/java/androidx/core/graphics/BlendModeColorFilterCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/graphics/BlendModeColorFilterCompatTest.java
@@ -21,8 +21,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import android.graphics.BlendMode;
-import android.graphics.BlendModeColorFilter;
 import android.graphics.Color;
 import android.graphics.ColorFilter;
 import android.graphics.PorterDuff;
@@ -37,22 +35,11 @@
 import org.junit.runner.RunWith;
 
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(maxSdkVersion = 28)
 @SmallTest
 public class BlendModeColorFilterCompatTest {
 
     @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
-    public void testNullBlendModeRemovesBlendModeColorFilter() {
-        ColorFilter filter = createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.CLEAR);
-        assertTrue(filter instanceof BlendModeColorFilter);
-
-        BlendModeColorFilter blendModeFilter = (BlendModeColorFilter) filter;
-        assertEquals(Color.RED, blendModeFilter.getColor());
-        assertEquals(BlendMode.CLEAR, blendModeFilter.getMode());
-    }
-
-    @Test
-    @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P)
     public void testNullBlendModeRemovesPorterDuffColorFilter() {
         ColorFilter filter = createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.CLEAR);
         assertTrue(filter instanceof PorterDuffColorFilter);
diff --git a/core/core/src/androidTest/java/androidx/core/graphics/BlendModeColorFilterCompatTestApi29.java b/core/core/src/androidTest/java/androidx/core/graphics/BlendModeColorFilterCompatTestApi29.java
new file mode 100644
index 0000000..b0ad3b0
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/graphics/BlendModeColorFilterCompatTestApi29.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.core.graphics;
+
+import static androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.graphics.BlendMode;
+import android.graphics.BlendModeColorFilter;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 29)
+@SmallTest
+public class BlendModeColorFilterCompatTestApi29 {
+
+    @Test
+    public void testNullBlendModeRemovesBlendModeColorFilter() {
+        ColorFilter filter = createBlendModeColorFilterCompat(Color.RED, BlendModeCompat.CLEAR);
+        assertTrue(filter instanceof BlendModeColorFilter);
+
+        BlendModeColorFilter blendModeFilter = (BlendModeColorFilter) filter;
+        assertEquals(Color.RED, blendModeFilter.getColor());
+        assertEquals(BlendMode.CLEAR, blendModeFilter.getMode());
+    }
+}
diff --git a/core/core/src/androidTest/java/androidx/core/graphics/PaintTest.java b/core/core/src/androidTest/java/androidx/core/graphics/PaintTest.java
index f6858e3..acbb9cf 100644
--- a/core/core/src/androidTest/java/androidx/core/graphics/PaintTest.java
+++ b/core/core/src/androidTest/java/androidx/core/graphics/PaintTest.java
@@ -17,17 +17,16 @@
 package androidx.core.graphics;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import android.graphics.BlendMode;
+import android.annotation.SuppressLint;
 import android.graphics.Paint;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Xfermode;
-import android.os.Build;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SdkSuppress;
@@ -37,45 +36,12 @@
 import org.junit.runner.RunWith;
 
 @RunWith(AndroidJUnit4.class)
+@SdkSuppress(maxSdkVersion = 28)
 @SmallTest
 public class PaintTest {
 
+    @SuppressLint("NewApi") // due to BlendModeCompat's RequiresApi annotations
     @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
-    public void testBlendModeCompatMatchesPlatform() {
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.CLEAR, BlendMode.CLEAR);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC, BlendMode.SRC);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST, BlendMode.DST);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_OVER, BlendMode.SRC_OVER);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_OVER, BlendMode.DST_OVER);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_IN, BlendMode.SRC_IN);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_IN, BlendMode.DST_IN);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_OUT, BlendMode.SRC_OUT);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_OUT, BlendMode.DST_OUT);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_ATOP, BlendMode.SRC_ATOP);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_ATOP, BlendMode.DST_ATOP);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.XOR, BlendMode.XOR);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.PLUS, BlendMode.PLUS);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.MODULATE, BlendMode.MODULATE);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SCREEN, BlendMode.SCREEN);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.OVERLAY, BlendMode.OVERLAY);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DARKEN, BlendMode.DARKEN);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.LIGHTEN, BlendMode.LIGHTEN);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.COLOR_DODGE, BlendMode.COLOR_DODGE);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.COLOR_BURN, BlendMode.COLOR_BURN);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.HARD_LIGHT, BlendMode.HARD_LIGHT);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SOFT_LIGHT, BlendMode.SOFT_LIGHT);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DIFFERENCE, BlendMode.DIFFERENCE);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.EXCLUSION, BlendMode.EXCLUSION);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.MULTIPLY, BlendMode.MULTIPLY);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.HUE, BlendMode.HUE);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SATURATION, BlendMode.SATURATION);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.COLOR, BlendMode.COLOR);
-        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.LUMINOSITY, BlendMode.LUMINOSITY);
-    }
-
-    @Test
-    @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P)
     public void testBlendModeCompatMatchesPorterDuff() {
         verifyPorterDuffMatchesCompat(BlendModeCompat.CLEAR, PorterDuff.Mode.CLEAR);
         verifyPorterDuffMatchesCompat(BlendModeCompat.SRC, PorterDuff.Mode.SRC);
@@ -113,19 +79,6 @@
     }
 
     @Test
-    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
-    public void testNullBlendModeRemovesBlendMode() {
-        Paint p = new Paint();
-        assertTrue(PaintCompat.setBlendMode(p, BlendModeCompat.CLEAR));
-        assertEquals(BlendMode.CLEAR, p.getBlendMode());
-
-        assertTrue(PaintCompat.setBlendMode(p, null));
-        assertNull(p.getBlendMode());
-    }
-
-
-    @Test
-    @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.P)
     public void testNullBlendModeRemovesXfermode() {
         Paint p = new Paint();
         assertTrue(PaintCompat.setBlendMode(p, BlendModeCompat.CLEAR));
@@ -135,19 +88,6 @@
     }
 
     /**
-     * Helper test class to hide usages of new APIs and avoid ClassNotFoundExceptions
-     * in tests
-     */
-    private static class TestHelper {
-        private static void verifyBlendModeMatchesCompat(@NonNull BlendModeCompat compat,
-                                                         @NonNull BlendMode blendMode) {
-            Paint p = new Paint();
-            PaintCompat.setBlendMode(p, compat);
-            assertEquals(blendMode, p.getBlendMode());
-        }
-    }
-
-    /**
      * Helper method to verify that the provided {@link BlendModeCompat} instance
      * matches the given {@link PorterDuff.Mode} which may be null if there is no
      * equivalent PorterDuff.Mode for the BlendMode
@@ -159,7 +99,7 @@
         if (compat != null && mode == null) {
             // If there is not a compatible PorterDuff mode for this BlendMode, configuration
             // of the blend mode should return false
-            assertTrue(!result);
+            assertFalse(result);
         } else if (compat != null) {
             // .. otherwise if there is a corresponding PorterDuff mode with the given BlendMode
             // then the assignment should complete successfully
diff --git a/core/core/src/androidTest/java/androidx/core/graphics/PaintTestApi29.java b/core/core/src/androidTest/java/androidx/core/graphics/PaintTestApi29.java
new file mode 100644
index 0000000..df91c96
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/graphics/PaintTestApi29.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * 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 androidx.core.graphics;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.graphics.BlendMode;
+import android.graphics.Paint;
+
+import androidx.annotation.NonNull;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 29)
+@SmallTest
+public class PaintTestApi29 {
+
+    @Test
+    public void testBlendModeCompatMatchesPlatform() {
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.CLEAR, BlendMode.CLEAR);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC, BlendMode.SRC);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST, BlendMode.DST);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_OVER, BlendMode.SRC_OVER);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_OVER, BlendMode.DST_OVER);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_IN, BlendMode.SRC_IN);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_IN, BlendMode.DST_IN);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_OUT, BlendMode.SRC_OUT);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_OUT, BlendMode.DST_OUT);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SRC_ATOP, BlendMode.SRC_ATOP);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DST_ATOP, BlendMode.DST_ATOP);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.XOR, BlendMode.XOR);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.PLUS, BlendMode.PLUS);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.MODULATE, BlendMode.MODULATE);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SCREEN, BlendMode.SCREEN);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.OVERLAY, BlendMode.OVERLAY);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DARKEN, BlendMode.DARKEN);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.LIGHTEN, BlendMode.LIGHTEN);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.COLOR_DODGE, BlendMode.COLOR_DODGE);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.COLOR_BURN, BlendMode.COLOR_BURN);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.HARD_LIGHT, BlendMode.HARD_LIGHT);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SOFT_LIGHT, BlendMode.SOFT_LIGHT);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.DIFFERENCE, BlendMode.DIFFERENCE);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.EXCLUSION, BlendMode.EXCLUSION);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.MULTIPLY, BlendMode.MULTIPLY);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.HUE, BlendMode.HUE);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.SATURATION, BlendMode.SATURATION);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.COLOR, BlendMode.COLOR);
+        TestHelper.verifyBlendModeMatchesCompat(BlendModeCompat.LUMINOSITY, BlendMode.LUMINOSITY);
+    }
+
+    @Test
+    public void testNullBlendModeRemovesBlendMode() {
+        Paint p = new Paint();
+        assertTrue(PaintCompat.setBlendMode(p, BlendModeCompat.CLEAR));
+        assertEquals(BlendMode.CLEAR, p.getBlendMode());
+
+        assertTrue(PaintCompat.setBlendMode(p, null));
+        assertNull(p.getBlendMode());
+    }
+
+    /**
+     * Helper test class to hide usages of new APIs and avoid ClassNotFoundExceptions
+     * in tests
+     */
+    private static class TestHelper {
+        private static void verifyBlendModeMatchesCompat(@NonNull BlendModeCompat compat,
+                                                         @NonNull BlendMode blendMode) {
+            Paint p = new Paint();
+            PaintCompat.setBlendMode(p, compat);
+            assertEquals(blendMode, p.getBlendMode());
+        }
+    }
+}
diff --git a/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java b/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java
index c59abd0..17a6041 100644
--- a/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/location/LocationManagerCompatTest.java
@@ -35,18 +35,15 @@
 import androidx.core.os.CancellationSignal;
 import androidx.core.os.ExecutorCompat;
 import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
 /**
  * Test for {@link androidx.core.location.LocationManagerCompat}.
  */
 @SmallTest
-@RunWith(AndroidJUnit4.class)
 public class LocationManagerCompatTest {
 
     private Context mContext;
@@ -61,9 +58,9 @@
     @Test
     public void testIsLocationEnabled() {
         boolean isLocationEnabled;
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+        if (Build.VERSION.SDK_INT >= 28) {
             isLocationEnabled = mLocationManager.isLocationEnabled();
-        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+        } else if (Build.VERSION.SDK_INT >= 19) {
             isLocationEnabled = Settings.Secure.getInt(mContext.getContentResolver(), LOCATION_MODE,
                     LOCATION_MODE_OFF) != LOCATION_MODE_OFF;
         } else {
diff --git a/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTest.java b/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTest.java
index 5d4e4aa..157dbad 100644
--- a/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTest.java
@@ -20,38 +20,15 @@
 import static androidx.core.location.LocationRequestCompat.QUALITY_BALANCED_POWER_ACCURACY;
 import static androidx.core.location.LocationRequestCompat.QUALITY_HIGH_ACCURACY;
 
-import static com.google.common.truth.Truth.assertThat;
-
 import static org.junit.Assert.assertEquals;
 
-import android.annotation.TargetApi;
-import android.location.LocationRequest;
-import android.os.Build.VERSION;
-import android.os.SystemClock;
-
-import androidx.annotation.RequiresApi;
-import androidx.core.util.Preconditions;
-import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
-import com.google.common.collect.Range;
-
 import org.junit.Test;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
 @SmallTest
 public class LocationRequestCompatTest {
 
-    private static Method sGetProviderMethod;
-    private static Method sGetIntervalMethod;
-    private static Method sGetFastestIntervalMethod;
-    private static Method sGetExpireAtMethod;
-    private static Method sGetExpireInMethod;
-    private static Method sGetNumUpdatesMethod;
-    private static Method sGetSmallestDisplacementMethod;
-
     @Test
     public void testBuilder() {
         LocationRequestCompat.Builder builder = new LocationRequestCompat.Builder(0);
@@ -95,177 +72,4 @@
         builder.setMinUpdateIntervalMillis(0);
         assertEquals(PASSIVE_INTERVAL, builder.build().getIntervalMillis());
     }
-
-    @SdkSuppress(minSdkVersion = 19, maxSdkVersion = 30)
-    @TargetApi(31)
-    @Test
-    public void testConversion_19Plus() throws Exception {
-        LocationRequestCompat.Builder builder = new LocationRequestCompat.Builder(0);
-
-        assertEquals("test", getProvider(builder.build().toLocationRequest("test")));
-        assertEquals(QUALITY_BALANCED_POWER_ACCURACY,
-                builder.build().toLocationRequest("test").getQuality());
-        assertEquals(0, getInterval(builder.build().toLocationRequest("test")));
-        assertEquals(0, getFastestInterval(builder.build().toLocationRequest("test")));
-        assertEquals(Long.MAX_VALUE, getExpireAt(builder.build().toLocationRequest("test")));
-        assertEquals(Integer.MAX_VALUE, getNumUpdates(builder.build().toLocationRequest("test")));
-        assertEquals(0, getSmallestDisplacement(builder.build().toLocationRequest("test")), 0);
-
-        builder.setQuality(QUALITY_HIGH_ACCURACY);
-        assertEquals(QUALITY_HIGH_ACCURACY, builder.build().toLocationRequest("test").getQuality());
-
-        builder.setIntervalMillis(1000);
-        assertEquals(1000, getInterval(builder.build().toLocationRequest("test")));
-
-        builder.setMinUpdateIntervalMillis(1500);
-        assertEquals(1000, getFastestInterval(builder.build().toLocationRequest("test")));
-
-        builder.setMinUpdateIntervalMillis(500);
-        assertEquals(500, getFastestInterval(builder.build().toLocationRequest("test")));
-
-        builder.clearMinUpdateIntervalMillis();
-        assertEquals(1000, getFastestInterval(builder.build().toLocationRequest("test")));
-
-        builder.setDurationMillis(1);
-        if (VERSION.SDK_INT < 30) {
-            long time = SystemClock.elapsedRealtime();
-            assertThat(getExpireAt(builder.build().toLocationRequest("test"))).isIn(
-                    Range.closed(time - 100, time + 100));
-        } else {
-            assertThat(getExpireIn(builder.build().toLocationRequest("test"))).isEqualTo(1);
-        }
-
-        builder.setMaxUpdates(1);
-        assertEquals(1, getNumUpdates(builder.build().toLocationRequest("test")));
-
-        builder.setMinUpdateDistanceMeters(10);
-        assertEquals(10, getSmallestDisplacement(builder.build().toLocationRequest("test")), 0);
-    }
-
-    @SdkSuppress(minSdkVersion = 31)
-    @Test
-    public void testConversion_31Plus() {
-        LocationRequestCompat.Builder builder = new LocationRequestCompat.Builder(0);
-
-        assertEquals(QUALITY_BALANCED_POWER_ACCURACY,
-                builder.build().toLocationRequest().getQuality());
-        assertEquals(0, builder.build().toLocationRequest().getIntervalMillis());
-        assertEquals(0, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
-        assertEquals(Long.MAX_VALUE, builder.build().toLocationRequest().getDurationMillis());
-        assertEquals(Integer.MAX_VALUE, builder.build().toLocationRequest().getMaxUpdates());
-        assertEquals(0, builder.build().toLocationRequest().getMinUpdateDistanceMeters(), 0);
-        assertEquals(0, builder.build().toLocationRequest().getMaxUpdateDelayMillis());
-
-        builder.setQuality(QUALITY_HIGH_ACCURACY);
-        assertEquals(QUALITY_HIGH_ACCURACY, builder.build().toLocationRequest().getQuality());
-
-        builder.setIntervalMillis(1000);
-        assertEquals(1000, builder.build().toLocationRequest().getIntervalMillis());
-
-        builder.setMinUpdateIntervalMillis(1500);
-        assertEquals(1000, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
-
-        builder.setMinUpdateIntervalMillis(500);
-        assertEquals(500, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
-
-        builder.clearMinUpdateIntervalMillis();
-        assertEquals(1000, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
-
-        builder.setDurationMillis(1);
-        assertEquals(1, builder.build().toLocationRequest().getDurationMillis());
-
-        builder.setMaxUpdates(1);
-        assertEquals(1, builder.build().toLocationRequest().getMaxUpdates());
-
-        builder.setMinUpdateDistanceMeters(10);
-        assertEquals(10, builder.build().toLocationRequest().getMinUpdateDistanceMeters(), 0);
-
-        builder.setMaxUpdateDelayMillis(10000);
-        assertEquals(10000, builder.build().toLocationRequest().getMaxUpdateDelayMillis());
-
-        builder.setMinUpdateIntervalMillis(1000);
-        builder.setIntervalMillis(PASSIVE_INTERVAL);
-        assertEquals(PASSIVE_INTERVAL,
-                builder.build().toLocationRequest().getIntervalMillis());
-    }
-
-    @TargetApi(31)
-    private static String getProvider(LocationRequest request)
-            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-        if (sGetProviderMethod == null) {
-            sGetProviderMethod = LocationRequest.class.getDeclaredMethod("getProvider");
-            sGetProviderMethod.setAccessible(true);
-        }
-
-        return (String) sGetProviderMethod.invoke(request);
-    }
-
-    @TargetApi(31)
-    private static long getInterval(LocationRequest request)
-            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-        if (sGetIntervalMethod == null) {
-            sGetIntervalMethod = LocationRequest.class.getDeclaredMethod("getInterval");
-            sGetIntervalMethod.setAccessible(true);
-        }
-
-        return (Long) Preconditions.checkNotNull(sGetIntervalMethod.invoke(request));
-    }
-
-    @TargetApi(31)
-    private static long getFastestInterval(LocationRequest request)
-            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-        if (sGetFastestIntervalMethod == null) {
-            sGetFastestIntervalMethod = LocationRequest.class.getDeclaredMethod(
-                    "getFastestInterval");
-            sGetFastestIntervalMethod.setAccessible(true);
-        }
-
-        return (Long) Preconditions.checkNotNull(sGetFastestIntervalMethod.invoke(request));
-    }
-
-    @TargetApi(31)
-    private static long getExpireAt(LocationRequest request)
-            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-        if (sGetExpireAtMethod == null) {
-            sGetExpireAtMethod = LocationRequest.class.getDeclaredMethod("getExpireAt");
-            sGetExpireAtMethod.setAccessible(true);
-        }
-
-        return (Long) Preconditions.checkNotNull(sGetExpireAtMethod.invoke(request));
-    }
-
-    @RequiresApi(30)
-    @TargetApi(31)
-    private static long getExpireIn(LocationRequest request)
-            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-        if (sGetExpireInMethod == null) {
-            sGetExpireInMethod = LocationRequest.class.getDeclaredMethod("getExpireIn");
-            sGetExpireInMethod.setAccessible(true);
-        }
-
-        return (Long) Preconditions.checkNotNull(sGetExpireInMethod.invoke(request));
-    }
-
-    @TargetApi(31)
-    private static int getNumUpdates(LocationRequest request)
-            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-        if (sGetNumUpdatesMethod == null) {
-            sGetNumUpdatesMethod = LocationRequest.class.getDeclaredMethod("getNumUpdates");
-            sGetNumUpdatesMethod.setAccessible(true);
-        }
-
-        return (Integer) Preconditions.checkNotNull(sGetNumUpdatesMethod.invoke(request));
-    }
-
-    @TargetApi(31)
-    private static float getSmallestDisplacement(LocationRequest request)
-            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
-        if (sGetSmallestDisplacementMethod == null) {
-            sGetSmallestDisplacementMethod = LocationRequest.class.getDeclaredMethod(
-                    "getSmallestDisplacement");
-            sGetSmallestDisplacementMethod.setAccessible(true);
-        }
-
-        return (Float) Preconditions.checkNotNull(sGetSmallestDisplacementMethod.invoke(request));
-    }
 }
diff --git a/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTestApi19.java b/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTestApi19.java
new file mode 100644
index 0000000..d57c261
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTestApi19.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.core.location;
+
+import static androidx.core.location.LocationRequestCompat.QUALITY_BALANCED_POWER_ACCURACY;
+import static androidx.core.location.LocationRequestCompat.QUALITY_HIGH_ACCURACY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+
+import android.annotation.TargetApi;
+import android.location.LocationRequest;
+import android.os.Build;
+import android.os.Build.VERSION;
+import android.os.SystemClock;
+
+import androidx.annotation.DoNotInline;
+import androidx.annotation.RequiresApi;
+import androidx.core.util.Preconditions;
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import com.google.common.collect.Range;
+
+import org.junit.Test;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Objects;
+
+@SuppressWarnings("JavaReflectionMemberAccess")
+@SmallTest
+@TargetApi(31) // Suppress NewApi since APIs are @hide at API levels 19 through 30
+@SdkSuppress(minSdkVersion = 19, maxSdkVersion = 30)
+public class LocationRequestCompatTestApi19 {
+    private static Method sGetProviderMethod;
+    private static Method sGetIntervalMethod;
+    private static Method sGetFastestIntervalMethod;
+    private static Method sGetExpireAtMethod;
+    private static Method sGetExpireInMethod;
+    private static Method sGetNumUpdatesMethod;
+    private static Method sGetSmallestDisplacementMethod;
+
+    @Test
+    public void testConversion() throws Exception {
+        LocationRequestCompat.Builder builder = new LocationRequestCompat.Builder(0);
+
+        assertEquals("test", getProvider(builder.build().toLocationRequest("test")));
+        assertEquals(QUALITY_BALANCED_POWER_ACCURACY, Objects.requireNonNull(
+                builder.build().toLocationRequest("test")).getQuality());
+        assertEquals(0, getInterval(builder.build().toLocationRequest("test")));
+        assertEquals(0, getFastestInterval(builder.build().toLocationRequest("test")));
+        assertEquals(Long.MAX_VALUE, getExpireAt(builder.build().toLocationRequest("test")));
+        assertEquals(Integer.MAX_VALUE, getNumUpdates(builder.build().toLocationRequest("test")));
+        assertEquals(0, getSmallestDisplacement(builder.build().toLocationRequest("test")), 0);
+
+        builder.setQuality(QUALITY_HIGH_ACCURACY);
+        assertEquals(QUALITY_HIGH_ACCURACY, Objects.requireNonNull(
+                builder.build().toLocationRequest("test")).getQuality());
+
+        builder.setIntervalMillis(1000);
+        assertEquals(1000, getInterval(builder.build().toLocationRequest("test")));
+
+        builder.setMinUpdateIntervalMillis(1500);
+        assertEquals(1000, getFastestInterval(builder.build().toLocationRequest("test")));
+
+        builder.setMinUpdateIntervalMillis(500);
+        assertEquals(500, getFastestInterval(builder.build().toLocationRequest("test")));
+
+        builder.clearMinUpdateIntervalMillis();
+        assertEquals(1000, getFastestInterval(builder.build().toLocationRequest("test")));
+
+        builder.setDurationMillis(1);
+        if (VERSION.SDK_INT < 30) {
+            long time = SystemClock.elapsedRealtime();
+            assertThat(getExpireAt(builder.build().toLocationRequest("test"))).isIn(
+                    Range.closed(time - 100, time + 100));
+        } else {
+            assertThat(Api30Impl.getExpireIn(
+                    builder.build().toLocationRequest("test"))).isEqualTo(1);
+        }
+
+        builder.setMaxUpdates(1);
+        assertEquals(1, getNumUpdates(builder.build().toLocationRequest("test")));
+
+        builder.setMinUpdateDistanceMeters(10);
+        assertEquals(10, getSmallestDisplacement(builder.build().toLocationRequest("test")), 0);
+    }
+
+    private static String getProvider(LocationRequest request)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        if (sGetProviderMethod == null) {
+            sGetProviderMethod = LocationRequest.class.getDeclaredMethod("getProvider");
+            sGetProviderMethod.setAccessible(true);
+        }
+
+        return (String) sGetProviderMethod.invoke(request);
+    }
+
+    private static long getInterval(LocationRequest request)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        if (sGetIntervalMethod == null) {
+            sGetIntervalMethod = LocationRequest.class.getDeclaredMethod("getInterval");
+            sGetIntervalMethod.setAccessible(true);
+        }
+
+        return (Long) Preconditions.checkNotNull(sGetIntervalMethod.invoke(request));
+    }
+
+    private static long getFastestInterval(LocationRequest request)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        if (sGetFastestIntervalMethod == null) {
+            sGetFastestIntervalMethod = LocationRequest.class.getDeclaredMethod(
+                    "getFastestInterval");
+            sGetFastestIntervalMethod.setAccessible(true);
+        }
+
+        return (Long) Preconditions.checkNotNull(sGetFastestIntervalMethod.invoke(request));
+    }
+
+    private static long getExpireAt(LocationRequest request)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        if (sGetExpireAtMethod == null) {
+            sGetExpireAtMethod = LocationRequest.class.getDeclaredMethod("getExpireAt");
+            sGetExpireAtMethod.setAccessible(true);
+        }
+
+        return (Long) Preconditions.checkNotNull(sGetExpireAtMethod.invoke(request));
+    }
+
+    private static int getNumUpdates(LocationRequest request)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        if (sGetNumUpdatesMethod == null) {
+            sGetNumUpdatesMethod = LocationRequest.class.getDeclaredMethod("getNumUpdates");
+            sGetNumUpdatesMethod.setAccessible(true);
+        }
+
+        return (Integer) Preconditions.checkNotNull(sGetNumUpdatesMethod.invoke(request));
+    }
+
+    private static float getSmallestDisplacement(LocationRequest request)
+            throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+        if (sGetSmallestDisplacementMethod == null) {
+            sGetSmallestDisplacementMethod = LocationRequest.class.getDeclaredMethod(
+                    "getSmallestDisplacement");
+            sGetSmallestDisplacementMethod.setAccessible(true);
+        }
+
+        return (Float) Preconditions.checkNotNull(sGetSmallestDisplacementMethod.invoke(request));
+    }
+
+    @RequiresApi(30)
+    static class Api30Impl {
+        private  Api30Impl() {
+            // This class is not instantiable.
+        }
+
+        @RequiresApi(Build.VERSION_CODES.S) // Work around a bug in NewApi check.
+        @DoNotInline
+        private static long getExpireIn(LocationRequest request)
+                throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+            if (sGetExpireInMethod == null) {
+                sGetExpireInMethod = LocationRequest.class.getDeclaredMethod("getExpireIn");
+                sGetExpireInMethod.setAccessible(true);
+            }
+
+            return (Long) Preconditions.checkNotNull(sGetExpireInMethod.invoke(request));
+        }
+    }
+}
diff --git a/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTestApi31.java b/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTestApi31.java
new file mode 100644
index 0000000..3880b212
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/location/LocationRequestCompatTestApi31.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.core.location;
+
+import static androidx.core.location.LocationRequestCompat.PASSIVE_INTERVAL;
+import static androidx.core.location.LocationRequestCompat.QUALITY_BALANCED_POWER_ACCURACY;
+import static androidx.core.location.LocationRequestCompat.QUALITY_HIGH_ACCURACY;
+
+import static org.junit.Assert.assertEquals;
+
+import androidx.test.filters.SdkSuppress;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+@SdkSuppress(minSdkVersion = 31)
+@SmallTest
+public class LocationRequestCompatTestApi31 {
+
+    @Test
+    public void testConversion() {
+        LocationRequestCompat.Builder builder = new LocationRequestCompat.Builder(0);
+
+        assertEquals(QUALITY_BALANCED_POWER_ACCURACY,
+                builder.build().toLocationRequest().getQuality());
+        assertEquals(0, builder.build().toLocationRequest().getIntervalMillis());
+        assertEquals(0, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
+        assertEquals(Long.MAX_VALUE, builder.build().toLocationRequest().getDurationMillis());
+        assertEquals(Integer.MAX_VALUE, builder.build().toLocationRequest().getMaxUpdates());
+        assertEquals(0, builder.build().toLocationRequest().getMinUpdateDistanceMeters(), 0);
+        assertEquals(0, builder.build().toLocationRequest().getMaxUpdateDelayMillis());
+
+        builder.setQuality(QUALITY_HIGH_ACCURACY);
+        assertEquals(QUALITY_HIGH_ACCURACY, builder.build().toLocationRequest().getQuality());
+
+        builder.setIntervalMillis(1000);
+        assertEquals(1000, builder.build().toLocationRequest().getIntervalMillis());
+
+        builder.setMinUpdateIntervalMillis(1500);
+        assertEquals(1000, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
+
+        builder.setMinUpdateIntervalMillis(500);
+        assertEquals(500, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
+
+        builder.clearMinUpdateIntervalMillis();
+        assertEquals(1000, builder.build().toLocationRequest().getMinUpdateIntervalMillis());
+
+        builder.setDurationMillis(1);
+        assertEquals(1, builder.build().toLocationRequest().getDurationMillis());
+
+        builder.setMaxUpdates(1);
+        assertEquals(1, builder.build().toLocationRequest().getMaxUpdates());
+
+        builder.setMinUpdateDistanceMeters(10);
+        assertEquals(10, builder.build().toLocationRequest().getMinUpdateDistanceMeters(), 0);
+
+        builder.setMaxUpdateDelayMillis(10000);
+        assertEquals(10000, builder.build().toLocationRequest().getMaxUpdateDelayMillis());
+
+        builder.setMinUpdateIntervalMillis(1000);
+        builder.setIntervalMillis(PASSIVE_INTERVAL);
+        assertEquals(PASSIVE_INTERVAL,
+                builder.build().toLocationRequest().getIntervalMillis());
+    }
+}
diff --git a/core/core/src/androidTest/java/androidx/core/os/BuildCompatTest.java b/core/core/src/androidTest/java/androidx/core/os/BuildCompatTest.java
index 27b0171..8fd4f53 100644
--- a/core/core/src/androidTest/java/androidx/core/os/BuildCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/os/BuildCompatTest.java
@@ -35,6 +35,7 @@
     public void isAtLeastPreReleaseCodename() {
         assertTrue(BuildCompat.isAtLeastPreReleaseCodename("S", "S"));
         assertTrue(BuildCompat.isAtLeastPreReleaseCodename("S", "Tiramisu"));
+        assertTrue(BuildCompat.isAtLeastPreReleaseCodename("Tiramisu", "Tiramisu"));
         assertFalse(BuildCompat.isAtLeastPreReleaseCodename("Tiramisu", "S"));
 
         assertTrue(BuildCompat.isAtLeastPreReleaseCodename("O", "OMR1"));
diff --git a/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java b/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
index 07547c7..30b9a3d 100644
--- a/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
+++ b/core/core/src/main/java/androidx/core/content/res/ResourcesCompat.java
@@ -69,6 +69,7 @@
 /**
  * Helper for accessing features in {@link Resources}.
  */
+@SuppressWarnings("unused")
 public final class ResourcesCompat {
     private static final String TAG = "ResourcesCompat";
     private static final ThreadLocal<TypedValue> sTempTypedValue = new ThreadLocal<>();
@@ -274,7 +275,8 @@
                 final ColorStateListCacheEntry entry = entries.get(resId);
                 if (entry != null) {
                     if (entry.mConfiguration.equals(key.mResources.getConfiguration())
-                            && entry.mThemeHash == key.mTheme.hashCode()) {
+                            && ((key.mTheme == null && entry.mThemeHash == 0)
+                            || (key.mTheme != null && entry.mThemeHash == key.mTheme.hashCode()))) {
                         // If the current configuration matches the entry's, we can use it
                         return entry.mValue;
                     } else {
diff --git a/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java b/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java
index 01a48df..03b0c8f 100644
--- a/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java
+++ b/core/core/src/main/java/androidx/core/database/CursorWindowCompat.java
@@ -19,16 +19,18 @@
 import android.database.CursorWindow;
 import android.os.Build;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
- * Helper for accessing features in {@link android.database.CursorWindow}
+ * Helper for accessing features in {@link CursorWindow}
  */
 public final class CursorWindowCompat {
 
     private CursorWindowCompat() {
-        /* Hide constructor */
+        // This class is not instantiable.
     }
 
     /**
@@ -40,11 +42,35 @@
     @NonNull
     public static CursorWindow create(@Nullable String name, long windowSizeBytes) {
         if (Build.VERSION.SDK_INT >= 28) {
-            return new CursorWindow(name, windowSizeBytes);
+            return Api28Impl.createCursorWindow(name, windowSizeBytes);
         } else if (Build.VERSION.SDK_INT >= 15) {
-            return new CursorWindow(name);
+            return Api15Impl.createCursorWindow(name);
         } else {
             return new CursorWindow(false);
         }
     }
+
+    @RequiresApi(28)
+    static class Api28Impl {
+        private Api28Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static CursorWindow createCursorWindow(String name, long windowSizeBytes) {
+            return new CursorWindow(name, windowSizeBytes);
+        }
+    }
+
+    @RequiresApi(15)
+    static class Api15Impl {
+        private Api15Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static CursorWindow createCursorWindow(String name) {
+            return new CursorWindow(name);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/database/sqlite/SQLiteCursorCompat.java b/core/core/src/main/java/androidx/core/database/sqlite/SQLiteCursorCompat.java
index e46713c..1a2225e 100644
--- a/core/core/src/main/java/androidx/core/database/sqlite/SQLiteCursorCompat.java
+++ b/core/core/src/main/java/androidx/core/database/sqlite/SQLiteCursorCompat.java
@@ -16,18 +16,21 @@
 
 package androidx.core.database.sqlite;
 
+import android.database.AbstractWindowedCursor;
 import android.database.sqlite.SQLiteCursor;
 import android.os.Build;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
- * Helper for accessing features in {@link android.database.AbstractWindowedCursor}
+ * Helper for accessing features in {@link AbstractWindowedCursor}
  */
 public final class SQLiteCursorCompat {
 
     private SQLiteCursorCompat() {
-        /* Hide constructor */
+        // This class is not instantiable.
     }
 
     /**
@@ -43,6 +46,18 @@
     public static void setFillWindowForwardOnly(
             @NonNull SQLiteCursor cursor, boolean fillWindowForwardOnly) {
         if (Build.VERSION.SDK_INT >= 28) {
+            Api28Impl.setFillWindowForwardOnly(cursor, fillWindowForwardOnly);
+        }
+    }
+
+    @RequiresApi(28)
+    static class Api28Impl {
+        private Api28Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void setFillWindowForwardOnly(SQLiteCursor cursor, boolean fillWindowForwardOnly) {
             cursor.setFillWindowForwardOnly(fillWindowForwardOnly);
         }
     }
diff --git a/core/core/src/main/java/androidx/core/graphics/BitmapCompat.java b/core/core/src/main/java/androidx/core/graphics/BitmapCompat.java
index 9902c00..aae8d3d 100644
--- a/core/core/src/main/java/androidx/core/graphics/BitmapCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/BitmapCompat.java
@@ -18,38 +18,110 @@
 import android.graphics.Bitmap;
 import android.os.Build;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
- * Helper for accessing features in {@link android.graphics.Bitmap}.
+ * Helper for accessing features in {@link Bitmap}.
  */
 public final class BitmapCompat {
+
+    /**
+     * Indicates whether the renderer responsible for drawing this
+     * bitmap should attempt to use mipmaps when this bitmap is drawn
+     * scaled down.
+     * <p>
+     * If you know that you are going to draw this bitmap at less than
+     * 50% of its original size, you may be able to obtain a higher
+     * quality
+     * <p>
+     * This property is only a suggestion that can be ignored by the
+     * renderer. It is not guaranteed to have any effect.
+     *
+     * @return true if the renderer should attempt to use mipmaps,
+     *         false otherwise
+     *
+     * @see Bitmap#hasMipMap()
+     */
     public static boolean hasMipMap(@NonNull Bitmap bitmap) {
-        if (Build.VERSION.SDK_INT >= 18) {
-            return bitmap.hasMipMap();
+        if (Build.VERSION.SDK_INT >= 17) {
+            return Api17Impl.hasMipMap(bitmap);
         }
         return false;
     }
 
+    /**
+     * Set a hint for the renderer responsible for drawing this bitmap
+     * indicating that it should attempt to use mipmaps when this bitmap
+     * is drawn scaled down.
+     * <p>
+     * If you know that you are going to draw this bitmap at less than
+     * 50% of its original size, you may be able to obtain a higher
+     * quality by turning this property on.
+     * <p>
+     * Note that if the renderer respects this hint it might have to
+     * allocate extra memory to hold the mipmap levels for this bitmap.
+     * <p>
+     * This property is only a suggestion that can be ignored by the
+     * renderer. It is not guaranteed to have any effect.
+     *
+     * @param hasMipMap indicates whether the renderer should attempt
+     *                  to use mipmaps
+     *
+     * @see Bitmap#setHasMipMap(boolean)
+     *
+     */
     public static void setHasMipMap(@NonNull Bitmap bitmap, boolean hasMipMap) {
-        if (Build.VERSION.SDK_INT >= 18) {
-            bitmap.setHasMipMap(hasMipMap);
+        if (Build.VERSION.SDK_INT >= 17) {
+            Api17Impl.setHasMipMap(bitmap, hasMipMap);
         }
     }
 
     /**
-     * Returns the size of the allocated memory used to store this bitmap's pixels in a backwards
-     * compatible way.
+     * Returns the size of the allocated memory used to store this bitmap's pixels.
+     * <p>
+     * This value will not change over the lifetime of a Bitmap.
      *
-     * @param bitmap the bitmap in which to return its allocation size
-     * @return the allocation size in bytes
+     * @see Bitmap#getAllocationByteCount()
      */
     public static int getAllocationByteCount(@NonNull Bitmap bitmap) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return bitmap.getAllocationByteCount();
+            return Api19Impl.getAllocationByteCount(bitmap);
         }
         return bitmap.getByteCount();
     }
 
-    private BitmapCompat() {}
+    private BitmapCompat() {
+        // This class is not instantiable.
+    }
+
+    @RequiresApi(17)
+    static class Api17Impl {
+        private Api17Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean hasMipMap(Bitmap bitmap) {
+            return bitmap.hasMipMap();
+        }
+
+        @DoNotInline
+        static void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
+            bitmap.setHasMipMap(hasMipMap);
+        }
+    }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static int getAllocationByteCount(Bitmap bitmap) {
+            return bitmap.getAllocationByteCount();
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/BlendModeColorFilterCompat.java b/core/core/src/main/java/androidx/core/graphics/BlendModeColorFilterCompat.java
index 1843c25..cff8d8f 100644
--- a/core/core/src/main/java/androidx/core/graphics/BlendModeColorFilterCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/BlendModeColorFilterCompat.java
@@ -23,8 +23,10 @@
 import android.graphics.PorterDuffColorFilter;
 import android.os.Build;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 /**
  * Helper for accessing ColorFilter APIs on various API levels of the platform
@@ -32,17 +34,19 @@
 public class BlendModeColorFilterCompat {
 
     /**
-     * Convenience method to create ColorFilter in a backward
-     * compatible way. This method falls back on PorterDuffColorFilter for API levels that
-     * do not support BlendModeColorFilter. This method returns null if the BlendMode provided is
-     * not supported on a given API level.
+     * Convenience method to create ColorFilter in a backward-compatible way.
+     *
+     * This method falls back on PorterDuffColorFilter for API levels that do not support
+     * BlendModeColorFilter. This method returns {@code null} if the BlendMode provided is not
+     * supported on a given API level.
      */
     public static @Nullable ColorFilter createBlendModeColorFilterCompat(int color,
             @NonNull BlendModeCompat blendModeCompat) {
         if (Build.VERSION.SDK_INT >= 29) {
-            BlendMode blendMode = BlendModeUtils.obtainBlendModeFromCompat(blendModeCompat);
+            Object blendMode =
+                    BlendModeUtils.Api29Impl.obtainBlendModeFromCompat(blendModeCompat);
             return blendMode != null
-                    ? new BlendModeColorFilter(color, blendMode) : null;
+                    ? Api29Impl.createBlendModeColorFilter(color, blendMode) : null;
         } else {
             PorterDuff.Mode porterDuffMode =
                     BlendModeUtils.obtainPorterDuffFromCompat(blendModeCompat);
@@ -51,5 +55,19 @@
         }
     }
 
-    private BlendModeColorFilterCompat() { }
+    private BlendModeColorFilterCompat() {
+        // This class is not instantiable.
+    }
+
+    @RequiresApi(29)
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static ColorFilter createBlendModeColorFilter(int color, Object mode) {
+            return new BlendModeColorFilter(color, (BlendMode) mode);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/BlendModeUtils.java b/core/core/src/main/java/androidx/core/graphics/BlendModeUtils.java
index a5188a5..feb339b 100644
--- a/core/core/src/main/java/androidx/core/graphics/BlendModeUtils.java
+++ b/core/core/src/main/java/androidx/core/graphics/BlendModeUtils.java
@@ -19,6 +19,7 @@
 import android.graphics.BlendMode;
 import android.graphics.PorterDuff;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
@@ -27,123 +28,131 @@
  * Utility class used to map BlendModeCompat parameters to the corresponding
  * PorterDuff mode or BlendMode depending on the API level of the platform
  */
-/* package */ class BlendModeUtils {
+class BlendModeUtils {
+    private BlendModeUtils() {
+        // This class is not instantiable.
+    }
 
     @RequiresApi(29)
-    /* package */ static @Nullable BlendMode obtainBlendModeFromCompat(
-            @NonNull BlendModeCompat blendModeCompat) {
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        @Nullable
+        static Object obtainBlendModeFromCompat(@NonNull BlendModeCompat blendModeCompat) {
+            switch (blendModeCompat) {
+                case CLEAR:
+                    return BlendMode.CLEAR;
+                case SRC:
+                    return BlendMode.SRC;
+                case DST:
+                    return BlendMode.DST;
+                case SRC_OVER:
+                    return BlendMode.SRC_OVER;
+                case DST_OVER:
+                    return BlendMode.DST_OVER;
+                case SRC_IN:
+                    return BlendMode.SRC_IN;
+                case DST_IN:
+                    return BlendMode.DST_IN;
+                case SRC_OUT:
+                    return BlendMode.SRC_OUT;
+                case DST_OUT:
+                    return BlendMode.DST_OUT;
+                case SRC_ATOP:
+                    return BlendMode.SRC_ATOP;
+                case DST_ATOP:
+                    return BlendMode.DST_ATOP;
+                case XOR:
+                    return BlendMode.XOR;
+                case PLUS:
+                    return BlendMode.PLUS;
+                case MODULATE:
+                    return BlendMode.MODULATE;
+                case SCREEN:
+                    return BlendMode.SCREEN;
+                case OVERLAY:
+                    return BlendMode.OVERLAY;
+                case DARKEN:
+                    return BlendMode.DARKEN;
+                case LIGHTEN:
+                    return BlendMode.LIGHTEN;
+                case COLOR_DODGE:
+                    return BlendMode.COLOR_DODGE;
+                case COLOR_BURN:
+                    return BlendMode.COLOR_BURN;
+                case HARD_LIGHT:
+                    return BlendMode.HARD_LIGHT;
+                case SOFT_LIGHT:
+                    return BlendMode.SOFT_LIGHT;
+                case DIFFERENCE:
+                    return BlendMode.DIFFERENCE;
+                case EXCLUSION:
+                    return BlendMode.EXCLUSION;
+                case MULTIPLY:
+                    return BlendMode.MULTIPLY;
+                case HUE:
+                    return BlendMode.HUE;
+                case SATURATION:
+                    return BlendMode.SATURATION;
+                case COLOR:
+                    return BlendMode.COLOR;
+                case LUMINOSITY:
+                    return BlendMode.LUMINOSITY;
+                default:
+                    return null;
+            }
+        }
+    }
+
+    static @Nullable PorterDuff.Mode obtainPorterDuffFromCompat(
+            @Nullable BlendModeCompat blendModeCompat) {
+        if (blendModeCompat == null) {
+            return null;
+        }
+
         switch (blendModeCompat) {
             case CLEAR:
-                return BlendMode.CLEAR;
+                return PorterDuff.Mode.CLEAR;
             case SRC:
-                return BlendMode.SRC;
+                return PorterDuff.Mode.SRC;
             case DST:
-                return BlendMode.DST;
+                return PorterDuff.Mode.DST;
             case SRC_OVER:
-                return BlendMode.SRC_OVER;
+                return PorterDuff.Mode.SRC_OVER;
             case DST_OVER:
-                return BlendMode.DST_OVER;
+                return PorterDuff.Mode.DST_OVER;
             case SRC_IN:
-                return BlendMode.SRC_IN;
+                return PorterDuff.Mode.SRC_IN;
             case DST_IN:
-                return BlendMode.DST_IN;
+                return PorterDuff.Mode.DST_IN;
             case SRC_OUT:
-                return BlendMode.SRC_OUT;
+                return PorterDuff.Mode.SRC_OUT;
             case DST_OUT:
-                return BlendMode.DST_OUT;
+                return PorterDuff.Mode.DST_OUT;
             case SRC_ATOP:
-                return BlendMode.SRC_ATOP;
+                return PorterDuff.Mode.SRC_ATOP;
             case DST_ATOP:
-                return BlendMode.DST_ATOP;
+                return PorterDuff.Mode.DST_ATOP;
             case XOR:
-                return BlendMode.XOR;
+                return PorterDuff.Mode.XOR;
             case PLUS:
-                return BlendMode.PLUS;
+                return PorterDuff.Mode.ADD;
+            // b/73224934 PorterDuff Multiply maps to Skia Modulate
             case MODULATE:
-                return BlendMode.MODULATE;
+                return PorterDuff.Mode.MULTIPLY;
             case SCREEN:
-                return BlendMode.SCREEN;
+                return PorterDuff.Mode.SCREEN;
             case OVERLAY:
-                return BlendMode.OVERLAY;
+                return PorterDuff.Mode.OVERLAY;
             case DARKEN:
-                return BlendMode.DARKEN;
+                return PorterDuff.Mode.DARKEN;
             case LIGHTEN:
-                return BlendMode.LIGHTEN;
-            case COLOR_DODGE:
-                return BlendMode.COLOR_DODGE;
-            case COLOR_BURN:
-                return BlendMode.COLOR_BURN;
-            case HARD_LIGHT:
-                return BlendMode.HARD_LIGHT;
-            case SOFT_LIGHT:
-                return BlendMode.SOFT_LIGHT;
-            case DIFFERENCE:
-                return BlendMode.DIFFERENCE;
-            case EXCLUSION:
-                return BlendMode.EXCLUSION;
-            case MULTIPLY:
-                return BlendMode.MULTIPLY;
-            case HUE:
-                return BlendMode.HUE;
-            case SATURATION:
-                return BlendMode.SATURATION;
-            case COLOR:
-                return BlendMode.COLOR;
-            case LUMINOSITY:
-                return BlendMode.LUMINOSITY;
+                return PorterDuff.Mode.LIGHTEN;
             default:
                 return null;
         }
     }
-
-    /* package */ static @Nullable PorterDuff.Mode obtainPorterDuffFromCompat(
-            @Nullable BlendModeCompat blendModeCompat) {
-        if (blendModeCompat != null) {
-            switch (blendModeCompat) {
-                case CLEAR:
-                    return PorterDuff.Mode.CLEAR;
-                case SRC:
-                    return PorterDuff.Mode.SRC;
-                case DST:
-                    return PorterDuff.Mode.DST;
-                case SRC_OVER:
-                    return PorterDuff.Mode.SRC_OVER;
-                case DST_OVER:
-                    return PorterDuff.Mode.DST_OVER;
-                case SRC_IN:
-                    return PorterDuff.Mode.SRC_IN;
-                case DST_IN:
-                    return PorterDuff.Mode.DST_IN;
-                case SRC_OUT:
-                    return PorterDuff.Mode.SRC_OUT;
-                case DST_OUT:
-                    return PorterDuff.Mode.DST_OUT;
-                case SRC_ATOP:
-                    return PorterDuff.Mode.SRC_ATOP;
-                case DST_ATOP:
-                    return PorterDuff.Mode.DST_ATOP;
-                case XOR:
-                    return PorterDuff.Mode.XOR;
-                case PLUS:
-                    return PorterDuff.Mode.ADD;
-                // b/73224934 PorterDuff Multiply maps to Skia Modulate
-                case MODULATE:
-                    return PorterDuff.Mode.MULTIPLY;
-                case SCREEN:
-                    return PorterDuff.Mode.SCREEN;
-                case OVERLAY:
-                    return PorterDuff.Mode.OVERLAY;
-                case DARKEN:
-                    return PorterDuff.Mode.DARKEN;
-                case LIGHTEN:
-                    return PorterDuff.Mode.LIGHTEN;
-                default:
-                    return null;
-            }
-        } else {
-            return null;
-        }
-    }
-
-    private BlendModeUtils() { }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/ColorUtils.java b/core/core/src/main/java/androidx/core/graphics/ColorUtils.java
index 6c1e37f..a7afe56 100644
--- a/core/core/src/main/java/androidx/core/graphics/ColorUtils.java
+++ b/core/core/src/main/java/androidx/core/graphics/ColorUtils.java
@@ -20,6 +20,7 @@
 import android.graphics.Color;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.FloatRange;
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
@@ -89,42 +90,54 @@
     @RequiresApi(26)
     @NonNull
     public static Color compositeColors(@NonNull Color foreground, @NonNull Color background) {
-        if (!Objects.equals(foreground.getModel(), background.getModel())) {
-            throw new IllegalArgumentException(
-                    "Color models must match (" + foreground.getModel() + " vs. "
-                            + background.getModel() + ")");
+        return Api26Impl.compositeColors(foreground, background);
+    }
+
+    @RequiresApi(26)
+    static class Api26Impl {
+        private Api26Impl() {
+            // This class is not instantiable.
         }
 
-        Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())
-                ? foreground
-                : foreground.convert(background.getColorSpace());
+        @DoNotInline
+        static Color compositeColors(Color foreground, Color background) {
+            if (!Objects.equals(foreground.getModel(), background.getModel())) {
+                throw new IllegalArgumentException(
+                        "Color models must match (" + foreground.getModel() + " vs. "
+                                + background.getModel() + ")");
+            }
 
-        float[] src = s.getComponents();
-        float[] dst = background.getComponents();
+            Color s = Objects.equals(background.getColorSpace(), foreground.getColorSpace())
+                    ? foreground
+                    : foreground.convert(background.getColorSpace());
 
-        float sa = s.alpha();
-        // Destination alpha pre-composited
-        float da = background.alpha() * (1.0f - sa);
+            float[] src = s.getComponents();
+            float[] dst = background.getComponents();
 
-        // Index of the alpha component
-        @SuppressLint("Range") // TODO Remove after upgrading Android Gradle Plugin to 3.1 or newer.
-        int ai = background.getComponentCount() - 1;
+            float sa = s.alpha();
+            // Destination alpha pre-composited
+            float da = background.alpha() * (1.0f - sa);
 
-        // Final alpha: src_alpha + dst_alpha * (1 - src_alpha)
-        dst[ai] = sa + da;
+            // Index of the alpha component
+            @SuppressLint("Range") // TODO Remove after upgrading AGP to 3.1 or newer.
+            int ai = background.getComponentCount() - 1;
 
-        // Divide by final alpha to return non pre-multiplied color
-        if (dst[ai] > 0) {
-            sa /= dst[ai];
-            da /= dst[ai];
+            // Final alpha: src_alpha + dst_alpha * (1 - src_alpha)
+            dst[ai] = sa + da;
+
+            // Divide by final alpha to return non pre-multiplied color
+            if (dst[ai] > 0) {
+                sa /= dst[ai];
+                da /= dst[ai];
+            }
+
+            // Composite non-alpha components
+            for (int i = 0; i < ai; i++) {
+                dst[i] = src[i] * sa + dst[i] * da;
+            }
+
+            return Color.valueOf(dst, background.getColorSpace());
         }
-
-        // Composite non-alpha components
-        for (int i = 0; i < ai; i++) {
-            dst[i] = src[i] * sa + dst[i] * da;
-        }
-
-        return Color.valueOf(dst, background.getColorSpace());
     }
 
     private static int compositeAlpha(int foregroundAlpha, int backgroundAlpha) {
@@ -575,18 +588,21 @@
     /**
      * Returns the euclidean distance between two LAB colors.
      */
+    @SuppressWarnings("unused")
     public static double distanceEuclidean(@NonNull double[] labX, @NonNull double[] labY) {
         return Math.sqrt(Math.pow(labX[0] - labY[0], 2)
                 + Math.pow(labX[1] - labY[1], 2)
                 + Math.pow(labX[2] - labY[2], 2));
     }
 
+    @SuppressWarnings("SameParameterValue")
     private static float constrain(float amount, float low, float high) {
-        return amount < low ? low : (amount > high ? high : amount);
+        return amount < low ? low : Math.min(amount, high);
     }
 
+    @SuppressWarnings("SameParameterValue")
     private static int constrain(int amount, int low, int high) {
-        return amount < low ? low : (amount > high ? high : amount);
+        return amount < low ? low : Math.min(amount, high);
     }
 
     private static double pivotXyzComponent(double component) {
@@ -605,6 +621,7 @@
      * @param color2 the second ARGB color
      * @param ratio  the blend ratio of {@code color1} to {@code color2}
      */
+    @SuppressWarnings("unused")
     @ColorInt
     public static int blendARGB(@ColorInt int color1, @ColorInt int color2,
             @FloatRange(from = 0.0, to = 1.0) float ratio) {
@@ -628,6 +645,7 @@
      * @param ratio     the blend ratio of {@code hsl1} to {@code hsl2}
      * @param outResult 3-element array which holds the resulting HSL components
      */
+    @SuppressWarnings("unused")
     public static void blendHSL(@NonNull float[] hsl1, @NonNull float[] hsl2,
             @FloatRange(from = 0.0, to = 1.0) float ratio, @NonNull float[] outResult) {
         if (outResult.length != 3) {
@@ -651,6 +669,7 @@
      * @param ratio     the blend ratio of {@code lab1} to {@code lab2}
      * @param outResult 3-element array which holds the resulting LAB components
      */
+    @SuppressWarnings("unused")
     public static void blendLAB(@NonNull double[] lab1, @NonNull double[] lab2,
             @FloatRange(from = 0.0, to = 1.0) double ratio, @NonNull double[] outResult) {
         if (outResult.length != 3) {
diff --git a/core/core/src/main/java/androidx/core/graphics/Insets.java b/core/core/src/main/java/androidx/core/graphics/Insets.java
index b718179..3387d00 100644
--- a/core/core/src/main/java/androidx/core/graphics/Insets.java
+++ b/core/core/src/main/java/androidx/core/graphics/Insets.java
@@ -20,6 +20,7 @@
 
 import android.graphics.Rect;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
@@ -96,6 +97,7 @@
      * @param b The subtrahend; the value which will be subtracted from {@code a}.
      * @return a - b, i. e. all insets on every side are subtracted from each other.
      */
+    @SuppressWarnings("unused")
     @NonNull
     public static Insets subtract(@NonNull Insets a, @NonNull Insets b) {
         return Insets.of(a.left - b.left, a.top - b.top, a.right - b.right, a.bottom - b.bottom);
@@ -136,6 +138,7 @@
      * @param o the object to compare this instance with.
      * @return true iff this object is equal {@code o}
      */
+    @SuppressWarnings("RedundantIfStatement")
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -160,6 +163,7 @@
         return result;
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "Insets{left=" + left + ", top=" + top
@@ -192,9 +196,21 @@
      * Return a copy this instance, converted to be an {@link android.graphics.Insets} instance
      * from the platform.
      */
-    @RequiresApi(api = 29)
+    @RequiresApi(29)
     @NonNull
     public android.graphics.Insets toPlatformInsets() {
-        return android.graphics.Insets.of(left, top, right, bottom);
+        return Api29Impl.of(left, top, right, bottom);
+    }
+
+    @RequiresApi(29)
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static android.graphics.Insets of(int left, int top, int right, int bottom) {
+            return android.graphics.Insets.of(left, top, right, bottom);
+        }
     }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/PaintCompat.java b/core/core/src/main/java/androidx/core/graphics/PaintCompat.java
index 61673fe..4503d2c 100644
--- a/core/core/src/main/java/androidx/core/graphics/PaintCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/PaintCompat.java
@@ -16,17 +16,19 @@
 
 package androidx.core.graphics;
 
-import static androidx.core.graphics.BlendModeUtils.obtainBlendModeFromCompat;
 import static androidx.core.graphics.BlendModeUtils.obtainPorterDuffFromCompat;
 
+import android.graphics.BlendMode;
 import android.graphics.Paint;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
 import android.os.Build;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.util.Pair;
 
 /**
@@ -49,7 +51,7 @@
      */
     public static boolean hasGlyph(@NonNull Paint paint, @NonNull String string) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return paint.hasGlyph(string);
+            return Api23Impl.hasGlyph(paint, string);
         }
         final int length = string.length();
 
@@ -124,7 +126,9 @@
      */
     public static boolean setBlendMode(@NonNull Paint paint, @Nullable BlendModeCompat blendMode) {
         if (Build.VERSION.SDK_INT >= 29) {
-            paint.setBlendMode(blendMode != null ? obtainBlendModeFromCompat(blendMode) : null);
+            Object blendModePlatform = blendMode != null
+                    ? BlendModeUtils.Api29Impl.obtainBlendModeFromCompat(blendMode) : null;
+            Api29Impl.setBlendMode(paint, blendModePlatform);
             // All blend modes supported in Q
             return true;
         } else if (blendMode != null) {
@@ -153,5 +157,30 @@
         return rects;
     }
 
-    private PaintCompat() {}
+    private PaintCompat() {
+    }
+
+    @RequiresApi(29)
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void setBlendMode(Paint paint, Object blendmode) {
+            paint.setBlendMode((BlendMode) blendmode);
+        }
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean hasGlyph(Paint paint, String string) {
+            return paint.hasGlyph(string);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/PathUtils.java b/core/core/src/main/java/androidx/core/graphics/PathUtils.java
index 65e49f6..8c88875 100644
--- a/core/core/src/main/java/androidx/core/graphics/PathUtils.java
+++ b/core/core/src/main/java/androidx/core/graphics/PathUtils.java
@@ -19,6 +19,7 @@
 import android.graphics.Path;
 import android.graphics.PointF;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.FloatRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
@@ -57,7 +58,7 @@
     @NonNull
     public static Collection<PathSegment> flatten(@NonNull final Path path,
             @FloatRange(from = 0) final float error) {
-        float[] pathData = path.approximate(error);
+        float[] pathData = Api26Impl.approximate(path, error);
         int pointCount = pathData.length / 3;
         List<PathSegment> segments = new ArrayList<>(pointCount);
         for (int i = 1; i < pointCount; i++) {
@@ -81,4 +82,16 @@
 
     private PathUtils() {
     }
+
+    @RequiresApi(26)
+    static class Api26Impl {
+        private Api26Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static float[] approximate(Path path, float acceptableError) {
+            return path.approximate(acceptableError);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java b/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
index 1f02d66..85c9e3c 100644
--- a/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
+++ b/core/core/src/main/java/androidx/core/graphics/TypefaceCompatUtil.java
@@ -29,6 +29,7 @@
 import android.os.StrictMode;
 import android.util.Log;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
@@ -38,6 +39,7 @@
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -65,7 +67,7 @@
      * Returns null if failed to create temp file.
      */
     @Nullable
-    public static File getTempFile(Context context) {
+    public static File getTempFile(@NonNull Context context) {
         File cacheDir = context.getCacheDir();
         if (cacheDir == null) {
             return null;
@@ -105,9 +107,11 @@
      */
     @Nullable
     @RequiresApi(19)
-    public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {
+    public static ByteBuffer mmap(@NonNull Context context,
+            @Nullable CancellationSignal cancellationSignal, @NonNull Uri uri) {
         final ContentResolver resolver = context.getContentResolver();
-        try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(uri, "r", cancellationSignal)) {
+        try (ParcelFileDescriptor pfd = Api19Impl.openFileDescriptor(resolver, uri, "r",
+                cancellationSignal)) {
             if (pfd == null) {
                 return null;
             }
@@ -124,9 +128,11 @@
     /**
      * Copy the resource contents to the direct byte buffer.
      */
+    @SuppressWarnings("ResultOfMethodCallIgnored")
     @Nullable
     @RequiresApi(19)
-    public static ByteBuffer copyToDirectBuffer(Context context, Resources res, int id) {
+    public static ByteBuffer copyToDirectBuffer(@NonNull Context context, @NonNull Resources res,
+            int id) {
         File tmpFile = getTempFile(context);
         if (tmpFile == null) {
             return null;
@@ -144,7 +150,7 @@
     /**
      * Copy the input stream contents to file.
      */
-    public static boolean copyToFile(File file, InputStream is) {
+    public static boolean copyToFile(@NonNull File file, @NonNull InputStream is) {
         FileOutputStream os = null;
         StrictMode.ThreadPolicy old = StrictMode.allowThreadDiskWrites();
         try {
@@ -167,7 +173,8 @@
     /**
      * Copy the resource contents to file.
      */
-    public static boolean copyToFile(File file, Resources res, int id) {
+    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
+    public static boolean copyToFile(@NonNull File file, @NonNull Resources res, int id) {
         InputStream is = null;
         try {
             is = res.openRawResource(id);
@@ -177,11 +184,17 @@
         }
     }
 
-    public static void closeQuietly(Closeable c) {
+    /**
+     * Attempts to close a Closeable, swallowing any resulting IOException.
+     *
+     * @param c the closeable to close
+     */
+    public static void closeQuietly(@Nullable Closeable c) {
         if (c != null) {
             try {
                 c.close();
             } catch (IOException e) {
+                // Quietly!
             }
         }
     }
@@ -222,4 +235,18 @@
         }
         return Collections.unmodifiableMap(out);
     }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        @SuppressWarnings("SameParameterValue")
+        @DoNotInline
+        static ParcelFileDescriptor openFileDescriptor(ContentResolver contentResolver, Uri uri,
+                String mode, CancellationSignal cancellationSignal) throws FileNotFoundException {
+            return contentResolver.openFileDescriptor(uri, mode, cancellationSignal);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java b/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
index d81ba22..8e96af8 100644
--- a/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/drawable/DrawableCompat.java
@@ -28,8 +28,10 @@
 import android.util.Log;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.view.ViewCompat;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -76,7 +78,7 @@
      */
     public static void setAutoMirrored(@NonNull Drawable drawable, boolean mirrored) {
         if (Build.VERSION.SDK_INT >= 19) {
-            drawable.setAutoMirrored(mirrored);
+            Api19Impl.setAutoMirrored(drawable, mirrored);
         }
     }
 
@@ -93,7 +95,7 @@
      */
     public static boolean isAutoMirrored(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return drawable.isAutoMirrored();
+            return Api19Impl.isAutoMirrored(drawable);
         } else {
             return false;
         }
@@ -108,7 +110,7 @@
      */
     public static void setHotspot(@NonNull Drawable drawable, float x, float y) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setHotspot(x, y);
+            Api21Impl.setHotspot(drawable, x, y);
         }
     }
 
@@ -121,7 +123,7 @@
     public static void setHotspotBounds(@NonNull Drawable drawable, int left, int top,
             int right, int bottom) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setHotspotBounds(left, top, right, bottom);
+            Api21Impl.setHotspotBounds(drawable, left, top, right, bottom);
         }
     }
 
@@ -133,7 +135,7 @@
      */
     public static void setTint(@NonNull Drawable drawable, @ColorInt int tint) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setTint(tint);
+            Api21Impl.setTint(drawable, tint);
         } else if (drawable instanceof TintAwareDrawable) {
             ((TintAwareDrawable) drawable).setTint(tint);
         }
@@ -147,7 +149,7 @@
      */
     public static void setTintList(@NonNull Drawable drawable, @Nullable ColorStateList tint) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setTintList(tint);
+            Api21Impl.setTintList(drawable, tint);
         } else if (drawable instanceof TintAwareDrawable) {
             ((TintAwareDrawable) drawable).setTintList(tint);
         }
@@ -161,7 +163,7 @@
      */
     public static void setTintMode(@NonNull Drawable drawable, @NonNull PorterDuff.Mode tintMode) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.setTintMode(tintMode);
+            Api21Impl.setTintMode(drawable, tintMode);
         } else if (drawable instanceof TintAwareDrawable) {
             ((TintAwareDrawable) drawable).setTintMode(tintMode);
         }
@@ -173,9 +175,10 @@
      *
      * @param drawable The Drawable against which to invoke the method.
      */
+    @SuppressWarnings("unused")
     public static int getAlpha(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 19) {
-            return drawable.getAlpha();
+            return Api19Impl.getAlpha(drawable);
         } else {
             return 0;
         }
@@ -184,18 +187,20 @@
     /**
      * Applies the specified theme to this Drawable and its children.
      */
+    @SuppressWarnings("unused")
     public static void applyTheme(@NonNull Drawable drawable, @NonNull Resources.Theme theme) {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.applyTheme(theme);
+            Api21Impl.applyTheme(drawable, theme);
         }
     }
 
     /**
      * Whether a theme can be applied to this Drawable and its children.
      */
+    @SuppressWarnings("unused")
     public static boolean canApplyTheme(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 21) {
-            return drawable.canApplyTheme();
+            return Api21Impl.canApplyTheme(drawable);
         } else {
             return false;
         }
@@ -206,9 +211,11 @@
      *
      * @return the current color filter, or {@code null} if none set
      */
+    @SuppressWarnings("unused")
+    @Nullable
     public static ColorFilter getColorFilter(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 21) {
-            return drawable.getColorFilter();
+            return Api21Impl.getColorFilter(drawable);
         } else {
             return null;
         }
@@ -217,6 +224,7 @@
     /**
      * Removes the color filter from the given drawable.
      */
+    @SuppressWarnings("unused")
     public static void clearColorFilter(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 23) {
             // We can use clearColorFilter() safely on M+
@@ -229,7 +237,7 @@
             // to find any DrawableContainers, and then unwrap those to clear the filter on its
             // children manually
             if (drawable instanceof InsetDrawable) {
-                clearColorFilter(((InsetDrawable) drawable).getDrawable());
+                clearColorFilter(Api19Impl.getDrawable((InsetDrawable) drawable));
             } else if (drawable instanceof WrappedDrawable) {
                 clearColorFilter(((WrappedDrawable) drawable).getWrappedDrawable());
             } else if (drawable instanceof DrawableContainer) {
@@ -239,7 +247,7 @@
                 if (state != null) {
                     Drawable child;
                     for (int i = 0, count = state.getChildCount(); i < count; i++) {
-                        child = state.getChild(i);
+                        child = Api19Impl.getChild(state, i);
                         if (child != null) {
                             clearColorFilter(child);
                         }
@@ -266,7 +274,7 @@
             @Nullable Resources.Theme theme)
             throws XmlPullParserException, IOException {
         if (Build.VERSION.SDK_INT >= 21) {
-            drawable.inflate(res, parser, attrs, theme);
+            Api21Impl.inflate(drawable, res, parser, attrs, theme);
         } else {
             drawable.inflate(res, parser, attrs);
         }
@@ -303,6 +311,7 @@
      * @see #setTintMode(Drawable, PorterDuff.Mode)
      * @see #unwrap(Drawable)
      */
+    @NonNull
     public static Drawable wrap(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 23) {
             return drawable;
@@ -352,7 +361,7 @@
      */
     public static boolean setLayoutDirection(@NonNull Drawable drawable, int layoutDirection) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return drawable.setLayoutDirection(layoutDirection);
+            return Api23Impl.setLayoutDirection(drawable, layoutDirection);
         } else if (Build.VERSION.SDK_INT >= 17) {
             if (!sSetLayoutDirectionMethodFetched) {
                 try {
@@ -387,9 +396,10 @@
      *         {@link ViewCompat#LAYOUT_DIRECTION_RTL}
      * @see #setLayoutDirection(Drawable, int)
      */
+    @SuppressWarnings("ConstantConditions")
     public static int getLayoutDirection(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 23) {
-            return drawable.getLayoutDirection();
+            return Api23Impl.getLayoutDirection(drawable);
         } else if (Build.VERSION.SDK_INT >= 17) {
             if (!sGetLayoutDirectionMethodFetched) {
                 try {
@@ -416,5 +426,110 @@
         }
     }
 
-    private DrawableCompat() {}
+    private DrawableCompat() {
+    }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void setAutoMirrored(Drawable drawable, boolean mirrored) {
+            drawable.setAutoMirrored(mirrored);
+        }
+
+        @DoNotInline
+        static boolean isAutoMirrored(Drawable drawable) {
+            return drawable.isAutoMirrored();
+        }
+
+        @DoNotInline
+        static int getAlpha(Drawable drawable) {
+            return drawable.getAlpha();
+        }
+
+        @DoNotInline
+        static Drawable getChild(DrawableContainer.DrawableContainerState drawableContainerState,
+                int index) {
+            return drawableContainerState.getChild(index);
+        }
+
+        @DoNotInline
+        static Drawable getDrawable(InsetDrawable drawable) {
+            return drawable.getDrawable();
+        }
+    }
+
+    @RequiresApi(21)
+    static class Api21Impl {
+        private Api21Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void setHotspot(Drawable drawable, float x, float y) {
+            drawable.setHotspot(x, y);
+        }
+
+        @DoNotInline
+        static void setTint(Drawable drawable, int tintColor) {
+            drawable.setTint(tintColor);
+        }
+
+        @DoNotInline
+        static void setTintList(Drawable drawable, ColorStateList tint) {
+            drawable.setTintList(tint);
+        }
+
+        @DoNotInline
+        static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
+            drawable.setTintMode(tintMode);
+        }
+
+        @DoNotInline
+        static void applyTheme(Drawable drawable, Resources.Theme t) {
+            drawable.applyTheme(t);
+        }
+
+        @DoNotInline
+        static boolean canApplyTheme(Drawable drawable) {
+            return drawable.canApplyTheme();
+        }
+
+        @DoNotInline
+        static ColorFilter getColorFilter(Drawable drawable) {
+            return drawable.getColorFilter();
+        }
+
+        @DoNotInline
+        static void inflate(Drawable drawable, Resources r, XmlPullParser parser,
+                AttributeSet attrs, Resources.Theme theme)
+                throws XmlPullParserException, IOException {
+            drawable.inflate(r, parser, attrs, theme);
+        }
+
+        @DoNotInline
+        static void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom) {
+            drawable.setHotspotBounds(left, top, right, bottom);
+        }
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
+            return drawable.setLayoutDirection(layoutDirection);
+        }
+
+        @DoNotInline
+        static int getLayoutDirection(Drawable drawable) {
+            return drawable.getLayoutDirection();
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java b/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
index 7ece7b1..110b3f2 100644
--- a/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java
@@ -49,6 +49,7 @@
 import android.util.Log;
 
 import androidx.annotation.ColorInt;
+import androidx.annotation.DoNotInline;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IdRes;
 import androidx.annotation.IntDef;
@@ -59,6 +60,7 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.res.ResourcesCompat;
+import androidx.core.util.ObjectsCompat;
 import androidx.core.util.Preconditions;
 import androidx.versionedparcelable.CustomVersionedParcelable;
 import androidx.versionedparcelable.NonParcelField;
@@ -171,12 +173,14 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 2, defaultValue = "null")
     public byte[]          mData = null;
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 3, defaultValue = "null")
     public Parcelable      mParcelable = null;
@@ -201,6 +205,7 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 6, defaultValue = "null")
     public ColorStateList  mTintList = null;
@@ -211,6 +216,7 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 7, defaultValue = "null")
     public String mTintModeStr = null;
@@ -218,6 +224,7 @@
     /**
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY)
     @ParcelField(value = 8, defaultValue = "null")
     public String mString1;
@@ -229,21 +236,20 @@
      * @param resId ID of the drawable resource
      * @see android.graphics.drawable.Icon#createWithResource(Context, int)
      */
-    public static IconCompat createWithResource(Context context, @DrawableRes int resId) {
-        if (context == null) {
-            throw new IllegalArgumentException("Context must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithResource(@NonNull Context context, @DrawableRes int resId) {
+        ObjectsCompat.requireNonNull(context);
         return createWithResource(context.getResources(), context.getPackageName(), resId);
     }
 
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {
-        if (pkg == null) {
-            throw new IllegalArgumentException("Package must not be null.");
-        }
+    public static IconCompat createWithResource(@Nullable Resources r, @NonNull String pkg,
+            @DrawableRes int resId) {
+        ObjectsCompat.requireNonNull(pkg);
         if (resId == 0) {
             throw new IllegalArgumentException("Drawable resource ID must not be 0");
         }
@@ -267,10 +273,9 @@
      * @param bits A valid {@link android.graphics.Bitmap} object
      * @see android.graphics.drawable.Icon#createWithBitmap(Bitmap)
      */
-    public static IconCompat createWithBitmap(Bitmap bits) {
-        if (bits == null) {
-            throw new IllegalArgumentException("Bitmap must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithBitmap(@NonNull Bitmap bits) {
+        ObjectsCompat.requireNonNull(bits);
         final IconCompat rep = new IconCompat(TYPE_BITMAP);
         rep.mObj1 = bits;
         return rep;
@@ -282,10 +287,9 @@
      * @param bits A valid {@link android.graphics.Bitmap} object
      * @see android.graphics.drawable.Icon#createWithAdaptiveBitmap(Bitmap)
      */
-    public static IconCompat createWithAdaptiveBitmap(Bitmap bits) {
-        if (bits == null) {
-            throw new IllegalArgumentException("Bitmap must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithAdaptiveBitmap(@NonNull Bitmap bits) {
+        ObjectsCompat.requireNonNull(bits);
         final IconCompat rep = new IconCompat(TYPE_ADAPTIVE_BITMAP);
         rep.mObj1 = bits;
         return rep;
@@ -300,10 +304,9 @@
      * @param length Length of the bitmap data
      * @see android.graphics.drawable.Icon#createWithData(byte[], int, int)
      */
-    public static IconCompat createWithData(byte[] data, int offset, int length) {
-        if (data == null) {
-            throw new IllegalArgumentException("Data must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithData(@NonNull byte[] data, int offset, int length) {
+        ObjectsCompat.requireNonNull(data);
         final IconCompat rep = new IconCompat(TYPE_DATA);
         rep.mObj1 = data;
         rep.mInt1 = offset;
@@ -317,10 +320,9 @@
      * @param uri A uri referring to local content:// or file:// image data.
      * @see android.graphics.drawable.Icon#createWithContentUri(String)
      */
-    public static IconCompat createWithContentUri(String uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithContentUri(@NonNull String uri) {
+        ObjectsCompat.requireNonNull(uri);
         final IconCompat rep = new IconCompat(TYPE_URI);
         rep.mObj1 = uri;
         return rep;
@@ -332,10 +334,9 @@
      * @param uri A uri referring to local content:// or file:// image data.
      * @see android.graphics.drawable.Icon#createWithContentUri(String)
      */
-    public static IconCompat createWithContentUri(Uri uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+    @NonNull
+    public static IconCompat createWithContentUri(@NonNull Uri uri) {
+        ObjectsCompat.requireNonNull(uri);
         return createWithContentUri(uri.toString());
     }
 
@@ -348,9 +349,7 @@
      */
     @NonNull
     public static IconCompat createWithAdaptiveBitmapContentUri(@NonNull String uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+        ObjectsCompat.requireNonNull(uri);
         final IconCompat rep = new IconCompat(TYPE_URI_ADAPTIVE_BITMAP);
         rep.mObj1 = uri;
         return rep;
@@ -365,9 +364,7 @@
      */
     @NonNull
     public static IconCompat createWithAdaptiveBitmapContentUri(@NonNull Uri uri) {
-        if (uri == null) {
-            throw new IllegalArgumentException("Uri must not be null.");
-        }
+        ObjectsCompat.requireNonNull(uri);
         return createWithAdaptiveBitmapContentUri(uri.toString());
     }
 
@@ -379,11 +376,10 @@
     public IconCompat() {
     }
 
-    private IconCompat(int mType) {
+    IconCompat(int mType) {
         this.mType = mType;
     }
 
-
     /**
      * Gets the type of the icon provided.
      * <p>
@@ -393,7 +389,7 @@
     @IconType
     public int getType() {
         if (mType == TYPE_UNKNOWN && Build.VERSION.SDK_INT >= 23) {
-            return getType((Icon) mObj1);
+            return Api23Impl.getType(mObj1);
         }
         return mType;
     }
@@ -408,7 +404,7 @@
     @NonNull
     public String getResPackage() {
         if (mType == TYPE_UNKNOWN && Build.VERSION.SDK_INT >= 23) {
-            return getResPackage((Icon) mObj1);
+            return Api23Impl.getResPackage(mObj1);
         }
         if (mType != TYPE_RESOURCE) {
             throw new IllegalStateException("called getResPackage() on " + this);
@@ -416,12 +412,13 @@
         // Before aosp/1307777, we don't put the package name to mString1. Try to get the
         // package name from the full resource name string. Note that this is not always the same
         // as "the package used to create this icon" and this was what aosp/1307777 tried to fix.
-        if (TextUtils.isEmpty(mString1)) {
+        if (mString1 == null || TextUtils.isEmpty(mString1)) {
             return ((String) mObj1).split(":", -1)[0];
+        } else {
+            // The name of the getResPackage() API is a bit confusing. It actually returns
+            // the app package name rather than the package name in the resource table.
+            return mString1;
         }
-        // The name of the getResPackage() API is a bit confusing. It actually returns
-        // the app package name rather than the package name in the resource table.
-        return mString1;
     }
 
     /**
@@ -434,7 +431,7 @@
     @IdRes
     public int getResId() {
         if (mType == TYPE_UNKNOWN && Build.VERSION.SDK_INT >= 23) {
-            return getResId((Icon) mObj1);
+            return Api23Impl.getResId(mObj1);
         }
         if (mType != TYPE_RESOURCE) {
             throw new IllegalStateException("called getResId() on " + this);
@@ -479,7 +476,7 @@
     @NonNull
     public Uri getUri() {
         if (mType == TYPE_UNKNOWN && Build.VERSION.SDK_INT >= 23) {
-            return getUri((Icon) mObj1);
+            return Api23Impl.getUri(mObj1);
         }
         if (mType != TYPE_URI && mType != TYPE_URI_ADAPTIVE_BITMAP) {
             throw new IllegalStateException("called getUri() on " + this);
@@ -493,6 +490,7 @@
      * @param tint a color, as in {@link Drawable#setTint(int)}
      * @return this same object, for use in chained construction
      */
+    @NonNull
     public IconCompat setTint(@ColorInt int tint) {
         return setTintList(ColorStateList.valueOf(tint));
     }
@@ -503,7 +501,8 @@
      * @param tintList as in {@link Drawable#setTintList(ColorStateList)}, null to remove tint
      * @return this same object, for use in chained construction
      */
-    public IconCompat setTintList(ColorStateList tintList) {
+    @NonNull
+    public IconCompat setTintList(@Nullable ColorStateList tintList) {
         mTintList = tintList;
         return this;
     }
@@ -514,7 +513,8 @@
      * @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null
      * @return this same object, for use in chained construction
      */
-    public IconCompat setTintMode(PorterDuff.Mode mode) {
+    @NonNull
+    public IconCompat setTintMode(@Nullable PorterDuff.Mode mode) {
         mTintMode = mode;
         return this;
     }
@@ -537,62 +537,12 @@
     @RequiresApi(23)
     @NonNull
     public Icon toIcon(@Nullable Context context) {
-        Icon icon;
-        switch (mType) {
-            case TYPE_UNKNOWN:
-                // When type is unknown we are just wrapping an icon.
-                return (Icon) mObj1;
-            case TYPE_BITMAP:
-                icon = Icon.createWithBitmap((Bitmap) mObj1);
-                break;
-            case TYPE_ADAPTIVE_BITMAP:
-                if (Build.VERSION.SDK_INT >= 26) {
-                    icon = Icon.createWithAdaptiveBitmap((Bitmap) mObj1);
-                } else {
-                    icon = Icon.createWithBitmap(
-                            createLegacyIconFromAdaptiveIcon((Bitmap) mObj1, false));
-                }
-                break;
-            case TYPE_RESOURCE:
-                icon = Icon.createWithResource(getResPackage(), mInt1);
-                break;
-            case TYPE_DATA:
-                icon = Icon.createWithData((byte[]) mObj1, mInt1, mInt2);
-                break;
-            case TYPE_URI:
-                icon = Icon.createWithContentUri((String) mObj1);
-                break;
-            case TYPE_URI_ADAPTIVE_BITMAP:
-                if (Build.VERSION.SDK_INT >= 30) {
-                    icon = Icon.createWithAdaptiveBitmapContentUri(getUri());
-                    break;
-                }
-                if (context == null) {
-                    throw new IllegalArgumentException(
-                            "Context is required to resolve the file uri of the icon: " + getUri());
-                }
-                InputStream is = getUriInputStream(context);
-                if (is == null) {
-                    throw new IllegalStateException(
-                            "Cannot load adaptive icon from uri: " + getUri());
-                }
-                if (Build.VERSION.SDK_INT >= 26) {
-                    icon = Icon.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));
-                } else {
-                    icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon(
-                                BitmapFactory.decodeStream(is), false));
-                }
-                break;
-            default:
-                throw new IllegalArgumentException("Unknown type");
+        if (Build.VERSION.SDK_INT >= 23) {
+            return Api23Impl.toIcon(this, context);
+        } else {
+            throw new UnsupportedOperationException(
+                    "This method is only supported on API level 23+");
         }
-        if (mTintList != null) {
-            icon.setTintList(mTintList);
-        }
-        if (mTintMode != DEFAULT_TINT_MODE) {
-            icon.setTintMode(mTintMode);
-        }
-        return icon;
     }
 
     /**
@@ -638,7 +588,7 @@
     public Drawable loadDrawable(@NonNull Context context) {
         checkResource(context);
         if (Build.VERSION.SDK_INT >= 23) {
-            return toIcon(context).loadDrawable(context);
+            return Api23Impl.loadDrawable(toIcon(context), context);
         }
         final Drawable result = loadDrawableInner(context);
         if (result != null && (mTintList != null || mTintMode != DEFAULT_TINT_MODE)) {
@@ -691,7 +641,7 @@
                 is = getUriInputStream(context);
                 if (is != null) {
                     if (Build.VERSION.SDK_INT >= 26) {
-                        return new AdaptiveIconDrawable(null,
+                        return Api26Impl.createAdaptiveIconDrawable(null,
                                 new BitmapDrawable(context.getResources(),
                                         BitmapFactory.decodeStream(is)));
                     } else {
@@ -732,7 +682,7 @@
         return null;
     }
 
-    private static Resources getResources(Context context, String resPackage) {
+    static Resources getResources(Context context, String resPackage) {
         if ("android".equals(resPackage)) {
             return Resources.getSystem();
         } else {
@@ -1031,23 +981,7 @@
     @Nullable
     public static IconCompat createFromIcon(@NonNull Context context, @NonNull Icon icon) {
         Preconditions.checkNotNull(icon);
-        switch (getType(icon)) {
-            case TYPE_RESOURCE:
-                String resPackage = getResPackage(icon);
-                try {
-                    return createWithResource(getResources(context, resPackage), resPackage,
-                            getResId(icon));
-                } catch (Resources.NotFoundException e) {
-                    throw new IllegalArgumentException("Icon resource cannot be found");
-                }
-            case TYPE_URI:
-                return createWithContentUri(getUri(icon));
-            case TYPE_URI_ADAPTIVE_BITMAP:
-                return createWithAdaptiveBitmapContentUri(getUri(icon));
-        }
-        IconCompat iconCompat = new IconCompat(TYPE_UNKNOWN);
-        iconCompat.mObj1 = icon;
-        return iconCompat;
+        return Api23Impl.createFromIcon(context, icon);
     }
 
     /**
@@ -1058,18 +992,7 @@
     @RequiresApi(23)
     @Nullable
     public static IconCompat createFromIcon(@NonNull Icon icon) {
-        Preconditions.checkNotNull(icon);
-        switch (getType(icon)) {
-            case TYPE_RESOURCE:
-                return createWithResource(null, getResPackage(icon), getResId(icon));
-            case TYPE_URI:
-                return createWithContentUri(getUri(icon));
-            case TYPE_URI_ADAPTIVE_BITMAP:
-                return createWithAdaptiveBitmapContentUri(getUri(icon));
-        }
-        IconCompat iconCompat = new IconCompat(TYPE_UNKNOWN);
-        iconCompat.mObj1 = icon;
-        return iconCompat;
+        return Api23Impl.createFromIconInner(icon);
     }
 
     /**
@@ -1081,122 +1004,10 @@
     @RequiresApi(23)
     @Nullable
     public static IconCompat createFromIconOrNullIfZeroResId(@NonNull Icon icon) {
-        if (getType(icon) == TYPE_RESOURCE && getResId(icon) == 0) {
+        if (Api23Impl.getType(icon) == TYPE_RESOURCE && Api23Impl.getResId(icon) == 0) {
             return null;
         }
-        return createFromIcon(icon);
-    }
-
-    /**
-     * Gets the type of the icon provided.
-     * <p>
-     * Note that new types may be added later, so callers should guard against other
-     * types being returned. Returns {@link #TYPE_UNKNOWN} when the type cannot be
-     * determined.
-     */
-    @IconType
-    @RequiresApi(23)
-    private static int getType(@NonNull Icon icon) {
-        if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getType();
-        }
-        try {
-            return (int) icon.getClass().getMethod("getType").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon type " + icon, e);
-            return TYPE_UNKNOWN;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon type " + icon, e);
-            return TYPE_UNKNOWN;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon type " + icon, e);
-            return TYPE_UNKNOWN;
-        }
-    }
-
-    /**
-     * Gets the package used to create this icon.
-     * <p>
-     * Only valid for icons of type TYPE_RESOURCE.
-     * Note: This package may not be available if referenced in the future, and it is
-     * up to the caller to ensure safety if this package is re-used and/or persisted.
-     * Returns {@code null} when the value cannot be gotten.
-     */
-    @Nullable
-    @RequiresApi(23)
-    private static String getResPackage(@NonNull Icon icon) {
-        if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getResPackage();
-        }
-        try {
-            return (String) icon.getClass().getMethod("getResPackage").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon package", e);
-            return null;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon package", e);
-            return null;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon package", e);
-            return null;
-        }
-    }
-
-    /**
-     * Gets the resource used to create this icon.
-     * <p>
-     * Only valid for icons of type TYPE_RESOURCE.
-     * Note: This resource may not be available if the application changes at all, and it is
-     * up to the caller to ensure safety if this resource is re-used and/or persisted.
-     * Returns {@code 0} if the id cannot be gotten.
-     */
-    @IdRes
-    @RequiresApi(23)
-    @DrawableRes
-    private static int getResId(@NonNull Icon icon) {
-        if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getResId();
-        }
-        try {
-            return (int) icon.getClass().getMethod("getResId").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon resource", e);
-            return 0;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon resource", e);
-            return 0;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon resource", e);
-            return 0;
-        }
-    }
-
-    /**
-     * Gets the uri used to create this icon.
-     * <p>
-     * Only valid for icons of type TYPE_URI.
-     * Note: This uri may not be available in the future, and it is
-     * up to the caller to ensure safety if this uri is re-used and/or persisted.
-     * Returns {@code null} if the uri cannot be gotten.
-     */
-    @Nullable
-    @RequiresApi(23)
-    private static Uri getUri(@NonNull Icon icon) {
-        if (Build.VERSION.SDK_INT >= 28) {
-            return icon.getUri();
-        }
-        try {
-            return (Uri) icon.getClass().getMethod("getUri").invoke(icon);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to get icon uri", e);
-            return null;
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to get icon uri", e);
-            return null;
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to get icon uri", e);
-            return null;
-        }
+        return Api23Impl.createFromIconInner(icon);
     }
 
     /**
@@ -1236,8 +1047,8 @@
         BitmapShader shader = new BitmapShader(adaptiveIconBitmap, Shader.TileMode.CLAMP,
                 Shader.TileMode.CLAMP);
         Matrix shift = new Matrix();
-        shift.setTranslate(-(adaptiveIconBitmap.getWidth() - size) / 2,
-                -(adaptiveIconBitmap.getHeight() - size) / 2);
+        shift.setTranslate(-(adaptiveIconBitmap.getWidth() - size) / 2.0f,
+                -(adaptiveIconBitmap.getHeight() - size) / 2.0f);
         shader.setLocalMatrix(shift);
         paint.setShader(shader);
         canvas.drawCircle(center, center, radius, paint);
@@ -1245,4 +1056,288 @@
         canvas.setBitmap(null);
         return icon;
     }
+
+    @RequiresApi(28)
+    static class Api28Impl {
+        private Api28Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static String getResPackage(Object icon) {
+            return ((Icon) icon).getResPackage();
+        }
+
+        @DoNotInline
+        static int getType(Object icon) {
+            return ((Icon) icon).getType();
+        }
+
+        @DoNotInline
+        static int getResId(Object icon) {
+            return ((Icon) icon).getResId();
+        }
+
+        @DoNotInline
+        static Uri getUri(Object icon) {
+            return ((Icon) icon).getUri();
+        }
+    }
+
+    @RequiresApi(26)
+    static class Api26Impl {
+        private Api26Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static Drawable createAdaptiveIconDrawable(Drawable backgroundDrawable,
+                Drawable foregroundDrawable) {
+            return new AdaptiveIconDrawable(backgroundDrawable, foregroundDrawable);
+        }
+
+        @DoNotInline
+        static Icon createWithAdaptiveBitmap(Bitmap bits) {
+            return Icon.createWithAdaptiveBitmap(bits);
+        }
+    }
+
+    @RequiresApi(30)
+    static class Api30Impl {
+        private Api30Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static Icon createWithAdaptiveBitmapContentUri(Uri uri) {
+            return Icon.createWithAdaptiveBitmapContentUri(uri);
+        }
+
+    }
+
+    @RequiresApi(23)
+    static class Api23Impl {
+        private Api23Impl() {
+            // This class is not instantiable.
+        }
+
+        @Nullable
+        static IconCompat createFromIcon(@NonNull Context context, @NonNull Icon icon) {
+            switch (getType(icon)) {
+                case TYPE_RESOURCE:
+                    String resPackage = getResPackage(icon);
+                    try {
+                        return createWithResource(getResources(context, resPackage), resPackage,
+                                getResId(icon));
+                    } catch (Resources.NotFoundException e) {
+                        throw new IllegalArgumentException("Icon resource cannot be found");
+                    }
+                case TYPE_URI:
+                    return createWithContentUri(getUri(icon));
+                case TYPE_URI_ADAPTIVE_BITMAP:
+                    return createWithAdaptiveBitmapContentUri(getUri(icon));
+            }
+            IconCompat iconCompat = new IconCompat(TYPE_UNKNOWN);
+            iconCompat.mObj1 = icon;
+            return iconCompat;
+        }
+
+        /**
+         * Gets the type of the icon provided.
+         * <p>
+         * Note that new types may be added later, so callers should guard against other
+         * types being returned. Returns {@link #TYPE_UNKNOWN} when the type cannot be
+         * determined.
+         */
+        @IconType
+        static int getType(@NonNull Object icon) {
+            if (Build.VERSION.SDK_INT >= 28) {
+                return Api28Impl.getType(icon);
+            } else {
+                try {
+                    return (int) icon.getClass().getMethod("getType").invoke(icon);
+                } catch (IllegalAccessException e) {
+                    Log.e(TAG, "Unable to get icon type " + icon, e);
+                    return TYPE_UNKNOWN;
+                } catch (InvocationTargetException e) {
+                    Log.e(TAG, "Unable to get icon type " + icon, e);
+                    return TYPE_UNKNOWN;
+                } catch (NoSuchMethodException e) {
+                    Log.e(TAG, "Unable to get icon type " + icon, e);
+                    return TYPE_UNKNOWN;
+                }
+            }
+        }
+
+        /**
+         * Gets the package used to create this icon.
+         * <p>
+         * Only valid for icons of type TYPE_RESOURCE.
+         * Note: This package may not be available if referenced in the future, and it is
+         * up to the caller to ensure safety if this package is re-used and/or persisted.
+         * Returns {@code null} when the value cannot be gotten.
+         */
+        @Nullable
+        static String getResPackage(@NonNull Object icon) {
+            if (Build.VERSION.SDK_INT >= 28) {
+                return Api28Impl.getResPackage(icon);
+            } else {
+                try {
+                    return (String) icon.getClass().getMethod("getResPackage").invoke(icon);
+                } catch (IllegalAccessException e) {
+                    Log.e(TAG, "Unable to get icon package", e);
+                    return null;
+                } catch (InvocationTargetException e) {
+                    Log.e(TAG, "Unable to get icon package", e);
+                    return null;
+                } catch (NoSuchMethodException e) {
+                    Log.e(TAG, "Unable to get icon package", e);
+                    return null;
+                }
+            }
+        }
+
+        /**
+         * Used internally to avoid casting to Icon class in code accessible to SDK < 23.
+         */
+        static IconCompat createFromIconInner(@NonNull Object icon) {
+            Preconditions.checkNotNull(icon);
+            switch (getType(icon)) {
+                case TYPE_RESOURCE:
+                    return createWithResource(null, getResPackage(icon), getResId(icon));
+                case TYPE_URI:
+                    return createWithContentUri(getUri(icon));
+                case TYPE_URI_ADAPTIVE_BITMAP:
+                    return createWithAdaptiveBitmapContentUri(getUri(icon));
+            }
+            IconCompat iconCompat = new IconCompat(TYPE_UNKNOWN);
+            iconCompat.mObj1 = icon;
+            return iconCompat;
+        }
+
+        /**
+         * Gets the resource used to create this icon.
+         * <p>
+         * Only valid for icons of type TYPE_RESOURCE.
+         * Note: This resource may not be available if the application changes at all, and it is
+         * up to the caller to ensure safety if this resource is re-used and/or persisted.
+         * Returns {@code 0} if the id cannot be gotten.
+         */
+        @IdRes
+        @DrawableRes
+        static int getResId(@NonNull Object icon) {
+            if (Build.VERSION.SDK_INT >= 28) {
+                return Api28Impl.getResId(icon);
+            } else {
+                try {
+                    return (int) icon.getClass().getMethod("getResId").invoke(icon);
+                } catch (IllegalAccessException e) {
+                    Log.e(TAG, "Unable to get icon resource", e);
+                    return 0;
+                } catch (InvocationTargetException e) {
+                    Log.e(TAG, "Unable to get icon resource", e);
+                    return 0;
+                } catch (NoSuchMethodException e) {
+                    Log.e(TAG, "Unable to get icon resource", e);
+                    return 0;
+                }
+            }
+        }
+
+        /**
+         * Gets the uri used to create this icon.
+         * <p>
+         * Only valid for icons of type TYPE_URI.
+         * Note: This uri may not be available in the future, and it is
+         * up to the caller to ensure safety if this uri is re-used and/or persisted.
+         * Returns {@code null} if the uri cannot be gotten.
+         */
+        @Nullable
+        @DoNotInline
+        static Uri getUri(@NonNull Object icon) {
+            if (Build.VERSION.SDK_INT >= 28) {
+                return Api28Impl.getUri(icon);
+            } else {
+                try {
+                    return (Uri) icon.getClass().getMethod("getUri").invoke(icon);
+                } catch (IllegalAccessException e) {
+                    Log.e(TAG, "Unable to get icon uri", e);
+                    return null;
+                } catch (InvocationTargetException e) {
+                    Log.e(TAG, "Unable to get icon uri", e);
+                    return null;
+                } catch (NoSuchMethodException e) {
+                    Log.e(TAG, "Unable to get icon uri", e);
+                    return null;
+                }
+            }
+        }
+
+        @DoNotInline
+        static Icon toIcon(IconCompat iconCompat, Context context) {
+            Icon icon;
+            switch (iconCompat.mType) {
+                case TYPE_UNKNOWN:
+                    // When type is unknown we are just wrapping an icon.
+                    return (Icon) iconCompat.mObj1;
+                case TYPE_BITMAP:
+                    icon = Icon.createWithBitmap((Bitmap) iconCompat.mObj1);
+                    break;
+                case TYPE_ADAPTIVE_BITMAP:
+                    if (Build.VERSION.SDK_INT >= 26) {
+                        icon = Api26Impl.createWithAdaptiveBitmap((Bitmap) iconCompat.mObj1);
+                    } else {
+                        icon = Icon.createWithBitmap(
+                                createLegacyIconFromAdaptiveIcon((Bitmap) iconCompat.mObj1, false));
+                    }
+                    break;
+                case TYPE_RESOURCE:
+                    icon = Icon.createWithResource(iconCompat.getResPackage(), iconCompat.mInt1);
+                    break;
+                case TYPE_DATA:
+                    icon = Icon.createWithData((byte[]) iconCompat.mObj1, iconCompat.mInt1,
+                            iconCompat.mInt2);
+                    break;
+                case TYPE_URI:
+                    icon = Icon.createWithContentUri((String) iconCompat.mObj1);
+                    break;
+                case TYPE_URI_ADAPTIVE_BITMAP:
+                    if (Build.VERSION.SDK_INT >= 30) {
+                        icon = Api30Impl.createWithAdaptiveBitmapContentUri(iconCompat.getUri());
+                        break;
+                    }
+                    if (context == null) {
+                        throw new IllegalArgumentException(
+                                "Context is required to resolve the file uri of the icon: "
+                                        + iconCompat.getUri());
+                    }
+                    InputStream is = iconCompat.getUriInputStream(context);
+                    if (is == null) {
+                        throw new IllegalStateException(
+                                "Cannot load adaptive icon from uri: " + iconCompat.getUri());
+                    }
+                    if (Build.VERSION.SDK_INT >= 26) {
+                        icon = Api26Impl.createWithAdaptiveBitmap(BitmapFactory.decodeStream(is));
+                    } else {
+                        icon = Icon.createWithBitmap(createLegacyIconFromAdaptiveIcon(
+                                BitmapFactory.decodeStream(is), false));
+                    }
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unknown type");
+            }
+            if (iconCompat.mTintList != null) {
+                icon.setTintList(iconCompat.mTintList);
+            }
+            if (iconCompat.mTintMode != DEFAULT_TINT_MODE) {
+                icon.setTintMode(iconCompat.mTintMode);
+            }
+            return icon;
+        }
+
+        @DoNotInline
+        static Drawable loadDrawable(Icon icon, Context context) {
+            return icon.loadDrawable(context);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/location/LocationListenerCompat.java b/core/core/src/main/java/androidx/core/location/LocationListenerCompat.java
index d626af1..070815b 100644
--- a/core/core/src/main/java/androidx/core/location/LocationListenerCompat.java
+++ b/core/core/src/main/java/androidx/core/location/LocationListenerCompat.java
@@ -16,12 +16,15 @@
 
 package androidx.core.location;
 
+import android.location.Location;
 import android.location.LocationListener;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
+import java.util.List;
+
 /**
  * A version of {@link LocationListener} suitable for use on all API levels.
  */
@@ -35,4 +38,15 @@
 
     @Override
     default void onProviderDisabled(@NonNull String provider) {}
+
+    @Override
+    default void onLocationChanged(@NonNull List<Location> locations) {
+        final int size = locations.size();
+        for (int i = 0; i < size; i++) {
+            onLocationChanged(locations.get(i));
+        }
+    }
+
+    @Override
+    default void onFlushComplete(int requestCode) {}
 }
diff --git a/core/core/src/main/java/androidx/core/location/LocationManagerCompat.java b/core/core/src/main/java/androidx/core/location/LocationManagerCompat.java
index 495e55b..3f04d30 100644
--- a/core/core/src/main/java/androidx/core/location/LocationManagerCompat.java
+++ b/core/core/src/main/java/androidx/core/location/LocationManagerCompat.java
@@ -26,6 +26,7 @@
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.location.GnssStatus;
 import android.location.GpsStatus;
@@ -72,7 +73,7 @@
 /**
  * Helper for accessing features in {@link LocationManager}.
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation", "unused"})
 public final class LocationManagerCompat {
 
     private static final long GET_CURRENT_LOCATION_TIMEOUT_MS = 30 * 1000;
@@ -80,8 +81,6 @@
     private static final long PRE_N_LOOPER_TIMEOUT_S = 5;
 
     private static Field sContextField;
-    private static Method sRequestLocationUpdatesExecutorMethod;
-    private static Method sRequestLocationUpdatesLooperMethod;
 
     /**
      * Returns the current enabled/disabled state of location.
@@ -207,13 +206,7 @@
                 Looper.getMainLooper());
 
         if (cancellationSignal != null) {
-            cancellationSignal.setOnCancelListener(new CancellationSignal.OnCancelListener() {
-                @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
-                @Override
-                public void onCancel() {
-                    listener.cancel();
-                }
-            });
+            cancellationSignal.setOnCancelListener(listener::cancel);
         }
 
         listener.startTimeout(GET_CURRENT_LOCATION_TIMEOUT_MS);
@@ -231,7 +224,6 @@
      * {@link LocationManager#requestLocationUpdates(String, LocationRequest, Executor,
      * LocationListener)} for more information.
      */
-    @SuppressWarnings("JavaReflectionMemberAccess")
     @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
     public static void requestLocationUpdates(@NonNull LocationManager locationManager,
             @NonNull String provider,
@@ -244,54 +236,17 @@
             return;
         }
 
-        if (VERSION.SDK_INT >= 30) {
-            try {
-                if (sRequestLocationUpdatesExecutorMethod == null) {
-                    sRequestLocationUpdatesExecutorMethod = LocationManager.class.getDeclaredMethod(
-                            "requestLocationUpdates",
-                            LocationRequest.class, Executor.class, LocationListener.class);
-                    sRequestLocationUpdatesExecutorMethod.setAccessible(true);
-                }
-
-                LocationRequest request = locationRequest.toLocationRequest(provider);
-                if (request != null) {
-                    sRequestLocationUpdatesExecutorMethod.invoke(locationManager, request, executor,
-                            listener);
-                    return;
-                }
-            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
-                // ignored
-            } catch (UnsupportedOperationException e) {
-                // ignored
-            }
+        if (VERSION.SDK_INT >= 30 && Api30Impl.tryRequestLocationUpdates(
+                locationManager, provider, locationRequest, executor, listener)) {
+            return;
         }
 
         LocationListenerTransport transport = new LocationListenerTransport(
                 new LocationListenerKey(provider, listener), executor);
 
-        if (VERSION.SDK_INT >= 19) {
-            try {
-                if (sRequestLocationUpdatesLooperMethod == null) {
-                    sRequestLocationUpdatesLooperMethod = LocationManager.class.getDeclaredMethod(
-                            "requestLocationUpdates",
-                            LocationRequest.class, LocationListener.class, Looper.class);
-                    sRequestLocationUpdatesLooperMethod.setAccessible(true);
-                }
-
-                LocationRequest request = locationRequest.toLocationRequest(provider);
-                if (request != null) {
-                    synchronized (sLocationListeners) {
-                        sRequestLocationUpdatesLooperMethod.invoke(locationManager, request,
-                                transport, Looper.getMainLooper());
-                        registerLocationListenerTransport(locationManager, transport);
-                        return;
-                    }
-                }
-            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
-                // ignored
-            } catch (UnsupportedOperationException e) {
-                // ignored
-            }
+        if (VERSION.SDK_INT >= 19 && Api19Impl.tryRequestLocationUpdates(
+                locationManager, provider, locationRequest, transport)) {
+            return;
         }
 
         synchronized (sLocationListeners) {
@@ -304,7 +259,7 @@
 
     @GuardedBy("sLocationListeners")
     @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
-    private static void registerLocationListenerTransport(LocationManager locationManager,
+    static void registerLocationListenerTransport(LocationManager locationManager,
             LocationListenerTransport transport) {
         WeakReference<LocationListenerTransport> oldRef =
                 sLocationListeners.put(transport.getKey(), new WeakReference<>(transport));
@@ -323,7 +278,6 @@
      * {@link LocationManager#requestLocationUpdates(String, LocationRequest, Executor,
      * LocationListener)} for more information.
      */
-    @SuppressWarnings("JavaReflectionMemberAccess")
     @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
     public static void requestLocationUpdates(@NonNull LocationManager locationManager,
             @NonNull String provider,
@@ -337,26 +291,9 @@
             return;
         }
 
-        if (VERSION.SDK_INT >= 19) {
-            try {
-                if (sRequestLocationUpdatesLooperMethod == null) {
-                    sRequestLocationUpdatesLooperMethod = LocationManager.class.getDeclaredMethod(
-                            "requestLocationUpdates",
-                            LocationRequest.class, LocationListener.class, Looper.class);
-                    sRequestLocationUpdatesLooperMethod.setAccessible(true);
-                }
-
-                LocationRequest request = locationRequest.toLocationRequest(provider);
-                if (request != null) {
-                    sRequestLocationUpdatesLooperMethod.invoke(locationManager, request, listener,
-                            looper);
-                    return;
-                }
-            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
-                // ignored
-            } catch (UnsupportedOperationException e) {
-                // ignored
-            }
+        if (VERSION.SDK_INT >= 19 && Api19Impl.tryRequestLocationUpdates(
+                    locationManager, provider, locationRequest, listener, looper)) {
+            return;
         }
 
         locationManager.requestLocationUpdates(provider, locationRequest.getIntervalMillis(),
@@ -490,39 +427,12 @@
     @RequiresPermission(ACCESS_FINE_LOCATION)
     private static boolean registerGnssStatusCallback(final LocationManager locationManager,
             Handler baseHandler, Executor executor, GnssStatusCompat.Callback callback) {
-        if (VERSION.SDK_INT >= VERSION_CODES.R) {
-            synchronized (GnssLazyLoader.sGnssStatusListeners) {
-                GnssStatusTransport transport =
-                        (GnssStatusTransport) GnssLazyLoader.sGnssStatusListeners.get(callback);
-                if (transport == null) {
-                    transport = new GnssStatusTransport(callback);
-                }
-                if (locationManager.registerGnssStatusCallback(executor, transport)) {
-                    GnssLazyLoader.sGnssStatusListeners.put(callback, transport);
-                    return true;
-                } else {
-                    return false;
-                }
-            }
-        } else if (VERSION.SDK_INT >= VERSION_CODES.N) {
-            Preconditions.checkArgument(baseHandler != null);
-            synchronized (GnssLazyLoader.sGnssStatusListeners) {
-                PreRGnssStatusTransport transport =
-                        (PreRGnssStatusTransport) GnssLazyLoader.sGnssStatusListeners.get(callback);
-                if (transport == null) {
-                    transport = new PreRGnssStatusTransport(callback);
-                } else {
-                    transport.unregister();
-                }
-                transport.register(executor);
-
-                if (locationManager.registerGnssStatusCallback(transport, baseHandler)) {
-                    GnssLazyLoader.sGnssStatusListeners.put(callback, transport);
-                    return true;
-                } else {
-                    return false;
-                }
-            }
+        if (VERSION.SDK_INT >= 30) {
+            return Api30Impl.registerGnssStatusCallback(
+                    locationManager, baseHandler, executor, callback);
+        } else if (VERSION.SDK_INT >= 24) {
+            return Api24Impl.registerGnssStatusCallback(
+                    locationManager, baseHandler, executor, callback);
         } else {
             Preconditions.checkArgument(baseHandler != null);
             synchronized (GnssLazyLoader.sGnssStatusListeners) {
@@ -591,22 +501,11 @@
      */
     public static void unregisterGnssStatusCallback(@NonNull LocationManager locationManager,
             @NonNull GnssStatusCompat.Callback callback) {
-        if (VERSION.SDK_INT >= VERSION_CODES.R) {
+        if (VERSION.SDK_INT >= 24) {
             synchronized (GnssLazyLoader.sGnssStatusListeners) {
-                GnssStatusTransport transport =
-                        (GnssStatusTransport) GnssLazyLoader.sGnssStatusListeners.remove(callback);
+                Object transport = GnssLazyLoader.sGnssStatusListeners.remove(callback);
                 if (transport != null) {
-                    locationManager.unregisterGnssStatusCallback(transport);
-                }
-            }
-        } else if (VERSION.SDK_INT >= VERSION_CODES.N) {
-            synchronized (GnssLazyLoader.sGnssStatusListeners) {
-                PreRGnssStatusTransport transport =
-                        (PreRGnssStatusTransport) GnssLazyLoader.sGnssStatusListeners.remove(
-                                callback);
-                if (transport != null) {
-                    transport.unregister();
-                    locationManager.unregisterGnssStatusCallback(transport);
+                    Api24Impl.unregisterGnssStatusCallback(locationManager, transport);
                 }
             }
         } else {
@@ -654,7 +553,7 @@
         @Nullable volatile LocationListenerKey mKey;
         final Executor mExecutor;
 
-        LocationListenerTransport(LocationListenerKey key, Executor executor) {
+        LocationListenerTransport(@Nullable LocationListenerKey key, Executor executor) {
             mKey = key;
             mExecutor = executor;
         }
@@ -758,7 +657,7 @@
         }
     }
 
-    @RequiresApi(VERSION_CODES.R)
+    @RequiresApi(30)
     private static class GnssStatusTransport extends GnssStatus.Callback {
 
         final GnssStatusCompat.Callback mCallback;
@@ -789,7 +688,7 @@
         }
     }
 
-    @RequiresApi(VERSION_CODES.N)
+    @RequiresApi(24)
     private static class PreRGnssStatusTransport extends GnssStatus.Callback {
 
         final GnssStatusCompat.Callback mCallback;
@@ -950,63 +849,6 @@
         }
     }
 
-    @RequiresApi(31)
-    private static class Api31Impl {
-        private Api31Impl() {}
-
-        @DoNotInline
-        static boolean hasProvider(LocationManager locationManager, @NonNull String provider) {
-            return locationManager.hasProvider(provider);
-        }
-
-        @DoNotInline
-        @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
-        static void requestLocationUpdates(LocationManager locationManager,
-                @NonNull String provider, @NonNull LocationRequest locationRequest,
-                @NonNull Executor executor, @NonNull LocationListener listener) {
-            locationManager.requestLocationUpdates(provider, locationRequest, executor, listener);
-        }
-    }
-
-    @RequiresApi(30)
-    private static class Api30Impl {
-        private Api30Impl() {}
-
-        @DoNotInline
-        @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
-        static void getCurrentLocation(LocationManager locationManager, @NonNull String provider,
-                @Nullable CancellationSignal cancellationSignal,
-                @NonNull Executor executor, final @NonNull Consumer<Location> consumer) {
-            locationManager.getCurrentLocation(provider,
-                    cancellationSignal != null
-                            ? (android.os.CancellationSignal)
-                                cancellationSignal.getCancellationSignalObject()
-                            : null,
-                    executor,
-                    consumer::accept);
-        }
-    }
-
-    @RequiresApi(28)
-    private static class Api28Impl {
-        private Api28Impl() {}
-
-        @DoNotInline
-        static boolean isLocationEnabled(LocationManager locationManager) {
-            return locationManager.isLocationEnabled();
-        }
-
-        @DoNotInline
-        static String getGnssHardwareModelName(LocationManager locationManager) {
-            return locationManager.getGnssHardwareModelName();
-        }
-
-        @DoNotInline
-        static int getGnssYearOfHardware(LocationManager locationManager) {
-            return locationManager.getGnssYearOfHardware();
-        }
-    }
-
     private static final class CancellableLocationListener implements LocationListener {
 
         private final LocationManager mLocationManager;
@@ -1042,6 +884,7 @@
             cleanup();
         }
 
+        @SuppressLint("MissingPermission") // Can't annotate a lambda
         public void startTimeout(long timeoutMs) {
             synchronized (this) {
                 if (mTriggered) {
@@ -1051,13 +894,9 @@
                 // ideally this would be a wakeup alarm, but that would require another compat layer
                 // to deal with translating pending intent alarms into listeners which doesn't exist
                 // at the moment, so this should be sufficient to prevent extreme battery drain
-                mTimeoutRunnable = new Runnable() {
-                    @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
-                    @Override
-                    public void run() {
-                        mTimeoutRunnable = null;
-                        onLocationChanged((Location) null);
-                    }
+                mTimeoutRunnable = () -> {
+                    mTimeoutRunnable = null;
+                    onLocationChanged((Location) null);
                 };
                 mTimeoutHandler.postDelayed(mTimeoutRunnable, timeoutMs);
             }
@@ -1130,4 +969,253 @@
             }
         }
     }
+
+    @RequiresApi(31)
+    private static class Api31Impl {
+        private Api31Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean hasProvider(LocationManager locationManager, @NonNull String provider) {
+            return locationManager.hasProvider(provider);
+        }
+
+        @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
+        @DoNotInline
+        static void requestLocationUpdates(LocationManager locationManager,
+                @NonNull String provider, @NonNull LocationRequest locationRequest,
+                @NonNull Executor executor, @NonNull LocationListener listener) {
+            locationManager.requestLocationUpdates(provider, locationRequest, executor, listener);
+        }
+    }
+
+    @RequiresApi(30)
+    private static class Api30Impl {
+        private static Class<?> sLocationRequestClass;
+        private static Method sRequestLocationUpdatesExecutorMethod;
+
+        private Api30Impl() {
+            // This class is not instantiable.
+        }
+
+        @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
+        @DoNotInline
+        static void getCurrentLocation(LocationManager locationManager, @NonNull String provider,
+                @Nullable CancellationSignal cancellationSignal,
+                @NonNull Executor executor, final @NonNull Consumer<Location> consumer) {
+            locationManager.getCurrentLocation(provider,
+                    cancellationSignal != null
+                            ? (android.os.CancellationSignal)
+                            cancellationSignal.getCancellationSignalObject()
+                            : null,
+                    executor,
+                    consumer::accept);
+        }
+
+        @SuppressWarnings("JavaReflectionMemberAccess")
+        @DoNotInline
+        public static boolean tryRequestLocationUpdates(LocationManager locationManager,
+                String provider, LocationRequestCompat locationRequest, Executor executor,
+                LocationListenerCompat listener) {
+            if (VERSION.SDK_INT >= 30) { // Satisfy reflection lint check
+                try {
+                    if (sLocationRequestClass == null) {
+                        sLocationRequestClass = Class.forName("android.location.LocationRequest");
+                    }
+                    if (sRequestLocationUpdatesExecutorMethod == null) {
+                        sRequestLocationUpdatesExecutorMethod =
+                                LocationManager.class.getDeclaredMethod(
+                                        "requestLocationUpdates",
+                                        sLocationRequestClass, Executor.class,
+                                        LocationListener.class);
+                        sRequestLocationUpdatesExecutorMethod.setAccessible(true);
+                    }
+
+                    Object request = locationRequest.toLocationRequest(provider);
+                    if (request != null) {
+                        sRequestLocationUpdatesExecutorMethod.invoke(locationManager, request,
+                                executor,
+                                listener);
+                        return true;
+                    }
+                } catch (NoSuchMethodException
+                        | InvocationTargetException
+                        | IllegalAccessException
+                        | ClassNotFoundException
+                        | UnsupportedOperationException e) {
+                    // ignored
+                }
+            }
+            return false;
+        }
+
+        @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
+        @DoNotInline
+        public static boolean registerGnssStatusCallback(LocationManager locationManager,
+                Handler baseHandler, Executor executor, GnssStatusCompat.Callback callback) {
+            synchronized (GnssLazyLoader.sGnssStatusListeners) {
+                GnssStatusTransport transport =
+                        (GnssStatusTransport) GnssLazyLoader.sGnssStatusListeners.get(callback);
+                if (transport == null) {
+                    transport = new GnssStatusTransport(callback);
+                }
+                if (locationManager.registerGnssStatusCallback(executor, transport)) {
+                    GnssLazyLoader.sGnssStatusListeners.put(callback, transport);
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        }
+    }
+
+    @RequiresApi(28)
+    private static class Api28Impl {
+        private Api28Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean isLocationEnabled(LocationManager locationManager) {
+            return locationManager.isLocationEnabled();
+        }
+
+        @DoNotInline
+        static String getGnssHardwareModelName(LocationManager locationManager) {
+            return locationManager.getGnssHardwareModelName();
+        }
+
+        @DoNotInline
+        static int getGnssYearOfHardware(LocationManager locationManager) {
+            return locationManager.getGnssYearOfHardware();
+        }
+    }
+
+    @RequiresApi(19)
+    static class Api19Impl {
+        private static Class<?> sLocationRequestClass;
+        private static Method sRequestLocationUpdatesLooperMethod;
+
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        @SuppressWarnings("JavaReflectionMemberAccess")
+        @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
+        @DoNotInline
+        static boolean tryRequestLocationUpdates(LocationManager locationManager,
+                String provider, LocationRequestCompat locationRequest,
+                LocationListenerTransport transport) {
+            if (VERSION.SDK_INT >= 19) { // Satisfy reflection lint check
+                try {
+                    if (sLocationRequestClass == null) {
+                        sLocationRequestClass = Class.forName("android.location.LocationRequest");
+                    }
+                    if (sRequestLocationUpdatesLooperMethod == null) {
+                        sRequestLocationUpdatesLooperMethod =
+                                LocationManager.class.getDeclaredMethod(
+                                        "requestLocationUpdates",
+                                        sLocationRequestClass, LocationListener.class,
+                                        Looper.class);
+                        sRequestLocationUpdatesLooperMethod.setAccessible(true);
+                    }
+
+                    LocationRequest request = locationRequest.toLocationRequest(provider);
+                    if (request != null) {
+                        synchronized (sLocationListeners) {
+                            sRequestLocationUpdatesLooperMethod.invoke(locationManager, request,
+                                    transport, Looper.getMainLooper());
+                            registerLocationListenerTransport(locationManager, transport);
+                            return true;
+                        }
+                    }
+                } catch (NoSuchMethodException
+                        | InvocationTargetException
+                        | IllegalAccessException
+                        | ClassNotFoundException
+                        | UnsupportedOperationException e) {
+                    // ignored
+                }
+            }
+            return false;
+        }
+
+        @SuppressWarnings("JavaReflectionMemberAccess")
+        @DoNotInline
+        static boolean tryRequestLocationUpdates(LocationManager locationManager, String provider,
+                LocationRequestCompat locationRequest, LocationListenerCompat listener,
+                Looper looper) {
+            if (VERSION.SDK_INT >= 19) { // Satisfy reflection lint check
+                try {
+                    if (sLocationRequestClass == null) {
+                        sLocationRequestClass = Class.forName("android.location.LocationRequest");
+                    }
+
+                    if (sRequestLocationUpdatesLooperMethod == null) {
+                        sRequestLocationUpdatesLooperMethod =
+                                LocationManager.class.getDeclaredMethod(
+                                        "requestLocationUpdates",
+                                        sLocationRequestClass, LocationListener.class,
+                                        Looper.class);
+                        sRequestLocationUpdatesLooperMethod.setAccessible(true);
+                    }
+
+                    LocationRequest request = locationRequest.toLocationRequest(provider);
+                    if (request != null) {
+                        sRequestLocationUpdatesLooperMethod.invoke(
+                                locationManager, request, listener, looper);
+                        return true;
+                    }
+                } catch (NoSuchMethodException
+                        | InvocationTargetException
+                        | IllegalAccessException
+                        | ClassNotFoundException
+                        | UnsupportedOperationException e) {
+                    // ignored
+                }
+            }
+            return false;
+        }
+    }
+
+    @RequiresApi(24)
+    static class Api24Impl {
+        private Api24Impl() {
+            // This class is not instantiable.
+        }
+
+        @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
+        @DoNotInline
+        static boolean registerGnssStatusCallback(LocationManager locationManager,
+                Handler baseHandler, Executor executor, GnssStatusCompat.Callback callback) {
+            Preconditions.checkArgument(baseHandler != null);
+
+            synchronized (GnssLazyLoader.sGnssStatusListeners) {
+                PreRGnssStatusTransport transport =
+                        (PreRGnssStatusTransport) GnssLazyLoader.sGnssStatusListeners.get(callback);
+                if (transport == null) {
+                    transport = new PreRGnssStatusTransport(callback);
+                } else {
+                    transport.unregister();
+                }
+                transport.register(executor);
+
+                if (locationManager.registerGnssStatusCallback(transport, baseHandler)) {
+                    GnssLazyLoader.sGnssStatusListeners.put(callback, transport);
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        }
+
+        @DoNotInline
+        static void unregisterGnssStatusCallback(LocationManager locationManager, Object callback) {
+            if (callback instanceof PreRGnssStatusTransport) {
+                ((PreRGnssStatusTransport) callback).unregister();
+            }
+            locationManager.unregisterGnssStatusCallback((GnssStatus.Callback) callback);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/location/LocationRequestCompat.java b/core/core/src/main/java/androidx/core/location/LocationRequestCompat.java
index 0e7e180..3837850 100644
--- a/core/core/src/main/java/androidx/core/location/LocationRequestCompat.java
+++ b/core/core/src/main/java/androidx/core/location/LocationRequestCompat.java
@@ -20,9 +20,11 @@
 
 import static java.lang.Math.min;
 
+import android.annotation.SuppressLint;
 import android.location.LocationRequest;
 import android.os.Build.VERSION;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.FloatRange;
 import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
@@ -87,12 +89,6 @@
 
     private static final long IMPLICIT_MIN_UPDATE_INTERVAL = -1;
 
-    private static Method sCreateFromDeprecatedProviderMethod;
-    private static Method sSetQualityMethod;
-    private static Method sSetFastestIntervalMethod;
-    private static Method sSetNumUpdatesMethod;
-    private static Method sSetExpireInMethod;
-
     @Quality
     final int mQuality;
     final long mIntervalMillis;
@@ -219,14 +215,7 @@
     @RequiresApi(31)
     @NonNull
     public LocationRequest toLocationRequest() {
-        return new LocationRequest.Builder(getIntervalMillis())
-                .setQuality(getQuality())
-                .setMinUpdateIntervalMillis(getMinUpdateIntervalMillis())
-                .setDurationMillis(getDurationMillis())
-                .setMaxUpdates(getMaxUpdates())
-                .setMinUpdateDistanceMeters(getMinUpdateDistanceMeters())
-                .setMaxUpdateDelayMillis(getMaxUpdateDelayMillis())
-                .build();
+        return Api31Impl.toLocationRequest(this);
     }
 
     /**
@@ -239,68 +228,15 @@
      * @return platform class object
      * @see LocationRequest
      */
-    @SuppressWarnings("JavaReflectionMemberAccess")
+    @SuppressLint("NewApi")
     @RequiresApi(19)
     @Nullable
     public LocationRequest toLocationRequest(@NonNull String provider) {
         if (VERSION.SDK_INT >= 31) {
             return toLocationRequest();
         } else {
-            try {
-                if (sCreateFromDeprecatedProviderMethod == null) {
-                    sCreateFromDeprecatedProviderMethod = LocationRequest.class.getDeclaredMethod(
-                            "createFromDeprecatedProvider", String.class, long.class, float.class,
-                            boolean.class);
-                    sCreateFromDeprecatedProviderMethod.setAccessible(true);
-                }
-
-                LocationRequest request =
-                        (LocationRequest) sCreateFromDeprecatedProviderMethod.invoke(null, provider,
-                                getIntervalMillis(),
-                                getMinUpdateDistanceMeters(), false);
-                if (request == null) {
-                    return null;
-                }
-
-                if (sSetQualityMethod == null) {
-                    sSetQualityMethod = LocationRequest.class.getDeclaredMethod(
-                            "setQuality", int.class);
-                    sSetQualityMethod.setAccessible(true);
-                }
-                sSetQualityMethod.invoke(request, getQuality());
-
-                if (sSetFastestIntervalMethod == null) {
-                    sSetFastestIntervalMethod = LocationRequest.class.getDeclaredMethod(
-                            "setFastestInterval", long.class);
-                    sSetFastestIntervalMethod.setAccessible(true);
-                }
-
-                sSetFastestIntervalMethod.invoke(request, getMinUpdateIntervalMillis());
-
-                if (getMaxUpdates() < Integer.MAX_VALUE) {
-                    if (sSetNumUpdatesMethod == null) {
-                        sSetNumUpdatesMethod = LocationRequest.class.getDeclaredMethod(
-                                "setNumUpdates", int.class);
-                        sSetNumUpdatesMethod.setAccessible(true);
-                    }
-
-                    sSetNumUpdatesMethod.invoke(request, getMaxUpdates());
-                }
-
-                if (getDurationMillis() < Long.MAX_VALUE) {
-                    if (sSetExpireInMethod == null) {
-                        sSetExpireInMethod = LocationRequest.class.getDeclaredMethod(
-                                "setExpireIn", long.class);
-                        sSetExpireInMethod.setAccessible(true);
-                    }
-
-                    sSetExpireInMethod.invoke(request, getDurationMillis());
-                }
-
-                return request;
-            } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
-                return null;
-            }
+            // This cast will cause a VFY failure on SDK < 19, but we're stuck with it.
+            return (LocationRequest) Api19Impl.toLocationRequest(this, provider);
         }
     }
 
@@ -563,4 +499,104 @@
                     mMaxUpdateDelayMillis);
         }
     }
+
+    @RequiresApi(31)
+    private static class Api31Impl {
+        private Api31Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        public static LocationRequest toLocationRequest(LocationRequestCompat obj) {
+            return new LocationRequest.Builder(obj.getIntervalMillis())
+                    .setQuality(obj.getQuality())
+                    .setMinUpdateIntervalMillis(obj.getMinUpdateIntervalMillis())
+                    .setDurationMillis(obj.getDurationMillis())
+                    .setMaxUpdates(obj.getMaxUpdates())
+                    .setMinUpdateDistanceMeters(obj.getMinUpdateDistanceMeters())
+                    .setMaxUpdateDelayMillis(obj.getMaxUpdateDelayMillis())
+                    .build();
+        }
+    }
+
+    @RequiresApi(19)
+    private static class Api19Impl {
+        private static Class<?> sLocationRequestClass;
+        private static Method sCreateFromDeprecatedProviderMethod;
+        private static Method sSetQualityMethod;
+        private static Method sSetFastestIntervalMethod;
+        private static Method sSetNumUpdatesMethod;
+        private static Method sSetExpireInMethod;
+
+        private Api19Impl() {
+            // This class is not instantiable.
+        }
+
+        public static Object toLocationRequest(LocationRequestCompat obj, String provider) {
+            if (VERSION.SDK_INT >= 19) { // Satisfy reflection lint check
+                try {
+                    if (sLocationRequestClass == null) {
+                        sLocationRequestClass = Class.forName("android.location.LocationRequest");
+                    }
+                    if (sCreateFromDeprecatedProviderMethod == null) {
+                        sCreateFromDeprecatedProviderMethod =
+                                sLocationRequestClass.getDeclaredMethod(
+                                        "createFromDeprecatedProvider", String.class, long.class,
+                                        float.class,
+                                        boolean.class);
+                        sCreateFromDeprecatedProviderMethod.setAccessible(true);
+                    }
+
+                    Object request = sCreateFromDeprecatedProviderMethod.invoke(null,
+                                    provider,
+                                    obj.getIntervalMillis(),
+                                    obj.getMinUpdateDistanceMeters(), false);
+                    if (request == null) {
+                        return null;
+                    }
+
+                    if (sSetQualityMethod == null) {
+                        sSetQualityMethod = sLocationRequestClass.getDeclaredMethod(
+                                "setQuality", int.class);
+                        sSetQualityMethod.setAccessible(true);
+                    }
+                    sSetQualityMethod.invoke(request, obj.getQuality());
+
+                    if (sSetFastestIntervalMethod == null) {
+                        sSetFastestIntervalMethod = sLocationRequestClass.getDeclaredMethod(
+                                "setFastestInterval", long.class);
+                        sSetFastestIntervalMethod.setAccessible(true);
+                    }
+
+                    sSetFastestIntervalMethod.invoke(request, obj.getMinUpdateIntervalMillis());
+
+                    if (obj.getMaxUpdates() < Integer.MAX_VALUE) {
+                        if (sSetNumUpdatesMethod == null) {
+                            sSetNumUpdatesMethod = sLocationRequestClass.getDeclaredMethod(
+                                    "setNumUpdates", int.class);
+                            sSetNumUpdatesMethod.setAccessible(true);
+                        }
+
+                        sSetNumUpdatesMethod.invoke(request, obj.getMaxUpdates());
+                    }
+
+                    if (obj.getDurationMillis() < Long.MAX_VALUE) {
+                        if (sSetExpireInMethod == null) {
+                            sSetExpireInMethod = sLocationRequestClass.getDeclaredMethod(
+                                    "setExpireIn", long.class);
+                            sSetExpireInMethod.setAccessible(true);
+                        }
+
+                        sSetExpireInMethod.invoke(request, obj.getDurationMillis());
+                    }
+
+                    return request;
+                } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException
+                        | ClassNotFoundException e) {
+                    // Ignore
+                }
+            }
+            return null;
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/os/BuildCompat.java b/core/core/src/main/java/androidx/core/os/BuildCompat.java
index b1944a6..988a6d5 100644
--- a/core/core/src/main/java/androidx/core/os/BuildCompat.java
+++ b/core/core/src/main/java/androidx/core/os/BuildCompat.java
@@ -56,7 +56,9 @@
 
         // Otherwise lexically compare them.  Return true if the build codename is equal to or
         // greater than the requested codename.
-        return buildCodename.toUpperCase(Locale.ROOT).compareTo(codename) >= 0;
+        final String buildCodenameUpper = buildCodename.toUpperCase(Locale.ROOT);
+        final String codenameUpper = codename.toUpperCase(Locale.ROOT);
+        return buildCodenameUpper.compareTo(codenameUpper) >= 0;
     }
 
     /**
diff --git a/core/core/src/main/java/androidx/core/os/TraceCompat.java b/core/core/src/main/java/androidx/core/os/TraceCompat.java
index 899a0aa..f5022c6 100644
--- a/core/core/src/main/java/androidx/core/os/TraceCompat.java
+++ b/core/core/src/main/java/androidx/core/os/TraceCompat.java
@@ -17,7 +17,9 @@
 import android.os.Trace;
 import android.util.Log;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -35,6 +37,7 @@
  * @deprecated TraceCompat is deprecated in favor of androidx.tracing.Trace. Please use that
  * instead.
  */
+@SuppressWarnings("JavaReflectionMemberAccess")
 @Deprecated
 public final class TraceCompat {
 
@@ -74,9 +77,10 @@
      *
      * @return true if tracing is currently enabled, false otherwise
      */
+    @SuppressWarnings("ConstantConditions")
     public static boolean isEnabled() {
         if (Build.VERSION.SDK_INT >= 29) {
-            return Trace.isEnabled();
+            return Api29Impl.isEnabled();
         } else if (Build.VERSION.SDK_INT >= 18) {
             try {
                 return (boolean) sIsTagEnabledMethod.invoke(null, sTraceTagApp);
@@ -102,7 +106,7 @@
      */
     public static void beginSection(@NonNull String sectionName) {
         if (Build.VERSION.SDK_INT >= 18) {
-            Trace.beginSection(sectionName);
+            Api18Impl.beginSection(sectionName);
         }
     }
 
@@ -115,7 +119,7 @@
      */
     public static void endSection() {
         if (Build.VERSION.SDK_INT >= 18) {
-            Trace.endSection();
+            Api18Impl.endSection();
         }
     }
 
@@ -131,7 +135,7 @@
      */
     public static void beginAsyncSection(@NonNull String methodName, int cookie) {
         if (Build.VERSION.SDK_INT >= 29) {
-            Trace.beginAsyncSection(methodName, cookie);
+            Api29Impl.beginAsyncSection(methodName, cookie);
         } else if (Build.VERSION.SDK_INT >= 18) {
             try {
                 sAsyncTraceBeginMethod.invoke(null, sTraceTagApp, methodName, cookie);
@@ -151,7 +155,7 @@
      */
     public static void endAsyncSection(@NonNull String methodName, int cookie) {
         if (Build.VERSION.SDK_INT >= 29) {
-            Trace.endAsyncSection(methodName, cookie);
+            Api29Impl.endAsyncSection(methodName, cookie);
         } else if (Build.VERSION.SDK_INT >= 18) {
             try {
                 sAsyncTraceEndMethod.invoke(null, sTraceTagApp, methodName, cookie);
@@ -170,7 +174,7 @@
      */
     public static void setCounter(@NonNull String counterName, int counterValue) {
         if (Build.VERSION.SDK_INT >= 29) {
-            Trace.setCounter(counterName, counterValue);
+            Api29Impl.setCounter(counterName, counterValue);
         } else if (Build.VERSION.SDK_INT >= 18) {
             try {
                 sTraceCounterMethod.invoke(null, sTraceTagApp, counterName, counterValue);
@@ -180,5 +184,50 @@
         }
     }
 
-    private TraceCompat() {}
+    private TraceCompat() {
+    }
+
+    @RequiresApi(29)
+    static class Api29Impl {
+        private Api29Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean isEnabled() {
+            return Trace.isEnabled();
+        }
+
+        @DoNotInline
+        static void endAsyncSection(String methodName, int cookie) {
+            Trace.endAsyncSection(methodName, cookie);
+        }
+
+        @DoNotInline
+        static void beginAsyncSection(String methodName, int cookie) {
+            Trace.beginAsyncSection(methodName, cookie);
+        }
+
+        @DoNotInline
+        static void setCounter(String counterName, long counterValue) {
+            Trace.setCounter(counterName, counterValue);
+        }
+    }
+
+    @RequiresApi(18)
+    static class Api18Impl {
+        private Api18Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static void beginSection(String sectionName) {
+            Trace.beginSection(sectionName);
+        }
+
+        @DoNotInline
+        static void endSection() {
+            Trace.endSection();
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/os/UserManagerCompat.java b/core/core/src/main/java/androidx/core/os/UserManagerCompat.java
index 0c0fbbc..82b5167 100644
--- a/core/core/src/main/java/androidx/core/os/UserManagerCompat.java
+++ b/core/core/src/main/java/androidx/core/os/UserManagerCompat.java
@@ -20,7 +20,9 @@
 import android.os.Build;
 import android.os.UserManager;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * Helper for accessing features in {@link android.os.UserManager} in a backwards compatible
@@ -39,10 +41,21 @@
      */
     public static boolean isUserUnlocked(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 24) {
-            return context.getSystemService(UserManager.class).isUserUnlocked();
+            return Api24Impl.isUserUnlocked(context);
         } else {
             return true;
         }
     }
 
+    @RequiresApi(24)
+    static class Api24Impl {
+        private Api24Impl() {
+            // This class is not instantiable.
+        }
+
+        @DoNotInline
+        static boolean isUserUnlocked(Context context) {
+            return context.getSystemService(UserManager.class).isUserUnlocked();
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/provider/FontProvider.java b/core/core/src/main/java/androidx/core/provider/FontProvider.java
index d6d4da3..0a32e83 100644
--- a/core/core/src/main/java/androidx/core/provider/FontProvider.java
+++ b/core/core/src/main/java/androidx/core/provider/FontProvider.java
@@ -30,8 +30,10 @@
 import android.os.Build;
 import android.os.CancellationSignal;
 
+import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.res.FontResourcesParserCompat;
 import androidx.core.provider.FontsContractCompat.FontFamilyResult;
@@ -43,7 +45,7 @@
 import java.util.Comparator;
 import java.util.List;
 
-/* package */ class FontProvider {
+class FontProvider {
     private FontProvider() {}
 
     @NonNull
@@ -63,7 +65,6 @@
 
     /**
      * Do not access directly, visible for testing only.
-     * @return
      */
     @VisibleForTesting
     @Nullable
@@ -107,7 +108,6 @@
 
     /**
      * Do not access directly, visible for testing only.
-     * @return
      */
     @VisibleForTesting
     @NonNull
@@ -134,12 +134,13 @@
                     FontsContractCompat.Columns.WEIGHT, FontsContractCompat.Columns.ITALIC,
                     FontsContractCompat.Columns.RESULT_CODE};
 
+            ContentResolver resolver = context.getContentResolver();
             if (Build.VERSION.SDK_INT > 16) {
-                cursor = context.getContentResolver().query(uri, projection, "query = ?",
+                cursor = Api16Impl.query(resolver, uri, projection, "query = ?",
                         new String[]{request.getQuery()}, null, cancellationSignal);
             } else {
                 // No cancellation signal.
-                cursor = context.getContentResolver().query(uri, projection, "query = ?",
+                cursor = resolver.query(uri, projection, "query = ?",
                         new String[]{request.getQuery()}, null);
             }
 
@@ -193,19 +194,16 @@
         return FontResourcesParserCompat.readCerts(resources, resourceId);
     }
 
-    private static final Comparator<byte[]> sByteArrayComparator = new Comparator<byte[]>() {
-        @Override
-        public int compare(byte[] l, byte[] r) {
-            if (l.length != r.length) {
-                return l.length - r.length;
-            }
-            for (int i = 0; i < l.length; ++i) {
-                if (l[i] != r[i]) {
-                    return l[i] - r[i];
-                }
-            }
-            return 0;
+    private static final Comparator<byte[]> sByteArrayComparator = (l, r) -> {
+        if (l.length != r.length) {
+            return l.length - r.length;
         }
+        for (int i = 0; i < l.length; ++i) {
+            if (l[i] != r[i]) {
+                return l[i] - r[i];
+            }
+        }
+        return 0;
     };
 
     private static boolean equalsByteArrayList(List<byte[]> signatures,
@@ -223,9 +221,25 @@
 
     private static List<byte[]> convertToByteArrayList(Signature[] signatures) {
         List<byte[]> shaList = new ArrayList<>();
-        for (int i = 0; i < signatures.length; ++i) {
-            shaList.add(signatures[i].toByteArray());
+        for (Signature signature : signatures) {
+            shaList.add(signature.toByteArray());
         }
         return shaList;
     }
+
+    @RequiresApi(16)
+    static class Api16Impl {
+        private Api16Impl() {
+            // This class is not instantiable.
+        }
+
+        @SuppressWarnings("SameParameterValue")
+        @DoNotInline
+        static Cursor query(ContentResolver contentResolver, Uri uri, String[] projection,
+                String selection, String[] selectionArgs, String sortOrder,
+                Object cancellationSignal) { // Avoid implicit NewApi cast for CancellationSignal
+            return contentResolver.query(uri, projection, selection, selectionArgs, sortOrder,
+                    (CancellationSignal) cancellationSignal);
+        }
+    }
 }
diff --git a/core/core/src/main/java/androidx/core/telephony/mbms/MbmsHelper.java b/core/core/src/main/java/androidx/core/telephony/mbms/MbmsHelper.java
index ac0f436..4977aa4 100644
--- a/core/core/src/main/java/androidx/core/telephony/mbms/MbmsHelper.java
+++ b/core/core/src/main/java/androidx/core/telephony/mbms/MbmsHelper.java
@@ -16,8 +16,6 @@
 
 package androidx.core.telephony.mbms;
 
-import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.os.Build;
 import android.os.LocaleList;
@@ -25,15 +23,18 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 
 import java.util.Locale;
+import java.util.Set;
 
 /**
  * Helper methods for working with the {@link android.telephony.mbms} cell-broadcast APIs.
  */
 public final class MbmsHelper {
-    // Do not instantiate
-    private MbmsHelper() {}
+    private MbmsHelper() {
+        // This class is not instantiable.
+    }
 
     /**
      * Finds the best name for an eMBMS streaming or file-download service, given a
@@ -48,30 +49,37 @@
      * @return The best name to display to the user for the service, or {@code null} if nothing
      * matches.
      */
-    // Remove BanTargetApiAnnotation suppression once b/120625123 is addressed.
-    @TargetApi(Build.VERSION_CODES.P)
-    @SuppressLint("BanTargetApiAnnotation")
     @Nullable
     public static CharSequence getBestNameForService(@NonNull Context context,
             @NonNull ServiceInfo serviceInfo) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
-            return null;
+        if (Build.VERSION.SDK_INT >= 28) {
+            return Api28Impl.getBestNameForService(context, serviceInfo);
         }
-        LocaleList localeList = context.getResources().getConfiguration().getLocales();
+        return null;
+    }
 
-        int numLanguagesSupportedByService = serviceInfo.getNamedContentLocales().size();
-        if (numLanguagesSupportedByService == 0) {
-            return null;
-        }
-        String[] supportedLanguages = new String[numLanguagesSupportedByService];
-
-        int i = 0;
-        for (Locale l : serviceInfo.getNamedContentLocales()) {
-            supportedLanguages[i] = l.toLanguageTag();
-            i++;
+    @RequiresApi(28)
+    static class Api28Impl {
+        private Api28Impl() {
+            // This class is not instantiable.
         }
 
-        Locale bestLocale = localeList.getFirstMatch(supportedLanguages);
-        return bestLocale == null ? null : serviceInfo.getNameForLocale(bestLocale);
+        static CharSequence getBestNameForService(Context context, ServiceInfo serviceInfo) {
+            Set<Locale> namedContentLocales = serviceInfo.getNamedContentLocales();
+            if (namedContentLocales.isEmpty()) {
+                return null;
+            }
+
+            String[] supportedLanguages = new String[namedContentLocales.size()];
+            int i = 0;
+            for (Locale l : serviceInfo.getNamedContentLocales()) {
+                supportedLanguages[i] = l.toLanguageTag();
+                i++;
+            }
+
+            LocaleList localeList = context.getResources().getConfiguration().getLocales();
+            Locale bestLocale = localeList.getFirstMatch(supportedLanguages);
+            return bestLocale == null ? null : serviceInfo.getNameForLocale(bestLocale);
+        }
     }
 }
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index ffcabfe..c2aba7c 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -129,9 +129,9 @@
 [.]+10%[.]+20%[.]+30%[.]+40%[.]+50%[.]+60%[.]+70%[.]+80%[.]+90%[.]+100%
 Welcome to Gradle .*
 Here are the highlights of this release:
-\- Aggregated test and JaCoCo reports
-\- Marking additional test source directories as tests in IntelliJ
-\- Support for Adoptium JDKs in Java toolchains
+\- Easily declare new test suites in Java projects
+\- Support for Java 17
+\- Support for Scala 3
 For more details see .*
 Daemon will be stopped at the end of the build
 # > Configure project :appsearch:appsearch\-local\-backend
@@ -221,6 +221,9 @@
 w: \$SUPPORT/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet\.kt: \([0-9]+, [0-9]+\): The corresponding parameter in the supertype 'Comparator' is named 'b'\. This may cause problems when calling this function with named arguments\.
 # > Task :benchmark:benchmark-common:runErrorProne
 \^
+public abstract void jvmDelete\(T t\);
+public abstract void jvmInsert\(@org\.jetbrains\.annotations\.NotNull\(\)
+public abstract java\.util\.List<androidx\.room\.androidx\.room\.integration\.kotlintestapp\.test\.JvmNameInDaoTest\.JvmNameEntity> jvmQuery\(\);
 symbol\:   static FLAG_MUTABLE
 location\: class PendingIntent
 \$OUT_DIR\/androidx\/docs\-public\/build\/srcs\/androidx\/work\/impl\/utils\/ForceStopRunnable\.java\:[0-9]+\: error\: cannot find symbol
@@ -602,3 +605,9 @@
 Info: Some warnings are typically a sign of using an outdated Java toolchain\. To fix, recompile the source with an updated toolchain\.
 # > Task :compose:ui:ui-inspection:buildCMakeRelWithDebInfo[arm64-v8a]
 C/C\+\+: ninja: warning: bad deps log signature or version; starting over
+# > Task :room:integration-tests:room-testapp-kotlin:kspWithKspDebugAndroidTestKotlin
+w: \[ksp\] Using @JvmName annotation on a function or accessor that will be overridden by Room is not supported\. If this is important for your use case, please file a bug at https://issuetracker\.google\.com/issues/new\?component=[0-9]+ with details\. \- androidx\.room\.androidx\.room\.integration\.kotlintestapp\.test\.JvmNameInDaoTest\.JvmNameDb\.jvmDao\(\)
+w: \[ksp\] \$SUPPORT/room/integration\-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/JvmNameInDaoTest\.kt:[0-9]+: Using @JvmName annotation on a function or accessor that will be overridden by Room is not supported\. If this is important for your use case, please file a bug at https://issuetracker\.google\.com/issues/new\?component=[0-9]+ with details\.
+# > Task :room:integration-tests:room-testapp-kotlin:kaptWithKaptDebugAndroidTestKotlin
+\$OUT_DIR/androidx/room/integration\-tests/room\-testapp\-kotlin/build/tmp/kapt[0-9]+/stubs/withKaptDebugAndroidTest/androidx/room/androidx/room/integration/kotlintestapp/test/JvmNameInDaoTest\.java:[0-9]+: warning: Using @JvmName annotation on a function or accessor that will be overridden by Room is not supported\. If this is important for your use case, please file a bug at https://issuetracker\.google\.com/issues/new\?component=[0-9]+ with details\.
+public abstract androidx\.room\.androidx\.room\.integration\.kotlintestapp\.test\.JvmNameInDaoTest\.JvmNameDao jvmDao\(\);
\ No newline at end of file
diff --git a/development/gradleRemoteCache/README.md b/development/gradleRemoteCache/README.md
index 5ea9050..328b00f 100644
--- a/development/gradleRemoteCache/README.md
+++ b/development/gradleRemoteCache/README.md
@@ -6,9 +6,9 @@
 
 * Open the Cloud Platform [console](https://console.cloud.google.com/home/dashboard?project=fetch-licenses).
 
-* Select `VM Instances`.
+* In the search box type in and select `VM Instances`.
 
-* Click on an existing node, and use `Create Similar` to create a new node.
+* Click on an existing node to see details page, then use `Create Similar` to create a new node.
   *Note*: This node has to be tagged with a network tag called `gradle-remote-cache-node`
   for it to be picked up by the load balancer. Make sure you create the node in the zone `us-east-1-b`.
 
@@ -30,21 +30,24 @@
 ## Starting the Gradle Remote Cache Node
 
 ```bash
+# Install some prerequisite packages
+sudo apt update
+sudo apt upgrade
+sudo apt install openjdk-11-jdk tmux wget
 # Create a folder `Workspace` in the home directory.
 mkdir Workspace
 cd Workspace
+mkdir -p data/conf
 # using the template in this checkout create config.yaml
-vi config.yaml
+vi data/conf/config.yaml
 # using the template in this checkout create run_node, replace YOURUSERNAME with your username
 vi run_node
 chmod +x run_node
-mkdir data
 mkdir gradle-node
-wget https://docs.gradle.com/build-cache-node/jar/build-cache-node-9.3.jar -p gradle-node
-sudo apt install openjdk-11-jdk tmux
+wget https://docs.gradle.com/build-cache-node/jar/build-cache-node-11.1.jar -P gradle-node
 # Create a `tmux` session
 tmux new -s gradle
-sudo ./run_node
+sudo ./run_node &
 # Detach from the tmux session ctrl+b then d
 exit
 ```
diff --git a/development/gradleRemoteCache/config.yaml b/development/gradleRemoteCache/config.yaml
index b242873..5c5a832 100644
--- a/development/gradleRemoteCache/config.yaml
+++ b/development/gradleRemoteCache/config.yaml
@@ -1,7 +1,9 @@
 ---
-version: 2
+version: 3
+uiAccess:
+  type: "open"
 cache:
+  accessControl:
+    anonymousLevel: "readwrite"
   targetSize: 150000
   maxArtifactSize: 2500
-  credentials:
-    anonymousLevel: "READWRITE"
diff --git a/development/gradleRemoteCache/run_node b/development/gradleRemoteCache/run_node
index 79abba6..0b50c0f 100644
--- a/development/gradleRemoteCache/run_node
+++ b/development/gradleRemoteCache/run_node
@@ -1 +1 @@
-java -jar /home/YOURUSERNAME/Workspace/gradle-node/build-cache-node-9.3.jar --data-dir /home/$USER/Workspace/data --port 80
+java -jar /home/YOURUSERNAME/Workspace/gradle-node/build-cache-node-11.1.jar start --data-dir /home/YOURUSERNAME/Workspace/data --port 80 --no-warn-anon-cache-write --no-warn-anon-ui-access
\ No newline at end of file
diff --git a/development/project-creator/native-template/groupId/artifactId/build.gradle b/development/project-creator/native-template/groupId/artifactId/build.gradle
index d4040a3..a360d32 100644
--- a/development/project-creator/native-template/groupId/artifactId/build.gradle
+++ b/development/project-creator/native-template/groupId/artifactId/build.gradle
@@ -49,7 +49,7 @@
     }
     externalNativeBuild {
         cmake {
-            version "3.22.1"
+            version libs.versions.cmake.get()
             path "src/main/cpp/CMakeLists.txt"
         }
     }
diff --git a/development/referenceDocs/stageReferenceDocsWithDackka.sh b/development/referenceDocs/stageReferenceDocsWithDackka.sh
index c9162a1..894511a 100755
--- a/development/referenceDocs/stageReferenceDocsWithDackka.sh
+++ b/development/referenceDocs/stageReferenceDocsWithDackka.sh
@@ -54,6 +54,7 @@
   "annotation"
 #  "benchmark"
 #  "collection"
+  "core"
   "fragment"
   "navigation"
   "paging"
@@ -66,6 +67,7 @@
 #  "benchmark"
   "compose"
 #  "collection"
+  "core"
   "fragment"
   "navigation"
   "paging"
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 2ddef4c..fde0b1a 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -4,10 +4,10 @@
 }
 
 dependencies {
-    docs("androidx.activity:activity:1.4.0")
-    docs("androidx.activity:activity-compose:1.4.0")
-    samples("androidx.activity:activity-compose-samples:1.4.0")
-    docs("androidx.activity:activity-ktx:1.4.0")
+    docs("androidx.activity:activity:1.5.0-alpha01")
+    docs("androidx.activity:activity-compose:1.5.0-alpha01")
+    samples("androidx.activity:activity-compose-samples:1.5.0-alpha01")
+    docs("androidx.activity:activity-ktx:1.5.0-alpha01")
     docs("androidx.ads:ads-identifier:1.0.0-alpha04")
     docs("androidx.ads:ads-identifier-provider:1.0.0-alpha04")
     docs("androidx.annotation:annotation:1.4.0-alpha01")
@@ -23,82 +23,84 @@
     docs("androidx.arch.core:core-testing:2.1.0")
     docs("androidx.asynclayoutinflater:asynclayoutinflater:1.0.0")
     docs("androidx.autofill:autofill:1.2.0-beta01")
-    docs("androidx.benchmark:benchmark-common:1.1.0-beta01")
-    docs("androidx.benchmark:benchmark-junit4:1.1.0-beta01")
-    docs("androidx.benchmark:benchmark-macro:1.1.0-beta01")
-    docs("androidx.benchmark:benchmark-macro-junit4:1.1.0-beta01")
+    docs("androidx.benchmark:benchmark-common:1.1.0-beta02")
+    docs("androidx.benchmark:benchmark-junit4:1.1.0-beta02")
+    docs("androidx.benchmark:benchmark-macro:1.1.0-beta02")
+    docs("androidx.benchmark:benchmark-macro-junit4:1.1.0-beta02")
     docs("androidx.biometric:biometric:1.2.0-alpha04")
     docs("androidx.biometric:biometric-ktx:1.2.0-alpha04")
     samples("androidx.biometric:biometric-ktx-samples:1.2.0-alpha04")
     docs("androidx.browser:browser:1.4.0")
-    docs("androidx.camera:camera-camera2:1.1.0-alpha12")
-    docs("androidx.camera:camera-core:1.1.0-alpha12")
-    docs("androidx.camera:camera-extensions:1.0.0-alpha32")
+    docs("androidx.camera:camera-camera2:1.1.0-beta01")
+    docs("androidx.camera:camera-core:1.1.0-beta01")
+    docs("androidx.camera:camera-extensions:1.1.0-beta01")
     stubs(fileTree(dir: "../camera/camera-extensions-stub", include: ["camera-extensions-stub.jar"]))
-    docs("androidx.camera:camera-lifecycle:1.1.0-alpha12")
-    docs("androidx.camera:camera-video:1.1.0-alpha12")
-    docs("androidx.camera:camera-view:1.0.0-alpha32")
-    docs("androidx.car.app:app:1.2.0-beta01")
-    docs("androidx.car.app:app-automotive:1.2.0-beta01")
-    docs("androidx.car.app:app-projected:1.2.0-beta01")
-    docs("androidx.car.app:app-testing:1.2.0-beta01")
+    docs("androidx.camera:camera-lifecycle:1.1.0-beta01")
+    docs("androidx.camera:camera-previewview:1.1.0-beta01")
+    docs("androidx.camera:camera-video:1.1.0-beta01")
+    docs("androidx.camera:camera-view:1.1.0-beta01")
+    docs("androidx.car.app:app:1.2.0-beta02")
+    docs("androidx.car.app:app-automotive:1.2.0-beta02")
+    docs("androidx.car.app:app-projected:1.2.0-beta02")
+    docs("androidx.car.app:app-testing:1.2.0-beta02")
     docs("androidx.cardview:cardview:1.0.0")
     docs("androidx.collection:collection:1.2.0")
     docs("androidx.collection:collection-ktx:1.2.0")
-    docs("androidx.compose.animation:animation:1.2.0-alpha01")
-    docs("androidx.compose.animation:animation-core:1.2.0-alpha01")
-    docs("androidx.compose.animation:animation-graphics:1.2.0-alpha01")
-    samples("androidx.compose.animation:animation-samples:1.2.0-alpha01")
-    samples("androidx.compose.animation:animation-core-samples:1.2.0-alpha01")
-    samples("androidx.compose.animation:animation-graphics-samples:1.2.0-alpha01")
-    docs("androidx.compose.foundation:foundation:1.2.0-alpha01")
-    docs("androidx.compose.foundation:foundation-layout:1.2.0-alpha01")
-    samples("androidx.compose.foundation:foundation-layout-samples:1.2.0-alpha01")
-    samples("androidx.compose.foundation:foundation-samples:1.2.0-alpha01")
-    docs("androidx.compose.material3:material3:1.0.0-alpha03")
-    samples("androidx.compose.material3:material3-samples:1.0.0-alpha03")
-    docs("androidx.compose.material:material:1.2.0-alpha01")
-    docs("androidx.compose.material:material-icons-core:1.2.0-alpha01")
-    samples("androidx.compose.material:material-icons-core-samples:1.2.0-alpha01")
-    docs("androidx.compose.material:material-ripple:1.2.0-alpha01")
-    samples("androidx.compose.material:material-samples:1.2.0-alpha01")
-    docs("androidx.compose.runtime:runtime:1.2.0-alpha01")
-    docs("androidx.compose.runtime:runtime-livedata:1.2.0-alpha01")
-    samples("androidx.compose.runtime:runtime-livedata-samples:1.2.0-alpha01")
-    docs("androidx.compose.runtime:runtime-rxjava2:1.2.0-alpha01")
-    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.2.0-alpha01")
-    docs("androidx.compose.runtime:runtime-rxjava3:1.2.0-alpha01")
-    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.2.0-alpha01")
-    docs("androidx.compose.runtime:runtime-saveable:1.2.0-alpha01")
-    samples("androidx.compose.runtime:runtime-saveable-samples:1.2.0-alpha01")
-    samples("androidx.compose.runtime:runtime-samples:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-geometry:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-graphics:1.2.0-alpha01")
-    samples("androidx.compose.ui:ui-graphics-samples:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-test:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-test-junit4:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-text:1.2.0-alpha01")
-    samples("androidx.compose.ui:ui-text-samples:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-tooling:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-tooling-data:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-tooling-preview:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-unit:1.2.0-alpha01")
-    samples("androidx.compose.ui:ui-unit-samples:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-util:1.2.0-alpha01")
-    docs("androidx.compose.ui:ui-viewbinding:1.2.0-alpha01")
-    samples("androidx.compose.ui:ui-viewbinding-samples:1.2.0-alpha01")
-    samples("androidx.compose.ui:ui-samples:1.2.0-alpha01")
+    docs("androidx.compose.animation:animation:1.2.0-alpha02")
+    docs("androidx.compose.animation:animation-core:1.2.0-alpha02")
+    docs("androidx.compose.animation:animation-graphics:1.2.0-alpha02")
+    samples("androidx.compose.animation:animation-samples:1.2.0-alpha02")
+    samples("androidx.compose.animation:animation-core-samples:1.2.0-alpha02")
+    samples("androidx.compose.animation:animation-graphics-samples:1.2.0-alpha02")
+    docs("androidx.compose.foundation:foundation:1.2.0-alpha02")
+    docs("androidx.compose.foundation:foundation-layout:1.2.0-alpha02")
+    samples("androidx.compose.foundation:foundation-layout-samples:1.2.0-alpha02")
+    samples("androidx.compose.foundation:foundation-samples:1.2.0-alpha02")
+    docs("androidx.compose.material3:material3:1.0.0-alpha04")
+    samples("androidx.compose.material3:material3-samples:1.0.0-alpha04")
+    docs("androidx.compose.material:material:1.2.0-alpha02")
+    docs("androidx.compose.material:material-icons-core:1.2.0-alpha02")
+    samples("androidx.compose.material:material-icons-core-samples:1.2.0-alpha02")
+    docs("androidx.compose.material:material-ripple:1.2.0-alpha02")
+    samples("androidx.compose.material:material-samples:1.2.0-alpha02")
+    docs("androidx.compose.runtime:runtime:1.2.0-alpha02")
+    docs("androidx.compose.runtime:runtime-livedata:1.2.0-alpha02")
+    samples("androidx.compose.runtime:runtime-livedata-samples:1.2.0-alpha02")
+    docs("androidx.compose.runtime:runtime-rxjava2:1.2.0-alpha02")
+    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.2.0-alpha02")
+    docs("androidx.compose.runtime:runtime-rxjava3:1.2.0-alpha02")
+    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.2.0-alpha02")
+    docs("androidx.compose.runtime:runtime-saveable:1.2.0-alpha02")
+    samples("androidx.compose.runtime:runtime-saveable-samples:1.2.0-alpha02")
+    samples("androidx.compose.runtime:runtime-samples:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-geometry:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-graphics:1.2.0-alpha02")
+    samples("androidx.compose.ui:ui-graphics-samples:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-test:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-test-junit4:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-text:1.2.0-alpha02")
+    samples("androidx.compose.ui:ui-text-samples:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-tooling:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-tooling-data:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-tooling-preview:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-unit:1.2.0-alpha02")
+    samples("androidx.compose.ui:ui-unit-samples:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-util:1.2.0-alpha02")
+    docs("androidx.compose.ui:ui-viewbinding:1.2.0-alpha02")
+    samples("androidx.compose.ui:ui-viewbinding-samples:1.2.0-alpha02")
+    samples("androidx.compose.ui:ui-samples:1.2.0-alpha02")
     docs("androidx.concurrent:concurrent-futures:1.1.0")
     docs("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     docs("androidx.contentpager:contentpager:1.0.0")
     docs("androidx.coordinatorlayout:coordinatorlayout:1.2.0")
     docs("androidx.core:core-google-shortcuts:1.1.0-alpha02")
+    docs("androidx.core:core-remoteviews:1.0.0-alpha02")
     docs("androidx.core:core-role:1.1.0-rc01")
     docs("androidx.core:core-animation:1.0.0-alpha02")
     docs("androidx.core:core-animation-testing:1.0.0-alpha02")
-    docs("androidx.core:core:1.8.0-alpha02")
-    docs("androidx.core:core-ktx:1.8.0-alpha02")
+    docs("androidx.core:core:1.8.0-alpha03")
+    docs("androidx.core:core-ktx:1.8.0-alpha03")
     docs("androidx.core:core-splashscreen:1.0.0-beta01")
     docs("androidx.cursoradapter:cursoradapter:1.0.0")
     docs("androidx.customview:customview:1.1.0")
@@ -111,32 +113,33 @@
     docs("androidx.datastore:datastore-rxjava2:1.0.0")
     docs("androidx.datastore:datastore-rxjava3:1.0.0")
     docs("androidx.documentfile:documentfile:1.1.0-alpha01")
-    docs("androidx.draganddrop:draganddrop:1.0.0-alpha02")
+    docs("androidx.draganddrop:draganddrop:1.0.0-alpha03")
     docs("androidx.drawerlayout:drawerlayout:1.1.1")
     docs("androidx.dynamicanimation:dynamicanimation:1.1.0-alpha02")
     docs("androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03")
-    docs("androidx.emoji2:emoji2:1.1.0-alpha01")
-    docs("androidx.emoji2:emoji2-bundled:1.1.0-alpha01")
-    docs("androidx.emoji2:emoji2-views:1.1.0-alpha01")
-    docs("androidx.emoji2:emoji2-views-helper:1.1.0-alpha01")
+    docs("androidx.emoji2:emoji2:1.1.0-beta01")
+    docs("androidx.emoji2:emoji2-bundled:1.1.0-beta01")
+    docs("androidx.emoji2:emoji2-views:1.1.0-beta01")
+    docs("androidx.emoji2:emoji2-views-helper:1.1.0-beta01")
     docs("androidx.emoji:emoji:1.2.0-alpha03")
     docs("androidx.emoji:emoji-appcompat:1.2.0-alpha03")
     docs("androidx.emoji:emoji-bundled:1.2.0-alpha03")
     docs("androidx.enterprise:enterprise-feedback:1.1.0")
     docs("androidx.enterprise:enterprise-feedback-testing:1.1.0")
     docs("androidx.exifinterface:exifinterface:1.3.3")
-    docs("androidx.fragment:fragment:1.4.0")
-    docs("androidx.fragment:fragment-ktx:1.4.0")
-    docs("androidx.fragment:fragment-testing:1.4.0")
-    docs("androidx.glance:glance:1.0.0-alpha01")
-    docs("androidx.glance:glance-appwidget:1.0.0-alpha01")
-    docs("androidx.glance:glance-appwidget-proto:1.0.0-alpha01")
+    docs("androidx.fragment:fragment:1.5.0-alpha01")
+    docs("androidx.fragment:fragment-ktx:1.5.0-alpha01")
+    docs("androidx.fragment:fragment-testing:1.5.0-alpha01")
+    docs("androidx.glance:glance:1.0.0-alpha02")
+    docs("androidx.glance:glance-appwidget:1.0.0-alpha02")
+    docs("androidx.glance:glance-appwidget-proto:1.0.0-alpha02")
+    docs("androidx.glance:glance-wear-tiles:1.0.0-alpha02")
     docs("androidx.gridlayout:gridlayout:1.0.0")
     docs("androidx.health:health-services-client:1.0.0-alpha03")
     docs("androidx.heifwriter:heifwriter:1.1.0-alpha01")
     docs("androidx.hilt:hilt-common:1.0.0-beta01")
     docs("androidx.hilt:hilt-navigation:1.0.0-beta01")
-    docs("androidx.hilt:hilt-navigation-compose:1.0.0-rc01")
+    docs("androidx.hilt:hilt-navigation-compose:1.0.0")
     samples("androidx.hilt:hilt-navigation-compose-samples:1.0.0-alpha04")
     docs("androidx.hilt:hilt-navigation-fragment:1.0.0-beta01")
     docs("androidx.hilt:hilt-work:1.0.0-beta01")
@@ -146,47 +149,47 @@
     docs("androidx.leanback:leanback-paging:1.1.0-alpha09")
     docs("androidx.leanback:leanback-preference:1.2.0-alpha02")
     docs("androidx.leanback:leanback-tab:1.1.0-beta01")
-    docs("androidx.lifecycle:lifecycle-common:2.4.0")
-    docs("androidx.lifecycle:lifecycle-common-java8:2.4.0")
+    docs("androidx.lifecycle:lifecycle-common:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-common-java8:2.5.0-alpha01")
     docs("androidx.lifecycle:lifecycle-extensions:2.2.0")
-    docs("androidx.lifecycle:lifecycle-livedata:2.4.0")
-    docs("androidx.lifecycle:lifecycle-livedata-core:2.4.0")
-    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.4.0")
-    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0")
-    docs("androidx.lifecycle:lifecycle-process:2.4.0")
-    docs("androidx.lifecycle:lifecycle-reactivestreams:2.4.0")
-    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.4.0")
-    docs("androidx.lifecycle:lifecycle-runtime:2.4.0")
-    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0")
-    docs("androidx.lifecycle:lifecycle-runtime-testing:2.4.0")
-    docs("androidx.lifecycle:lifecycle-service:2.4.0")
-    docs("androidx.lifecycle:lifecycle-viewmodel:2.4.0")
-    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0")
-    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.4.0")
-    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0")
-    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0")
+    docs("androidx.lifecycle:lifecycle-livedata:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-livedata-core:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-process:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-reactivestreams:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-runtime:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-runtime-testing:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-service:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-viewmodel:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.5.0-alpha01")
+    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0-alpha01")
+    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.0-alpha01")
     docs("androidx.loader:loader:1.1.0")
     docs("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0")
     docs("androidx.media2:media2-common:1.2.0")
     docs("androidx.media2:media2-player:1.2.0")
     docs("androidx.media2:media2-session:1.2.0")
     docs("androidx.media2:media2-widget:1.2.0")
-    docs("androidx.media:media:1.5.0-beta01")
+    docs("androidx.media:media:1.5.0-rc01")
     docs("androidx.mediarouter:mediarouter:1.3.0-alpha01")
     docs("androidx.mediarouter:mediarouter-testing:1.3.0-alpha01")
-    docs("androidx.navigation:navigation-common:2.4.0")
-    docs("androidx.navigation:navigation-common-ktx:2.4.0")
-    docs("androidx.navigation:navigation-compose:2.4.0")
-    samples("androidx.navigation:navigation-compose-samples:2.4.0")
-    docs("androidx.navigation:navigation-dynamic-features-fragment:2.4.0")
-    docs("androidx.navigation:navigation-dynamic-features-runtime:2.4.0")
-    docs("androidx.navigation:navigation-fragment:2.4.0")
-    docs("androidx.navigation:navigation-fragment-ktx:2.4.0")
-    docs("androidx.navigation:navigation-runtime:2.4.0")
-    docs("androidx.navigation:navigation-runtime-ktx:2.4.0")
-    docs("androidx.navigation:navigation-testing:2.4.0")
-    docs("androidx.navigation:navigation-ui:2.4.0")
-    docs("androidx.navigation:navigation-ui-ktx:2.4.0")
+    docs("androidx.navigation:navigation-common:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-common-ktx:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-compose:2.5.0-alpha01")
+    samples("androidx.navigation:navigation-compose-samples:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-dynamic-features-fragment:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-dynamic-features-runtime:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-fragment:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-fragment-ktx:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-runtime:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-runtime-ktx:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-testing:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-ui:2.5.0-alpha01")
+    docs("androidx.navigation:navigation-ui-ktx:2.5.0-alpha01")
     docs("androidx.paging:paging-common:3.1.0")
     docs("androidx.paging:paging-common-ktx:3.1.0")
     docs("androidx.paging:paging-compose:1.0.0-alpha15")
@@ -201,16 +204,16 @@
     docs("androidx.palette:palette:1.0.0")
     docs("androidx.palette:palette-ktx:1.0.0")
     docs("androidx.percentlayout:percentlayout:1.0.1")
-    docs("androidx.preference:preference:1.2.0-rc01")
-    docs("androidx.preference:preference-ktx:1.2.0-rc01")
+    docs("androidx.preference:preference:1.2.0")
+    docs("androidx.preference:preference-ktx:1.2.0")
     docs("androidx.print:print:1.1.0-beta01")
-    docs("androidx.profileinstaller:profileinstaller:1.2.0-alpha01")
+    docs("androidx.profileinstaller:profileinstaller:1.2.0-alpha02")
     docs("androidx.recommendation:recommendation:1.0.0")
     docs("androidx.recyclerview:recyclerview:1.3.0-alpha01")
     docs("androidx.recyclerview:recyclerview-selection:2.0.0-alpha01")
     docs("androidx.remotecallback:remotecallback:1.0.0-alpha02")
-    docs("androidx.resourceinspection:resourceinspection-annotation:1.0.0")
-    docs("androidx.resourceinspection:resourceinspection-processor:1.0.0")
+    docs("androidx.resourceinspection:resourceinspection-annotation:1.0.1")
+    docs("androidx.resourceinspection:resourceinspection-processor:1.0.1")
     docs("androidx.room:room-common:2.4.1")
     docs("androidx.room:room-guava:2.4.1")
     docs("androidx.room:room-ktx:2.4.1")
@@ -220,8 +223,8 @@
     docs("androidx.room:room-rxjava2:2.4.1")
     docs("androidx.room:room-rxjava3:2.4.1")
     docs("androidx.room:room-testing:2.4.1")
-    docs("androidx.savedstate:savedstate:1.1.0")
-    docs("androidx.savedstate:savedstate-ktx:1.1.0")
+    docs("androidx.savedstate:savedstate:1.2.0-alpha01")
+    docs("androidx.savedstate:savedstate-ktx:1.2.0-alpha01")
     docs("androidx.security:security-app-authenticator:1.0.0-alpha02")
     docs("androidx.security:security-app-authenticator-testing:1.0.0-alpha01")
     docs("androidx.security:security-crypto:1.1.0-alpha03")
@@ -250,16 +253,16 @@
     docs("androidx.versionedparcelable:versionedparcelable:1.1.1")
     docs("androidx.viewpager2:viewpager2:1.1.0-beta01")
     docs("androidx.viewpager:viewpager:1.1.0-alpha01")
-    docs("androidx.wear.compose:compose-foundation:1.0.0-alpha14")
-    samples("androidx.wear.compose:compose-foundation-samples:1.0.0-alpha14")
-    docs("androidx.wear.compose:compose-material:1.0.0-alpha14")
-    samples("androidx.wear.compose:compose-material-samples:1.0.0-alpha14")
-    docs("androidx.wear.compose:compose-navigation:1.0.0-alpha14")
-    samples("androidx.wear.compose:compose-navigation-samples:1.0.0-alpha14")
-    docs("androidx.wear.tiles:tiles:1.0.0")
-    docs("androidx.wear.tiles:tiles-proto:1.0.0")
-    docs("androidx.wear.tiles:tiles-renderer:1.0.0")
-    docs("androidx.wear.tiles:tiles-testing:1.0.0")
+    docs("androidx.wear.compose:compose-foundation:1.0.0-alpha15")
+    samples("androidx.wear.compose:compose-foundation-samples:1.0.0-alpha15")
+    docs("androidx.wear.compose:compose-material:1.0.0-alpha15")
+    samples("androidx.wear.compose:compose-material-samples:1.0.0-alpha15")
+    docs("androidx.wear.compose:compose-navigation:1.0.0-alpha15")
+    samples("androidx.wear.compose:compose-navigation-samples:1.0.0-alpha15")
+    docs("androidx.wear.tiles:tiles:1.1.0-alpha01")
+    docs("androidx.wear.tiles:tiles-proto:1.1.0-alpha01")
+    docs("androidx.wear.tiles:tiles-renderer:1.1.0-alpha01")
+    docs("androidx.wear.tiles:tiles-testing:1.1.0-alpha01")
     docs("androidx.wear.watchface:watchface:1.1.0-alpha02")
     docs("androidx.wear.watchface:watchface-client:1.1.0-alpha02")
     docs("androidx.wear.watchface:watchface-client-guava:1.1.0-alpha02")
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index 508e0a1..fd656d6 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -175,7 +175,6 @@
     docs(project(":lifecycle:lifecycle-viewmodel-savedstate"))
     docs(project(":loader:loader"))
     docs(project(":loader:loader-ktx"))
-    docs(project(":localbroadcastmanager:localbroadcastmanager"))
     docs(project(":media2:media2-common"))
     docs(project(":media2:media2-exoplayer"))
     docs(project(":media2:media2-player"))
diff --git a/docs/api_guidelines.md b/docs/api_guidelines.md
index bfeeb4e..c60844cd 100644
--- a/docs/api_guidelines.md
+++ b/docs/api_guidelines.md
@@ -780,8 +780,8 @@
 
 #### Data structures
 
-**Do not** use Parcelable for any class that may be used for IPC or otherwise
-exposed as public API. The data format used by Parcelable does not provide any
+**Do not** use `Parcelable` for any class that may be used for IPC or otherwise
+exposed as public API. The wire format used by `Parcelable` does not provide any
 compatibility guarantees and will result in crashes if fields are added or
 removed between library versions.
 
@@ -791,10 +791,15 @@
 
 Developers **should** use protocol buffers for most cases. See
 [Protobuf](#dependencies-protobuf) for more information on using protocol
-buffers in your library.
+buffers in your library. **Do** use protocol buffers if your data structure is
+complex and likely to change over time. If your data includes `FileDescriptor`s,
+`Binder`s, or other platform-defined `Parcelable` data structures, they will
+need to be stored alongside the protobuf bytes in a `Bundle`.
 
-Developers **may** use `Bundle` in simple cases that require sending `Binder`s
-or `FileDescriptor`s across IPC. Note that `Bundle` has several caveats:
+Developers **may** use `Bundle` in simple cases that require sending `Binder`s,
+`FileDescriptor`s, or platform `Parcelable`s across IPC
+([example](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:core/core/src/main/java/androidx/core/graphics/drawable/IconCompat.java;l=820)).
+Note that `Bundle` has several caveats:
 
 -   When running on Android S and below, accessing *any* entry in a `Bundle`
     will result in the platform attempting to deserialize *every* entry. This
@@ -813,6 +818,18 @@
     are responsible for providing their own system for guaranteeing wire format
     compatibility between versions.
 
+Developers **may** use `VersionedParcelable` in cases where they are already
+using the library and understand its limitations.
+
+In all cases, **do not** expose your serialization mechanism in your API
+surface.
+
+NOTE We are currently investigating the suitability of Square's
+[`wire` library](https://github.com/square/wire) for handling protocol buffers
+in Android libraries. If adopted, it will replace `proto` library dependencies.
+Libraries that expose their serialization mechanism in their API surface *will
+not be able to migrate*.
+
 #### Communication protocols
 
 Any communication prototcol, handshake, etc. must maintain compatibility
@@ -1301,8 +1318,9 @@
 
 ### Open-source compatibility {#dependencies-aosp}
 
-[Jetpack Principles](principles.md) require that libraries consider the
-open-source compatibility implications of their dependencies, including:
+Jetpack's [open-source](open_source.md) principle requires that libraries
+consider the open-source compatibility implications of their dependencies,
+including:
 
 -   Closed-source or proprietary libraries or services that may not be available
     on AOSP devices
diff --git a/docs/faq.md b/docs/faq.md
index b724a30..6080e83 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -4,21 +4,21 @@
 
 ## General FAQ
 
-### What is AndroidX?
+### What is `androidx`?
 
-The Android Extension (AndroidX) Libraries provide functionality that extends
+The Android Extension (`androidx`) Libraries provide functionality that extends
 the capabilities of the Android platform. These libraries, which ship separately
 from the Android OS, focus on improving the experience of developing apps
 through broad OS- and device-level compatibility, high-level abstractions to
 simplify and unify platform features, and other new features that target
-developer pain points. To find out more about AndroidX, see the public
+developer pain points. To find out more about `androidx`, see the public
 documentation on [developer.android.com](http://developer.android.com).
 
-### Why did we move to AndroidX?
+### Why did we move to `androidx`?
 
 Please read our
 [blog post](https://android-developers.googleblog.com/2018/05/hello-world-androidx.html)
-about our migration to AndroidX.
+about our migration.
 
 ### What happened to the Support Library?
 
@@ -30,16 +30,16 @@
 
 ### Will there be any more updates to Support Library?
 
-No, Revision 28.0.0 of the Support Library, which launched as stable in
+No, revision `28.0.0` of the Support Library, which launched as stable in
 September 2018, was the last feature release in the `android.support` package.
 There will be no further releases under Support Library packaging and they
 should be considered deprecated.
 
 ### How are `androidx` and AndroidX related to Jetpack?
 
-They are all the same thing! In a sentence, `androidx` is the packaging and
-AndroidX is the development workflow for all components in Jetpack. Jetpack is
-the external branding for libraries within `androidx`.
+They are effectively the same thing! In a sentence, `androidx` is the packaging
+and AndroidX is the development workflow for most components in Jetpack. Jetpack
+is the external branding for libraries within the `androidx` package.
 
 In more detail, Jetpack is the external branding for the set of components,
 tools, and guidance that improve the developer experience on Android. AndroidX
@@ -67,31 +67,6 @@
 
 ## Version FAQ {#version}
 
-### How are changes in dependency versions propagated?
-
-If you declare `api(project(":depGroupId"))` in your `build.gradle`, then the
-version change will occur automatically. While convienent, be intentional when
-doing so because this causes your library to have a direct dependency on the
-version in development.
-
-If you declare `api("androidx.depGroupId:depArtifactId:1.0.0")`, then the
-version change will need to be done manually and intentionally. This is
-considered best practice.
-
-### How does a library begin work on a new Minor version?
-
-Set the version to the next minor version, as an alpha.
-
-### How does a library ship an API reference documentation bugfix?
-
-Developers obtain API reference documentation from two sources -- HTML docs on
-[d.android.com](https://d.android.com), which are generated from library release
-artifacts, and Javadoc from source JARs on Google Maven.
-
-As a result, documentation bug fixes should be held with other fixes until they
-can go through a normal release cycle. Critical (e.g. P0) documentation issues
-**may** result in a [bugfix](loaf.md#bugfix) release independent of other fixes.
-
 ### When does an alpha ship?
 
 For public releases, an alpha ships when the library lead believes it is ready.
@@ -116,13 +91,3 @@
 
 As often as needed, however, releases outside of the bi-weekly (every 2 weeks)
 release will need to get approval from the TPM (nickanthony@).
-
-### What are the requirements for moving from alpha to beta?
-
-See the [beta section of Versioning guidelines](versioning.md?#beta) for
-pre-release cycle transition requirements.
-
-### What are the requirements for a beta launch?
-
-See the [beta section of Versioning guidelines](versioning.md?#beta) for
-pre-release cycle transition requirements.
diff --git a/docs/lint_guide.md b/docs/lint_guide.md
index c89e5d0..a3fc49f 100644
--- a/docs/lint_guide.md
+++ b/docs/lint_guide.md
@@ -604,13 +604,108 @@
 It is often necessary to process the sources more than once. This can be done by
 using `context.driver.requestRepeat(detector, scope)`.
 
-## Useful classes/packages
+## Helpful tips {#tips}
 
-### [`SdkConstants`](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-master-dev:common/src/main/java/com/android/SdkConstants.java)
+### Useful classes/packages
 
-Contains most of the canonical names for Android core library classes, as well
+[`SdkConstants`](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-master-dev:common/src/main/java/com/android/SdkConstants.java) -
+contains most of the canonical names for Android core library classes, as well
 as XML tag names.
 
+### Updating bytecode and checksum in tests
+
+When updating a file that is used in a lint test, the following error may appear
+when running tests:
+
+```
+The checksum does not match for java/androidx/sample/deprecated/DeprecatedKotlinClass.kt;
+expected 0x1af1856 but was 0x6692f601.
+Has the source file been changed without updating the binaries?
+Don't just update the checksum -- delete the binary file arguments and re-run the test first!
+java.lang.AssertionError: The checksum does not match for java/androidx/sample/deprecated/DeprecatedKotlinClass.kt;
+expected 0x1af1856 but was 0x6692f601.
+Has the source file been changed without updating the binaries?
+Don't just update the checksum -- delete the binary file arguments and re-run the test first!
+    at org.junit.Assert.fail(Assert.java:89)
+  ...
+```
+
+Here are the steps to fix this:
+
+1.  Remove the arguments in `compiled()`:
+
+    ```
+    // Before
+    compiled(
+      "libs/ktlib.jar",
+      ktSample("androidx.sample.deprecated.DeprecatedKotlinClass"),
+      0x6692f601,
+      """
+      META-INF/main.kotlin_module:
+      H4sIAAAAAAAAAGNgYGBmYGBgBGJWKM2gxKDFAABNj30wGAAAAA==
+      """,
+      """
+      androidx/sample/deprecated/DeprecatedKotlinClass.class:
+      H4sIAAAAAAAAAJVSy27TQBQ9YydxcQNNH5SUZyivlkWSpuxAiFIEighBCiit
+        // rest of bytecode
+      """
+    )
+
+    // After
+    compiled(
+      "libs/ktlib.jar",
+      ktSample("androidx.sample.deprecated.DeprecatedKotlinClass"),
+    )
+    ```
+
+2.  Set `$LINT_TEST_KOTLINC` to the location of `kotlinc` if you haven't
+    already, and add it to the test run configuration's environment variables.
+
+    Note: The location of `kotlinc` can vary; use your system's file finder to
+    determine the exact location. For gLinux, search under
+    `~/.local/share/JetBrains`. For Mac, search under `<your androidx checkout
+    root>/frameworks/support/studio`
+
+    If it's not set (or set incorrectly), this error message appears when
+    running tests:
+
+    ```
+    Couldn't find kotlinc to update test file java/androidx/sample/deprecated/DeprecatedKotlinClass.kt with.
+    Point to it with $LINT_TEST_KOTLINC
+    ```
+
+3.  Run the test, which will output the new bytecode and checksum:
+
+    ```
+    Update the test source declaration for java/androidx/sample/deprecated/DeprecatedKotlinClass.kt with this list of encodings:
+
+    Kotlin:
+                  compiled(
+                      "libs/ktlib.jar",
+                      kotlin(
+                          """
+                          package java.androidx.sample.deprecated
+
+                          @Deprecated(
+                              // (rest of inlined sample file)
+                          """
+                      ).indented(),
+                      0x5ba03e2d,
+                  """
+                  META-INF/main.kotlin_module:
+                  H4sIAAAAAAAAAGNgYGBmYGBgBGJWKM2gxKDFAABNj30wGAAAAA==
+                    // rest of bytecode
+                  """,
+                  """
+                  java/androidx/sample/deprecated/DeprecatedKotlinClass.class:
+                  """
+                  )
+    ```
+
+Note: the generated replacement code will inline the specified sample file (in
+our case, `ktSample("androidx.sample.deprecated.DeprecatedKotlinClass")`).
+Replace the inlined code with the sample declaration.
+
 ## Helpful links
 
 [Writing Custom Lint Rules](https://googlesamples.github.io/android-custom-lint-rules/)
diff --git a/docs/onboarding.md b/docs/onboarding.md
index 005a845..4ff2944 100644
--- a/docs/onboarding.md
+++ b/docs/onboarding.md
@@ -27,15 +27,16 @@
     > ~/bin/repo && chmod 700 ~/bin/repo
 ```
 
-Then, modify `~/.bash_profile` (if using `bash`) to ensure you can find local
-binaries from the command line.
+Then, modify `~/.zshrc` (or `~/.bash_profile` if using `bash`) to ensure you can
+find local binaries from the command line. We assume you're using zsh, but the
+following should work with `bash` as well.
 
 ```shell
 export PATH=~/bin:$PATH
 ```
 
-You will need to either start a new terminal session or run `source
-~/.bash_profile` to pick up the new path.
+You will need to either start a new terminal session or run `source ~/.zshrc`
+(or `source ~/.bash_profile` if using bash) to pick up the new path.
 
 If you encounter an SSL `CERTIFICATE_VERIFY_FAILED` error or warning about
 Python 2 being no longer supported, you will need to install Python 3 and alias
@@ -56,8 +57,8 @@
 information about SSL/TLS certificate validation and the running the "Install
 Certificates.command".
 
-Next, open your `~/.bash_profile` and add the following lines to wrap the `repo`
-command:
+Next, open your `~/.zshrc` (or `~/.bash_profile` if using bash) and add the
+following lines to wrap the `repo` command:
 
 ```shell
 # Force repo to run with Python3
@@ -618,7 +619,7 @@
 topic) with the dependent library code.
 
 Libraries typically reference dependencies using constants defined in
-[`Dependencies.kt`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:buildSrc/public/src/main/kotlin/androidx/build/dependencies/Dependencies.kt),
+[`libs.versions.toml`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:gradle/libs.versions.toml),
 so please update this file to include a constant for the version of the library
 that you have checked in. You will reference this constant in your library's
 `build.gradle` dependencies.
@@ -686,7 +687,10 @@
 ### Benchmarking {#testing-benchmarking}
 
 Libraries are encouraged to write and monitor performance benchmarks. See the
-[Benchmarking](benchmarking.md) page for more details.
+[Benchmarking](benchmarking.md) and [Macrobenchmarking](macrobenchmarking.md)
+pages for more details, and the
+[Benchmarking section of d.android.com](http://d.android.com/benchmark) for more
+info on these tools.
 
 ## Library snapshots {#snapshots}
 
diff --git a/docs/open_source.md b/docs/open_source.md
index b5504f0..75d2a4d 100644
--- a/docs/open_source.md
+++ b/docs/open_source.md
@@ -4,7 +4,7 @@
 
 <!--*
 # Document freshness: For more information, see go/fresh-source.
-freshness: { owner: 'alanv' reviewed: '2021-07-15' }
+freshness: { owner: 'alanv' reviewed: '2022-01-14' }
 *-->
 
 [TOC]
@@ -23,13 +23,18 @@
 
 ### Exceptions
 
-The only exception to this definition is the Android platform SDK, which does
-not release sources until well after its API surface has been finalized.
+The only unconditional exception to this definition is the Android platform SDK,
+which does not release sources until well after its API surface has been
+finalized.
 
 Libraries which are developed against the pre-release Android platform SDK _may_
 remain closed-source until the platform SDK's API surface is finalized, at which
 they **must** move to open-source.
 
+In specific cases, libraries *may* include closed-source dependencies. See the
+[Open-source compatibility](api_guidelines.md#dependencies-aosp) section of the
+API Guidelines for implementation details.
+
 ### Examples of products that are _not_ open-source
 
 *   A bundled `.so` file with no publicly-available source code
diff --git a/docs/testing.md b/docs/testing.md
index 5378606..d6ad752 100644
--- a/docs/testing.md
+++ b/docs/testing.md
@@ -137,9 +137,9 @@
 following contents:
 
 ```
-# Robolectric currently doesn't support API 32, so we have to explicitly specify 30 as the target
+# Robolectric currently doesn't support API 31, so we have to explicitly specify 30 as the target
 # sdk for now. Remove when no longer necessary.
-sdk=31
+sdk=30
 ```
 
 ## Using the emulator {#emulator}
diff --git a/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropHelper.java b/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropHelper.java
index 27df15e..705c12a 100644
--- a/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropHelper.java
+++ b/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropHelper.java
@@ -43,29 +43,30 @@
  * operation. Includes support for content insertion using an
  * {@link OnReceiveContentListener OnReceiveContentListener}. Adds highlighting during the drag
  * interaction to indicate to the user where the drop action can successfully take place.
- * <p>
- * To ensure that drop target highlighting and text data handling work correctly, all
+ *
+ * <p>To ensure that drop target highlighting and text data handling work correctly, all
  * {@link EditText} elements in the drop target view's descendant tree (that is, any
  * {@code EditText} elements contained within the drop target) must be provided as arguments to a
  * call to {@link DropHelper.Options.Builder#addInnerEditTexts(EditText...)}. Otherwise, an
  * {@code EditText} within the target will steal the focus during the drag and drop operation,
  * possibly causing undesired highlighting behavior.
- * <p>
- * Also, if the user is dragging text data and URI data in the drag and drop {@link ClipData}, one
- * of the {@code EditText} elements in the drop target is automatically chosen to handle the text
- * data. See {@link DropHelper.Options.Builder#addInnerEditTexts(EditText...)} for the order of
+ *
+ * <p>Also, if the user is dragging text data and URI data in the drag and drop {@link ClipData},
+ * one of the {@code EditText} elements in the drop target is automatically chosen to handle the
+ * text data. See {@link DropHelper.Options.Builder#addInnerEditTexts(EditText...)} for the order of
  * precedence in selecting the {@code EditText} that handles the text data.
- * <p>
- * This helper attaches an {@link OnReceiveContentListener OnReceiveContentListener}
- * to drop targets (see {@link #configureView configureView}) and configures drop targets to listen
- * for drag and drop events. Do not attach an {@link OnDragListener OnDragListener} or additional
- * {@code OnReceiveContentLister} to drop targets when using {@link DropHelper}.
- * <p>
- * <b>Note:</b> This class requires Android API level 24 or higher.
+ *
+ * <p>This helper attaches an {@link OnReceiveContentListener OnReceiveContentListener} to drop
+ * targets and configures drop targets to listen for drag and drop events (see
+ * {@link #configureView(Activity, View, String[], OnReceiveContentListener) configureView}). Do not
+ * attach an {@link OnDragListener OnDragListener} or additional {@code OnReceiveContentLister} to
+ * drop targets when using {@link DropHelper}.
+ *
+ * <p><b>Note:</b> This class requires Android API level 24 or higher.
  *
  * @see <a href="https://developer.android.com/guide/topics/ui/drag-drop">Drag and drop</a>
  * @see <a href="https://developer.android.com/guide/topics/large-screens/multi-window-support#dnd">
- *   Multi-window support</a>
+ *     Multi-window support</a>
  */
 @RequiresApi(Build.VERSION_CODES.N)
 public final class DropHelper {
diff --git a/emoji2/emoji2-bundled/api/1.1.0-beta02.txt b/emoji2/emoji2-bundled/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-bundled/api/public_plus_experimental_1.1.0-beta02.txt b/emoji2/emoji2-bundled/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/emoji2/emoji2-bundled/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to emoji2/emoji2-bundled/api/res-1.1.0-beta02.txt
diff --git a/emoji2/emoji2-bundled/api/restricted_1.1.0-beta02.txt b/emoji2/emoji2-bundled/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..8749c28
--- /dev/null
+++ b/emoji2/emoji2-bundled/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.emoji2.bundled {
+
+  public class BundledEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public BundledEmojiCompatConfig(android.content.Context);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/1.1.0-beta02.txt b/emoji2/emoji2-views-helper/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/1.1.0-beta02.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views-helper/api/public_plus_experimental_1.1.0-beta02.txt b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/emoji2/emoji2-views-helper/api/res-1.1.0-beta02.txt
similarity index 100%
rename from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
rename to emoji2/emoji2-views-helper/api/res-1.1.0-beta02.txt
diff --git a/emoji2/emoji2-views-helper/api/restricted_1.1.0-beta02.txt b/emoji2/emoji2-views-helper/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..30a6feb
--- /dev/null
+++ b/emoji2/emoji2-views-helper/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,27 @@
+// Signature format: 4.0
+package androidx.emoji2.viewsintegration {
+
+  public final class EmojiEditTextHelper {
+    ctor public EmojiEditTextHelper(android.widget.EditText);
+    ctor public EmojiEditTextHelper(android.widget.EditText, boolean);
+    method public android.text.method.KeyListener? getKeyListener(android.text.method.KeyListener?);
+    method public int getMaxEmojiCount();
+    method public boolean isEnabled();
+    method public android.view.inputmethod.InputConnection? onCreateInputConnection(android.view.inputmethod.InputConnection?, android.view.inputmethod.EditorInfo);
+    method public void setEnabled(boolean);
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public final class EmojiTextViewHelper {
+    ctor public EmojiTextViewHelper(android.widget.TextView);
+    ctor public EmojiTextViewHelper(android.widget.TextView, boolean);
+    method public android.text.InputFilter![] getFilters(android.text.InputFilter![]);
+    method public boolean isEnabled();
+    method public void setAllCaps(boolean);
+    method public void setEnabled(boolean);
+    method public void updateTransformationMethod();
+    method public android.text.method.TransformationMethod? wrapTransformationMethod(android.text.method.TransformationMethod?);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/1.1.0-beta02.txt b/emoji2/emoji2-views/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/1.1.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/public_plus_experimental_1.1.0-beta02.txt b/emoji2/emoji2-views/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2-views/api/res-1.1.0-beta02.txt b/emoji2/emoji2-views/api/res-1.1.0-beta02.txt
new file mode 100644
index 0000000..8bc8423
--- /dev/null
+++ b/emoji2/emoji2-views/api/res-1.1.0-beta02.txt
@@ -0,0 +1,2 @@
+attr emojiReplaceStrategy
+attr maxEmojiCount
diff --git a/emoji2/emoji2-views/api/restricted_1.1.0-beta02.txt b/emoji2/emoji2-views/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..879b30e
--- /dev/null
+++ b/emoji2/emoji2-views/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.emoji2.widget {
+
+  public class EmojiButton extends android.widget.Button {
+    ctor public EmojiButton(android.content.Context);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiButton(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class EmojiEditText extends android.widget.EditText {
+    ctor public EmojiEditText(android.content.Context);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiEditText(android.content.Context, android.util.AttributeSet?, int);
+    method public int getMaxEmojiCount();
+    method public void setMaxEmojiCount(@IntRange(from=0) int);
+  }
+
+  public class EmojiExtractTextLayout extends android.widget.LinearLayout {
+    ctor public EmojiExtractTextLayout(android.content.Context);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiExtractTextLayout(android.content.Context, android.util.AttributeSet?, int);
+    method public int getEmojiReplaceStrategy();
+    method public void onUpdateExtractingViews(android.inputmethodservice.InputMethodService, android.view.inputmethod.EditorInfo);
+    method public void setEmojiReplaceStrategy(int);
+  }
+
+  public class EmojiTextView extends android.widget.TextView {
+    ctor public EmojiTextView(android.content.Context);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public EmojiTextView(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/1.1.0-beta02.txt b/emoji2/emoji2/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..9bd1d09
--- /dev/null
+++ b/emoji2/emoji2/api/1.1.0-beta02.txt
@@ -0,0 +1,112 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getEmojiMatch(CharSequence, @IntRange(from=0) int);
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int EMOJI_FALLBACK = 2; // 0x2
+    field public static final int EMOJI_SUPPORTED = 1; // 0x1
+    field public static final int EMOJI_UNSUPPORTED = 0; // 0x0
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/emoji2/emoji2/api/public_plus_experimental_1.1.0-beta02.txt b/emoji2/emoji2/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..9bd1d09
--- /dev/null
+++ b/emoji2/emoji2/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,112 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getEmojiMatch(CharSequence, @IntRange(from=0) int);
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int EMOJI_FALLBACK = 2; // 0x2
+    field public static final int EMOJI_SUPPORTED = 1; // 0x1
+    field public static final int EMOJI_UNSUPPORTED = 0; // 0x0
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt b/emoji2/emoji2/api/res-1.1.0-beta02.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-1.0.0.txt
copy to emoji2/emoji2/api/res-1.1.0-beta02.txt
diff --git a/emoji2/emoji2/api/restricted_1.1.0-beta02.txt b/emoji2/emoji2/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..9bd1d09
--- /dev/null
+++ b/emoji2/emoji2/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,112 @@
+// Signature format: 4.0
+package androidx.emoji2.text {
+
+  public final class DefaultEmojiCompatConfig {
+    method public static androidx.emoji2.text.FontRequestEmojiCompatConfig? create(android.content.Context);
+  }
+
+  @AnyThread public class EmojiCompat {
+    method public static androidx.emoji2.text.EmojiCompat get();
+    method public String getAssetSignature();
+    method public int getEmojiMatch(CharSequence, @IntRange(from=0) int);
+    method public int getLoadState();
+    method public static boolean handleDeleteSurroundingText(android.view.inputmethod.InputConnection, android.text.Editable, @IntRange(from=0) int, @IntRange(from=0) int, boolean);
+    method public static boolean handleOnKeyDown(android.text.Editable, int, android.view.KeyEvent);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence);
+    method @Deprecated public boolean hasEmojiGlyph(CharSequence, @IntRange(from=0) int);
+    method public static androidx.emoji2.text.EmojiCompat? init(android.content.Context);
+    method public static androidx.emoji2.text.EmojiCompat init(androidx.emoji2.text.EmojiCompat.Config);
+    method public static boolean isConfigured();
+    method public void load();
+    method @CheckResult public CharSequence? process(CharSequence?);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+    method @CheckResult public CharSequence? process(CharSequence?, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, int);
+    method public void registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public void updateEditorInfo(android.view.inputmethod.EditorInfo);
+    field public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion";
+    field public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll";
+    field public static final int EMOJI_FALLBACK = 2; // 0x2
+    field public static final int EMOJI_SUPPORTED = 1; // 0x1
+    field public static final int EMOJI_UNSUPPORTED = 0; // 0x0
+    field public static final int LOAD_STATE_DEFAULT = 3; // 0x3
+    field public static final int LOAD_STATE_FAILED = 2; // 0x2
+    field public static final int LOAD_STATE_LOADING = 0; // 0x0
+    field public static final int LOAD_STATE_SUCCEEDED = 1; // 0x1
+    field public static final int LOAD_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int LOAD_STRATEGY_MANUAL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_ALL = 1; // 0x1
+    field public static final int REPLACE_STRATEGY_DEFAULT = 0; // 0x0
+    field public static final int REPLACE_STRATEGY_NON_EXISTENT = 2; // 0x2
+  }
+
+  public abstract static class EmojiCompat.Config {
+    ctor protected EmojiCompat.Config(androidx.emoji2.text.EmojiCompat.MetadataRepoLoader);
+    method protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader();
+    method public androidx.emoji2.text.EmojiCompat.Config registerInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorColor(@ColorInt int);
+    method public androidx.emoji2.text.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setGlyphChecker(androidx.emoji2.text.EmojiCompat.GlyphChecker);
+    method public androidx.emoji2.text.EmojiCompat.Config setMetadataLoadStrategy(int);
+    method public androidx.emoji2.text.EmojiCompat.Config setReplaceAll(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean);
+    method public androidx.emoji2.text.EmojiCompat.Config setUseEmojiAsDefaultStyle(boolean, java.util.List<java.lang.Integer!>?);
+    method public androidx.emoji2.text.EmojiCompat.Config unregisterInitCallback(androidx.emoji2.text.EmojiCompat.InitCallback);
+  }
+
+  public static interface EmojiCompat.GlyphChecker {
+    method public boolean hasGlyph(CharSequence, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+  }
+
+  public abstract static class EmojiCompat.InitCallback {
+    ctor public EmojiCompat.InitCallback();
+    method public void onFailed(Throwable?);
+    method public void onInitialized();
+  }
+
+  public static interface EmojiCompat.MetadataRepoLoader {
+    method public void load(androidx.emoji2.text.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public abstract static class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(Throwable?);
+    method public abstract void onLoaded(androidx.emoji2.text.MetadataRepo);
+  }
+
+  public class EmojiCompatInitializer implements androidx.startup.Initializer<java.lang.Boolean> {
+    ctor public EmojiCompatInitializer();
+    method public Boolean create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  @RequiresApi(19) public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
+    method public int getSize(android.graphics.Paint, CharSequence!, int, int, android.graphics.Paint.FontMetricsInt?);
+  }
+
+  public class FontRequestEmojiCompatConfig extends androidx.emoji2.text.EmojiCompat.Config {
+    ctor public FontRequestEmojiCompatConfig(android.content.Context, androidx.core.provider.FontRequest);
+    method @Deprecated public androidx.emoji2.text.FontRequestEmojiCompatConfig setHandler(android.os.Handler?);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setLoadingExecutor(java.util.concurrent.Executor);
+    method public androidx.emoji2.text.FontRequestEmojiCompatConfig setRetryPolicy(androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy?);
+  }
+
+  public static class FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy extends androidx.emoji2.text.FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.ExponentialBackoffRetryPolicy(long);
+    method public long getRetryDelay();
+  }
+
+  public abstract static class FontRequestEmojiCompatConfig.RetryPolicy {
+    ctor public FontRequestEmojiCompatConfig.RetryPolicy();
+    method public abstract long getRetryDelay();
+  }
+
+  @AnyThread @RequiresApi(19) public final class MetadataRepo {
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.io.InputStream) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.graphics.Typeface, java.nio.ByteBuffer) throws java.io.IOException;
+    method public static androidx.emoji2.text.MetadataRepo create(android.content.res.AssetManager, String) throws java.io.IOException;
+  }
+
+}
+
diff --git a/external/libyuv/build.gradle b/external/libyuv/build.gradle
index 0053864..a107dbe 100644
--- a/external/libyuv/build.gradle
+++ b/external/libyuv/build.gradle
@@ -38,7 +38,7 @@
 
     externalNativeBuild {
         cmake {
-            version "3.22.1"
+            version libs.versions.cmake.get()
             path "${yuvSourceDir}/files/CMakeLists.txt"
         }
     }
diff --git a/glance/glance-appwidget/build.gradle b/glance/glance-appwidget/build.gradle
index 52102dc..e87acb8 100644
--- a/glance/glance-appwidget/build.gradle
+++ b/glance/glance-appwidget/build.gradle
@@ -14,11 +14,9 @@
  * limitations under the License.
  */
 
-
 import androidx.build.AndroidXComposePlugin
 import androidx.build.LibraryGroups
 import androidx.build.LibraryType
-import androidx.build.Publish
 import androidx.glance.appwidget.layoutgenerator.gradle.LayoutGeneratorTask
 
 plugins {
diff --git a/glance/glance-appwidget/integration-tests/demos/build.gradle b/glance/glance-appwidget/integration-tests/demos/build.gradle
index f9018a0..a7b7606 100644
--- a/glance/glance-appwidget/integration-tests/demos/build.gradle
+++ b/glance/glance-appwidget/integration-tests/demos/build.gradle
@@ -26,8 +26,7 @@
     kotlinPlugin(project(":compose:compiler:compiler"))
 
     implementation(libs.kotlinStdlib)
-    implementation(project(":glance:glance"))
-    implementation(project(":glance:glance-appwidget"))
+    implementation(project(":template:template-appwidget"))
     implementation("androidx.activity:activity:1.4.0")
     implementation("androidx.activity:activity-compose:1.4.0")
     implementation("androidx.compose.material:material:1.1.0-beta02")
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml b/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
index 6039b6b..bcbaa70 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
@@ -94,6 +94,20 @@
         </receiver>
 
         <receiver
+            android:name="androidx.glance.appwidget.demos.SingleItemWidgetReceiver"
+            android:enabled="@bool/glance_appwidget_available"
+            android:exported="false"
+            android:label="@string/single_item_widget_name">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+                <action android:name="android.intent.action.LOCALE_CHANGED" />
+            </intent-filter>
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/default_app_widget_info" />
+        </receiver>
+
+        <receiver
             android:name="androidx.glance.appwidget.demos.ActionAppWidgetReceiver"
             android:enabled="@bool/glance_appwidget_available"
             android:exported="false"
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/SingleItemWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/SingleItemWidget.kt
new file mode 100644
index 0000000..0a16348
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/SingleItemWidget.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.glance.appwidget.demos
+
+import android.content.Context
+import androidx.datastore.preferences.core.Preferences
+import androidx.datastore.preferences.core.booleanPreferencesKey
+import androidx.glance.GlanceId
+import androidx.glance.ImageProvider
+import androidx.glance.action.ActionParameters
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.GlanceAppWidgetReceiver
+import androidx.glance.appwidget.action.ActionCallback
+import androidx.glance.appwidget.action.actionRunCallback
+import androidx.glance.appwidget.state.updateAppWidgetState
+import androidx.template.appwidget.GlanceTemplateAppWidget
+import androidx.template.template.SingleItemTemplate
+
+/** A [SingleItemTemplate] implementation that sets the title given widget state */
+class MyWidgetTemplate : SingleItemTemplate() {
+    override fun getData(state: Any?): Data {
+        require(state is Preferences)
+        return createData(getTitle(state[PressedKey] == true))
+    }
+}
+
+private val PressedKey = booleanPreferencesKey("pressedKey")
+
+class ButtonAction : ActionCallback {
+    override suspend fun onRun(context: Context, glanceId: GlanceId, parameters: ActionParameters) {
+        // Toggle the "pressed" state
+        val widget = SingleItemWidget()
+        widget.updateAppWidgetState<Preferences>(context, glanceId) { prefs ->
+            prefs.toMutablePreferences().apply { this[PressedKey] = this[PressedKey] != true }
+        }
+        widget.update(context, glanceId)
+    }
+}
+
+class SingleItemWidget : GlanceTemplateAppWidget(MyWidgetTemplate())
+
+class SingleItemWidgetReceiver : GlanceAppWidgetReceiver() {
+    override val glanceAppWidget: GlanceAppWidget = SingleItemWidget()
+}
+
+private fun createData(title: String) = SingleItemTemplate.Data(
+    title,
+    "button",
+    actionRunCallback<ButtonAction>(),
+    ImageProvider(R.drawable.compose),
+    R.color.default_widget_background
+)
+
+private fun getTitle(pressed: Boolean) = if (pressed) "title2" else "title1"
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
index abfe81e0..2f705845 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
@@ -21,6 +21,7 @@
     <string name="responsive_widget_name">Responsive Widget</string>
     <string name="exact_widget_name">Exact Widget</string>
     <string name="responsive_widget_title"><u>Responsive layout</u></string>
+    <string name="single_item_widget_name"><u>Single item widget</u></string>
     <string name="action_widget_name"><u>Action widget</u></string>
     <string name="exact_widget_title"><u>Exact layout</u></string>
     <string name="resizing_widget_name">Resizing Widget</string>
diff --git a/gradle.properties b/gradle.properties
index c44b094..e6166a5 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -5,6 +5,7 @@
 org.gradle.caching=true
 # Disabled due to https://github.com/gradle/gradle/issues/18626
 # org.gradle.vfs.watch=true
+org.gradle.dependency.verification.console=verbose
 org.gradle.unsafe.configuration-cache=true
 org.gradle.unsafe.configuration-cache-problems=warn
 org.gradle.unsafe.configuration-cache.max-problems=4000
diff --git a/gradle/README.md b/gradle/README.md
new file mode 100644
index 0000000..3171b6b
--- /dev/null
+++ b/gradle/README.md
@@ -0,0 +1,56 @@
+## wrapper/gradle-wrapper.properties
+
+Keeps track of Gradle version used by androidx. When updating the version a new version prebuilt needs to be added to `tools/external/gradle` repository.
+
+## libs.versions.toml
+
+Keeps track of library and plugin dependencies used by androidx. Adding or updating a library there requires running `./development/importMaven/import_maven_artifacts.py -n myartifact:here:1.0.0`
+
+## verification-keyring.keys
+
+Checked-in [local keyring](https://docs.gradle.org/current/userguide/dependency_verification.html#sec:local-keyring)
+that is used to avoid reaching out to key servers whenever a key is required by Gradle to verify an
+artifact.
+
+AndroidX only uses human readable `verification-keyring.keys`. Gradle also generates binary
+`verification-keyring.gpg`, but it is optional, and thus we do not use it.
+
+In order to add a trusted new key, first add it as a trusted-key to `verification-metadata.xml`.
+For example
+```
+<trusted-key id="012579464d01c06a" group="org.apache"/>
+```
+
+This allows Gradle to trust it, but we also need to store the key in `verification-keyring.keys`
+and to do that we need to run:
+```
+./gradlew -M sha256 --export-keys buildOnServer --dry-run
+```
+
+This will create `gradle/verification-keyring-dryrun.gpg`, `gradle/verification-keyring-dryrun.keys`,
+`gradle/verification-metadata.dryrun.xml`.
+
+Then you will want to run:
+```
+cp gradle/verification-keyring-dryrun.keys gradle/verification-keyring.keys
+```
+
+You can then delete all the `verification-*-dryrun.*` files.
+
+## verification-metadata.xml
+
+[Configuration file for Gradle dependency verification](https://docs.gradle.org/current/userguide/dependency_verification.html#sub:verification-metadata) used by androidx to make sure dependencies are [signed with trusted signatures](https://docs.gradle.org/current/userguide/dependency_verification.html#sec:signature-verificationn) and that unsigned artifacts have [expected checksums](https://docs.gradle.org/current/userguide/dependency_verification.html#sec:checksum-verification).
+
+When adding a new artifact
+- if it is signed, then follow `verification-keyring.keys` instructions above to add it to trusted-keys
+- if it is not signed, then run the following to add generated checksums to `verification-metadata.xml`:
+
+```
+./gradlew -M sha256 buildOnServer --dry-run
+```
+
+Then you will want to diff `gradle/verification-metadata.dryrun.xml` and
+`gradle/verification-metadata.xml` using your favorite tool (e.g. meld) can copy over the entries
+that are relevant to your new artifacts.
+
+You can then delete all the `verification-*-dryrun.*` files.
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 93ed0af..0723f39 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -22,6 +22,7 @@
 atomicFu = "0.14.4"
 autoService = "1.0-rc6"
 autoValue = "1.6.3"
+cmake = "3.22.1"
 dagger = "2.40.1"
 dexmaker = "2.25.0"
 espresso = "3.3.0"
@@ -35,7 +36,7 @@
 ktlint = "0.43.0"
 leakcanary = "2.7"
 mockito = "2.25.0"
-skiko = "0.5.2"
+skiko = "0.7.2"
 sqldelight = "1.3.0"
 wire = "3.6.0"
 
@@ -150,13 +151,13 @@
 rxjava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.9" }
 rxjava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.0.0" }
 shadow = { module = "gradle.plugin.com.github.johnrengelman:shadow", version = "7.1.1" }
-skiko = { module = "org.jetbrains.skiko:skiko-jvm", version.ref = "skiko" }
+skiko = { module = "org.jetbrains.skiko:skiko-awt", version.ref = "skiko" }
 skikoCommon = { module = "org.jetbrains.skiko:skiko", version.ref = "skiko" }
-skikoMacOsArm64 = { module = "org.jetbrains.skiko:skiko-jvm-runtime-macos-arm64", version.ref = "skiko" }
-skikoMacOsX64 = { module = "org.jetbrains.skiko:skiko-jvm-runtime-macos-x64", version.ref = "skiko" }
-skikoWindowsX64 = { module = "org.jetbrains.skiko:skiko-jvm-runtime-windows-x64", version.ref = "skiko" }
-skikoLinuxX64 = { module = "org.jetbrains.skiko:skiko-jvm-runtime-linux-x64", version.ref = "skiko" }
-skikoLinuxArm64 = { module = "org.jetbrains.skiko:skiko-jvm-runtime-linux-arm64", version.ref = "skiko" }
+skikoMacOsArm64 = { module = "org.jetbrains.skiko:skiko-awt-runtime-macos-arm64", version.ref = "skiko" }
+skikoMacOsX64 = { module = "org.jetbrains.skiko:skiko-awt-runtime-macos-x64", version.ref = "skiko" }
+skikoWindowsX64 = { module = "org.jetbrains.skiko:skiko-awt-runtime-windows-x64", version.ref = "skiko" }
+skikoLinuxX64 = { module = "org.jetbrains.skiko:skiko-awt-runtime-linux-x64", version.ref = "skiko" }
+skikoLinuxArm64 = { module = "org.jetbrains.skiko:skiko-awt-runtime-linux-arm64", version.ref = "skiko" }
 sqldelightAndroid = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
 sqldelightCoroutinesExt = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
 sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.36.0" }
diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys
new file mode 100644
index 0000000..53f46cf
--- /dev/null
+++ b/gradle/verification-keyring.keys
@@ -0,0 +1,19848 @@
+pub    1861C322C56014B2
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEGVK0ERBADwhGhmOMvSgvGaqHW3ial0NS80ZXyE1EeNL6ke/WrXHB4dT6if
+inoAuUgRz3v9Na4rjSQ8YVFjn3NaZq1i8RM2KJOUU8ZkJ2AsrH6fqStjofLTd5ng
+iQaq2wLM5rTQfdjLsGQb1iDNDyCXU56+/l4mFZ2JiEGCq3Re9EFHelRBKQCg/7k0
+BIfyoFVTHw39PKaDBmCYF2sD/3CMD0J/WldhBM7gLOndH9/YEQaEMy+PJNXcfTWN
+WLygGPSOQdNBulyLkvcFIZjUTxFVakh7FbjMq3dsAP1oqthwmK7L8A1zsvRgp/TI
+4YMHkZSkgcs0PBBby+h/lpgRrWmtwjTPzql/K5xX4VSRS+umHye/7R+4ZEH7mABa
+m/ZABADkPGG2ECvfjNosPQDHZVFuF9oVaske0OjzxI+rU6sR1fJKtbOPl9d+bgz+
+df7rZ3mwppkPX2r/muUbd0CM1Se10sK7ZAoPYmWqHX+vB/oj3Jq+iqb6M5mDZzEz
+6h4hdnaGERyxbktZvhRV7Psco9CGi8o7RFUQTR79Y5ElnBavqLkCDQRBlStBEAgA
+9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt
+90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcw
+Yc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZr
+M2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEs
+tSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8
+vYlLIhkmuquiXsNV6TILOwACAggAw6kL0PhPZ/EPI0mPfmIYeaKUgTB8q47nDKY4
+6wDs1l/msVJHAVwGEBHuxmbC7r/qfAgfSW+/Lj4XbSLCqaZIWSu6lfY43IOIYXD4
+pe5cCnWkQij+h3LxRR6uDmBr5cwheHEuB2sMFU5lJiiQR1+eXYkPNK4FgVQpHLWe
+boODAlTf0j8gRR+aTs5eWXqfSA+UEsXpn6453bfZKELXkRmEznb4xyGWJaLW2Mlm
+aRlauYvc61M7FK8z15SSZbq6oictpnEcfkgnBxcNza3jZQV7WOWZ3BlD1nKQ661s
+bmS81/nLnxbov9ASs25K2olXBsHkERhjMnERedvv7avlmBwi1ohMBBgRAgAMBQJB
+lStBBRsMAAAAAAoJEBhhwyLFYBSyGTQAn2u/CvPzKwRv1FUkPYR751j9PGwDAJ4k
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=alQS
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    438E9634A2319637
+uid    Constantin Rack <[email protected]>
+
+sub    2C8E4A350000730C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+qS9F
+=OTJj
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    438E9634A2319637
+uid    Constantin Rack <[email protected]>
+
+sub    2C8E4A350000730C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+qS9F
+=OTJj
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    82B5574242C20D6F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBFC1VWUBDADZwqBEEmSjwy2JADG0qCpvVQzC5KszL0CjzqTLPMBmLKNuc/36
+26MU4yI8Y+pcCTnC3LN9hrI0hxiP4zFFFyLYKkUWCZRAwj4OQlnyTDKa9frKBMed
+PJtihlQAKeCtMh9AOXNa+hZoAAEG/dfIOJhLyZB7JEuuwkil65R4yLrdnbbhPYMi
+1k0GJsaxG3IhkR/XQMO6m1KnThxyk2GPQNLFHUVSN+Gqz9m6u7oUxhhFjwUj3DZb
+8oGcQ08JR7IGdB8qV+XC997MUGjbRRu05hfWJecR0Z8xkprsdKSbFjuw24lZtsfJ
+w8advblczq//NvaUj2g/U/McoTPKoWXDFSPtw0UydazGtBUEM7SFer29upgyxA24
+oHoT4qUj3+lelhBbsf79YuI2M+q6OfeWXfOEO6xkcw54SmcvfYYatGg9UBiZq9PK
+oUfyn4IOKhxPY82N35tDfoeBXDAwr8r00NkFJl2vHv8QkIKQFF4HWLJw/aElij5t
+T34qVUE12H0+oikAEQEAAQ==
+=Uua5
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    55C7E5E701832382
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mI0EVdDLQQEEAJMtYCaTA56YsP5RzQzPvqVTaR2nZ27qRk36blHB9WmXK+NHpGeH
+PHgq59mLPVueo2/M5k/fFrCe36jHePP31gYpFtueeYDfsofHwod0WhsHyC7JfG8d
+jEnSczTCmOHRZ3ed9ef6SeWUozYCQAX/tAbpoCthe0lTDYhFhkzVCe/FABEBAAE=
+=45ZY
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A6ADFC93EF34893E
+uid    Tom Denley (scarytom) <[email protected]>
+
+sub    9C4C23E6FFE405BD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN
+OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr
+9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe
+d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+
+0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg
+SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG0K1RvbSBEZW5sZXkgKHNj
+YXJ5dG9tKSA8dC5kZW5sZXlAY2FudGFiLm5ldD6JATgEEwECACIFAk+xZxICGwMG
+CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEKat/JPvNIk+ysEH/iY5dP/4ERAQ
+8YC1j1XoYmMxW219uzxZfwI0ltLtPjGQlZbwlFvwjZk0nDJ6O1iZSeZQm804uRup
+gUZe3wqOp7a7z5zHab93QD/nA7O9QmLf2RC7Y0mW0EvD0tfbCzt6JJkAaxKTDA+T
+jFoukUZx2KJr0XToE6kwAnKmCgyFkzb2SUqfsBRNRBJBa6XG/1mAtDJJSM1XLChV
+Sa9nLwYjZzIcebtmtQ1vVqovO74ixxEzonLlNZi7tkc3GS23yntf5tAH0bQ9bM68
+TB9RHpLvjGgHUJtghFQN/Ny+//q1EsjRGn6Pa20cUPxnMS+WguOYIQx5jTb9ZHA0
+WBcu/V4UL8W5AQ0ET7FnEgEIAM3i3e1sjwrx2PN8XYMPQWG+/YTtw1BYDl2+iYE+
+LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXogWqKrkJ0LRjlpdKhKBvyH1ex4grh3cWN
+/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+MR3aFIsii+vadrwYYvuVYGeWvdZhB7mJ
+KYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG7Xd3tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6
+JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC9cHh5eCol11uSoWPKcQR2Ar8Eo56nxv/
+UApdu15iJ7R8cA5guKeeS4jt0CGCPs2PhuggDxI73Xvl4zsAEQEAAYkBHwQYAQIA
+CQUCT7FnEgIbDAAKCRCmrfyT7zSJPuylB/9iwtIQeexMWBmQNdDe0md8HLulDfcu
+jPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb1YCP79uF0qgswSxINYCOJx4nTPIP9BOd
+TwqfGo7ul27REgNq4lIUW0GkMgZAUA2ft/vc0u/I0PqnhKCi4Pq79hLIx7eiX2yS
+fXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA54J1qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2c
+pIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/o0co+GoYkieIxxibDCmt3BioLgmyzpGU
+sMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJEEIhZlI/ojefaZkRseFrtl3X
+=rYGl
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A6ADFC93EF34893E
+uid    Tom Denley (scarytom) <[email protected]>
+
+sub    9C4C23E6FFE405BD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN
+OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr
+9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe
+d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+
+0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg
+SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG0K1RvbSBEZW5sZXkgKHNj
+YXJ5dG9tKSA8dC5kZW5sZXlAY2FudGFiLm5ldD6JATgEEwECACIFAk+xZxICGwMG
+CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEKat/JPvNIk+ysEH/iY5dP/4ERAQ
+8YC1j1XoYmMxW219uzxZfwI0ltLtPjGQlZbwlFvwjZk0nDJ6O1iZSeZQm804uRup
+gUZe3wqOp7a7z5zHab93QD/nA7O9QmLf2RC7Y0mW0EvD0tfbCzt6JJkAaxKTDA+T
+jFoukUZx2KJr0XToE6kwAnKmCgyFkzb2SUqfsBRNRBJBa6XG/1mAtDJJSM1XLChV
+Sa9nLwYjZzIcebtmtQ1vVqovO74ixxEzonLlNZi7tkc3GS23yntf5tAH0bQ9bM68
+TB9RHpLvjGgHUJtghFQN/Ny+//q1EsjRGn6Pa20cUPxnMS+WguOYIQx5jTb9ZHA0
+WBcu/V4UL8W5AQ0ET7FnEgEIAM3i3e1sjwrx2PN8XYMPQWG+/YTtw1BYDl2+iYE+
+LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXogWqKrkJ0LRjlpdKhKBvyH1ex4grh3cWN
+/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+MR3aFIsii+vadrwYYvuVYGeWvdZhB7mJ
+KYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG7Xd3tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6
+JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC9cHh5eCol11uSoWPKcQR2Ar8Eo56nxv/
+UApdu15iJ7R8cA5guKeeS4jt0CGCPs2PhuggDxI73Xvl4zsAEQEAAYkBHwQYAQIA
+CQUCT7FnEgIbDAAKCRCmrfyT7zSJPuylB/9iwtIQeexMWBmQNdDe0md8HLulDfcu
+jPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb1YCP79uF0qgswSxINYCOJx4nTPIP9BOd
+TwqfGo7ul27REgNq4lIUW0GkMgZAUA2ft/vc0u/I0PqnhKCi4Pq79hLIx7eiX2yS
+fXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA54J1qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2c
+pIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/o0co+GoYkieIxxibDCmt3BioLgmyzpGU
+sMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJEEIhZlI/ojefaZkRseFrtl3X
+=rYGl
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7FE9900F412D622E
+uid    Wouter van Oortmerssen <[email protected]>
+
+sub    AE6B5325E74ED034
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFnyVlkBCACe8zGkIlDV0dUKmk9PWe2Hw8qM9DdPbtpUOpmUOidGY5svQDL3
+eqvHk85TbxqFEe3Qbjjt+R+iApFuXy5kmueXTvwCm7nAU+k/pZtPuzHyhDs3iFFH
+8LCI/dOpd04LXLpuoeLCjBqPlOM+Pxiiu9h9tEnJaJzuXcw9SY3I/puj7qIEwxsJ
+W23gdPtYij9If1ht9gtTsDq9s7VbCM5vL0ofM8JVPilnE4oWuw9hjgIfT/QotbuS
+wPo+1ExZUfaKYPvMxi2kY3LZU3hlp6P5AxU+eI31yaYjtL+0lu66jTD6s8lwmF87
+QqjjxiHwic05//tp2Pk3PIZCoQurfEL6ZHhhABEBAAG0LFdvdXRlciB2YW4gT29y
+dG1lcnNzZW4gPGFhcmRhcHBlbEBnbWFpbC5jb20+iQE4BBMBAgAiBQJZ8lZZAhsD
+BgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRB/6ZAPQS1iLtSPB/4l5s/avevY
+mNnuEp/97qiG8kWOvFfz3C5QP5lVmsj5hiK6Hllc1zjZxaS+TCdrsvH/zKZvgmv5
+9oy5nNHIu/sZB36JnLbE01ieM8hzoW5H7lADJ0JDI6wRbhJc9oXGA/1ZAudT+Jt8
+K2Ijzc2XOzHqE4j5vF0Sc9NWEM+OnAwkrbnIgK98ZiWTF807+/uobtanAUEWbFjb
+0wSNgSX8IvEj3rr/ZaIbf0Ymp/YObY94jVdBqFE1B1GR2TRp1YiAy+2BqoFE599v
+pmnWjZiT3fKL7V6XT98tyk9+XCFlQT7R5v+T4e+1Ad8j0RxsXUFKUScBPySrqEFl
+gMdy83QUeyhQuQENBFnyVlkBCACk/9GoJK23GwRKF8kx4h2oOkb63mP7DSPmsgBG
+CxvhH04oE9Rg+SPWKTjx7E0XFytyCuBYn9BoyGVPp45X5k4Vvj6sNJsSuyW7ExJf
+1AA7Xqa0mo1tjsUPSeAWyhruZCTaHGmnY6ClA3Bsy4E1C8sC0UapW9dNAf66SDp0
+jWeEkU366fa0RZexz92nIDCTQv4YZkYROX63P6Se7hNtontmKA6JajD+46OLGgNV
+gdSKZpO0PMyD8VMg5RUN8PXHqZ68gJ1ihjUJ499sXFuAaXKcxkbb+ajD6fYPQ2jy
+4S1tQpUGmBKAdvthMenEShmwk6lsTN86yH5q9tTNwMWjTbqFABEBAAGJAR8EGAEC
+AAkFAlnyVlkCGwwACgkQf+mQD0EtYi7nngf/aPDwJQG7NICIuMue/QlWCUG4zW2F
+ZL1iCKMYhfVnz29lM/5AG4Y0SlcRkgEigizBQUkeLVHaj3obLlxr1I5yrjaOwD/f
+ruk3roC1pi+1i0sv0/eZJvyVN3Ta3pjzYDT/Qw09Ao5py7HksJsvAM8tIbw5hnmx
+q091M8/zdgIi/H38QFBWKNYaPkC6WMxWv0M47Kttcfv1DBF/NmsMzts45BDoE98C
+VB/5M2eLVVrbHlj4QqpLDTeSYwcTb7JVSKrNbyp2Ws27l1oNhMexztBivHz1OLxG
+JY8odrCtuxK3JMllDdln/HHdwrp6h7SDRdxR6llX74zIdctZVsii8eJHvA==
+=o0Pq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6449005F96BC97A3
+sub    D3DBC823BE4819ED
+sub    0162FE0CF6E18BD4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+FPjHFhRiWd3YGlydu4Dtzwfkmu43CTGp
+=Pq8A
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    59A252FB1199D873
+uid    Tagir Valeev <[email protected]>
+
+sub    92BD2D0B5B21ABA2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFUBG7QBCADRWXf0Fw05qRhM4cRnGKlOW1ecue1DCxHAtFwoqmAXyTCO+tI0
+MEW5SyXUkX6FsWLl6A2y+KgOs669ogzfQ0rnZMEt4HisRp8wpgk3GWR1/9aKYz/c
+ymy2N3BP9cz2fJ9+3PpBccUPL+ydFKpcnEnIwiQK+p9JjEWzJBlrdUc/UEJ0R+n/
+5r/+0+BHiTEMvjAF6/SwyntpTWpu7iEzLv/pfdCuhFKa4yn+9Ciwe3wGtSiue+dh
+tqKcd4YxED3oAswObBca3CC2HWWsUEH6EmfT1jUdfy1cq4X5x7AZ26oFYfG+odqW
+W5dcB+13VkJtJRzQTO/2HKtITJYC65a1jKt3ABEBAAG0GlRhZ2lyIFZhbGVldiA8
+bGFueUBuZ3MucnU+iQE5BBMBAgAjBQJVARu0AhsDBwsJCAcDAgEGFQgCCQoLBBYC
+AwECHgECF4AACgkQWaJS+xGZ2HNZJQf9ExetK9g1IbC/4L5qGhVzfyNik7m9DJ/m
+/fHibCK6pnAP7wHl3QStpcGfWwTDTnY079tdZKnZFk8OOtendA0WWdS/9OO1DZ8u
+kzI3PusfDOsIl/9U35dTgfQmFs5Nxi3/xYBphsNrzafEW+reUImADxleCxHhBGM3
+U8zAgnBGVQO+oBGQ/XLQ2xpGEW3lxytDgx90eCryFKhlqvE0Gv59ofHTcNjEkDcg
+9ki+dx5B25jpcMD7VzCgSaETs031gDlp7jdiEgJa6ot7o+chhcUlD/1UMZnHgT8h
+806xh4+ddiHD6WIXAwiFxsOhJO7o3Ovv4g9eg3VOW6kp6zjhfxrddrkBDQRVARu0
+AQgA2wgu5T1wf8QgQv46nAhpyv/Lf/osb6iTxIoMciUXpxKm6xKxYzov5EZxmC8I
+NHRLQQSJ3jjLLzAUy+hhKWxccs3hKof+ukshzgIPwN0ItatoppFmuG2rM1ZKxjES
+CqjufXE7r5yxTXtUkCuemQY8egDuihmVoatzTL+uWRNcf74sqqHyeI70NqnjqksW
+t2C+7IpurUHp9oB/YkxHK+rLb5+7B9UZNzsMRRQW3AaDsWeIMXTOX7esUbW532Qf
+xRbP4bALAVPqqFWCWA6a0mDDUJJg14OxC8MHhhMk2cyd4xJ0zoKQRxGEunb6XP3T
+7BHQr9r1AETU0+5sBpEHa5BHhQARAQABiQEfBBgBAgAJBQJVARu0AhsMAAoJEFmi
+UvsRmdhza4kIAMccH8GZzjxh7XGXpPqds0SIwJ2akhtr4k0WcRZy56rjGTTGhddR
+KkGeMtpY9CtVkodd0zGaZHcGOG0W+wuB5qPKktSRUOUoyR0ZC2xZcvRpuvhw2gwO
+JdRHGVteDFnz6Eiz+spJYq26usIPZXgxcuxBXjECuHV7OQkUQMDe1EbOOODODkzC
+auYvsfk9x3q9XUp7rQGa8Vi++NHBPhTDU4PReW6485pqJOJuE8QJznMvEHP355FK
+xFvFxw0TM9glLxeX36EjDtjs53Xzhw6h7HF2gj8rnaQfsDnJ8SPaRcJmbm1jKXIq
++AalzNZ1m6hXe7XGD63v9CWCFMygkADQfkY=
+=P9c9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EB9D04A9A679FE18
+uid    Uber Technologies Inc. (Uber Technologies Inc.) <[email protected]>
+
+sub    34CF779A8B04720E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+/L0JP8xoZoZjEnr7raXD2r3sv32/
+=fPJO
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EB9D04A9A679FE18
+uid    Uber Technologies Inc. (Uber Technologies Inc.) <[email protected]>
+
+sub    34CF779A8B04720E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFYC8RoBEADCz+haHo3OuO5kVDhQ1W+GtVcYLuORKvKPaymrD7VSkYyUdkNS
+EGkrk7g5ih/SpgrOxND+Sw3gjwzFr8pjktVkh2bkc1QLRdBcFgqpbmVpVXNodAt0
+4Ie16av2YJpE4tqNaSX8BiBGRdMi1NvbR+EzKQMC5VLUAlbIBPVzHsR6ppbCWPBv
+/Do+QP9OnjiSRUoDlJ2ddCnWiXSM2dcoyd/UOGCS6uXybIJxtGRG1QgbhCYdDc3b
+9XbKcJ/TC9C3hFAUkCQEyqMry5mSl16KTVvYeKacKsTOQV/W5PFbxkVNjGWF3k9q
+f+7IWVi26COlg1Dp5xxY+L5QbFUANNQK221Sk29hHy4hRKqRz5ozOFFI8z7t4VSa
+p2J5cyuN8ojti8DMssGrX83dvN8HLnKPXBGTZBXErBJIRPKMcX0W+nFnYJxOi0O1
+18rVm+7GNUMhV6lsgq8xUZ3lOxQZo3XMbO2aof+31KLDRpVzdvnp/OCZMWmSyP77
+SurcrS0IHaJy9c07WVkcx89KnXiaXp8WesP4nfCB07JZAifIypB0j5I2Jv0WsCJz
+cVWYk4reMmuW/hVZHrGairelhAaTw6Vc5eixouNa5X4rCqCuK714lNjmbVelrFVp
+5YNaMNA6WPAgM5wv2UwG7k5tQI5pFQER60g8SwHr1obK+OrrCyh6/kMQGwARAQAB
+tERVYmVyIFRlY2hub2xvZ2llcyBJbmMuIChVYmVyIFRlY2hub2xvZ2llcyBJbmMu
+KSA8ZGV2ZWxvcGVyQHViZXIuY29tPokCVAQTAQoAPgIbAwULCQgHAwUVCgkICwUW
+AgMBAAIeAQIXgBYhBNT7C3tejBjJk6ijhuudBKmmef4YBQJe+p2kBQkMuhOKAAoJ
+EOudBKmmef4YLRUP/RJ3KiFWj7sDa4eX8pGPf7vuKVlWxN2Bc/TgLsG7A2KjtkA8
+dX8Bc+MoCaJp4o2UGPRHx1mc/+mo44bFntiBafLSE1ugoeA+klLDGPqU/XGKEdIq
+uUR9PVd719iLdY9CD4wQEFJ1TMDbs1gHXIuq3XzCx3P2eG9i1BmmifwF8nDxE1oi
+agykXKQu1RfY6Vwywt9oZWVM0pU4CJn+AG9b4A2ZbixGq+GSEeATzH4ZCXAAdyxB
+JU6I1dAU+8D267eJEcDPdFEt+RzhjgscEtyFAJElhD37ZqTCf834GwFcCSYrvthz
+bjCyu/Rp/Cp+Ru7c5V3oYEd80HcQhlS4IJtHjBiGjNoQtrbttYRp9ASpcLlwMP8u
+ENZ4PapKT6Eq0otmeLYvftdViGeUyj0h3Tyf5NtHZ9ZZu37IGO1mC+D/AR0RRloc
+rqRpzmqQ5R9KUwD7n3dV+z7ohUI0Besnc9PxjpdLGCnB1A6hSIVgObBtpL1l4QvN
+8+Lp/4CiWaeqf8CpZglYdXkBRn2koIHtgUxrqI4j/SAcsapw/ePBgMTXPaeGIxs5
+qBYpKzX8UsI27GYtXEdnpaxP1fFbvKVTgjlM/1u4XHA/qjVsCsBwSExj1dBmp9hN
+G+dV44XPv4sXnqStLAx2HgrK0md4L92xNIrlTaAXqu8mHA8ibyYf6qdWcCbtiQI9
+BBMBCgAnBQJWAvEaAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJ
+EOudBKmmef4YQ84P/2uUcUJ/zPbLR4sg6L5Wg9FMMSDJ4JECtSlHo83jI18NopIz
+2W0TkCwCCOxbg9scS2v6EAlDfXnjAK6iW2yw+ew2eTPDs2PJTb7jMayNhPSAnDz5
+PJzAS0zLfliFdk8l8LbsbY+AufHgVdlfmB7AFGCHFnueBmDkjV4jSf1NUrnHjKWI
+bwDuAEcbNJcfZi9js+cty8/+9LfIDoCcIzKJiOUm9iFNjUGPbOFl7NZTRQmJdPwN
+sjGWSvnk6zKCol19o3UXzrohh/R5MDfJyh48brJyf6vh2y9VX6Z2Nta6bfuOWWM3
+dksk520J/uqn9ANh6kqbz+ZUh8og7/rtea8Oznzloq6XvdwEbrKjU+BMpXskUpQ5
+vTtbzOjcAhJFXG2fmVldd8/JxxLIB6JSuKPiKrb9a0Gf4FKmUWwrwnADt+sscO9q
+Fvl6N2M93g7IVm/xNSI7uEbinjf1jCquH6NXwBJzvddeXq8z1ECh5gcti9H2IE5U
+uFOgTEvQv3oTwuLrY2GH+V0puyO9jLHbGSnuFi7Qm7KdLMmpplc6f09tF/OJxP9W
+hbqhYpeOV+sTnZonsuTZeZGd4ViMtYYBfJSZAI5nBqTZT5ksBgdSIIo6IAV1k9v+
+o9VnTxtYF3Fc/BlkLQ4W/imqLyLGd7dQJOKsAd+QN4R+gAWw5DQsQ4KdWGj1uQIN
+BFYC8RoBEADYBV65EK51IB8hgLTpYo4rIm2o8cvgsGQa1EcqDT7Fnw/mlaMTj1Zg
+btOoPyZ4gkiW6Mfyq7qg9YNmhZB0arut2TzyAeA54BdIuwPA0EitHGXIfqUFuFo3
+P0kZRh23aO9oAuVIxFKfjO8HYaJZMxx/mg99ilRWJbb+7aOH1vF48KZ04ZVntKX6
+Z2E2ZgC6hiN8xCAqOVsPGePTeWw4RPV42wlZWZhdw8dsIdMr8L3GB+ENmOMbuVSP
+lv/a/HhOiEZrK3rFndC24nKYRDFIvkQdcrM+M1HuuqhrepnmBAOM3pM513MGGeYv
+8UQfMvaOf8zjEpEt6zbn8IomeBDQwIEwv+NP8uapUC5x/qniO0qaHzXKGnTEKODG
+ex/7DCgNhjsLUa60RudxF9n9tz6P7BME+7jKqDZoxFp5HZuxcZ60QpztXBcqB5v3
+1hrNIEj419XxQdZV5labDT62TQ6qwh0hdbdeqzNhUTn2INXSFin54zitZZT/KfHz
+ppe3X18EuHUEoovi1XReWhj/24Gr+AHKgtMl3KSEXVTxwFovB97Frm7E6kWzXjDo
+uPrcdcYOcujX0tCkbjDDNCYXYCt/JCEDPKk/mlRmE72futz5GLWUoyNi6kjueHMz
+tUxA3ki53I28BW4szSbweRZ7osBb2SNWQMEJcR9Uh0DlmDay0xM/UwARAQABiQIl
+BBgBCgAPBQJWAvEaAhsMBQkHhh+AAAoJEOudBKmmef4YqfkP/Anh81E3l5zxDvum
+K6JeZv6QdYNllnXXyI9jg0Dirg3bJWAE9llzFnQRf5z1DPh5yCdsTGVdIfTmOaGi
+0qwFMcCWdydHRsdgBQR09ew/MfzyGM7Da8NP19/XlaJ4FO9FLEv4WaJvymVjIIEJ
+yE/JBU0cSs3TQKNSepVeXYfCsjxaTBspQA0LTBGhum6YT3/grey70KofsJ2s8W1w
+o8pkqSPKdevBQW+/MfYaHKey8IkdcHj2XSIhaI0kKvb6qMus796qngghfIqwcgdI
+2aG0Uv7PoqUoFlUdms7OOObQsWIxLb7dsli1IU4AuT6xvPnAb7GOLSG5ur/rqkhO
+NEERAaW2ZwoJWrXTGeBtWNyicXw8TezbIcFsXsj3yYgFm1YeKpCFy7D8iSQYDhKh
+pYJsnfgL1ia9n5nUY3IxueFGccf65hiIwdUXBmkCDcv/OHuhI6SuD2IzQvHOozVC
+1yU1tQXStPl34PlkRRpaK3pg6byYg9zacY0P4g5F2gdnuyp4R+r6G0uLuneuaFSI
+vtsXdKwPLDpmjEu0nxiwOC/OHvZMD6Zt/YMo9WdAETxvPT/+MaVndzWk61hpw3aK
+rox8Pi1+pvF7beqSdVimcjh6FK+pjlTr6YvfjYCntIInNDBlY+7ixF2kDedA9kG4
+/L0JP8xoZoZjEnr7raXD2r3sv32/
+=fPJO
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D4DA5EAB3CD7E958
+uid    Jiaxiang Chen <[email protected]>
+
+sub    D826E3935EE9DC71
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=E4ez
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D4DA5EAB3CD7E958
+uid    Jiaxiang Chen <[email protected]>
+
+sub    D826E3935EE9DC71
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=E4ez
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5D67BFFCBA1F9A39
+sub    DBE749136BF76809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFUHdtcBCAC5xFdAcSc5qQsPkujcRdzeldrESZBo1/SfGwFV0T+lgp99QJuI
+LDwZ1OEG/lQck59J0JRdAgxlUj1um5LzNYexIJSdxRz2DffQ/z9R+hw4DF2h0fyP
+0lXPOb/sIYJyQIMaY7Rw6NJ9iiP2Q+yAd/rL34NbaelOjNy00rQkVNBixp88iZB8
+WjzHAZnCy9nz5nL7fDz6c518PaHMwVnQtt6Aza+fZ/4Na5NmKMvLC01SLFSKqV8+
+j1T0bh50vss+7rLBIYjuq024WpNdZjIUdbzsLFRZTgmv6nUKtamlDVu++qDV2tWE
+POV3OyXAPCxim2+kwVoBCsJbhFC2NMo0P28pABEBAAG5AQ0EVQd21wEIAK88nihe
+mV8Hm1g95BXaqc1UCRxXOnYT2wOmeS7nkOQlFzQNSsn6FIRCbSYUae6Q2Wv7NqvJ
+OGmiBCaKXgMSq8iEEPrbY3Ed9BTqiFtoA2smBswA2Do6SjWg9kiuXv+sRLiOMTKf
+jitErkL9Wi5CNnERoD09jICcEcMHeZbzvjslADzJz1iW4cSRmbJC+tY9Tf9LMwUe
+etTmeXYJSv2w34vxuT0zzosN9ucEElmdE1oQXQ1Ryrts4Gyv354R7+raIzEPIcGd
+4fbub+x69G5Xxy3AKI9DbVapwskME7oENwotlxzLm0or/1vVC9tOnjVh1HSd1u5T
+M4DeCQ/7wgxl8Z0AEQEAAYkBHwQYAQIACQUCVQd21wIbDAAKCRBdZ7/8uh+aOduc
+B/9wmTVaPsUtaC7+tsFBf+EM6zVsVgMe6aY8/AG1llwX1IujYRyhs8YvqD+cc9/7
+CvK3GlT2wJyBrRaiHZXE9u0COJUgBHyuIvnV0W7fE8aD5AoPCVMacKxZWoRTY4xe
+r+gde8NpAp5f2AKu8kEquXOiIymG8kXJlUqgvZmQWSFYOWF+j7Xx7iRp2+0j2f6k
+nayvHLvyvMGygvNzzhLYKl5zZMks6XMTk6daVt6WbgaSuT0le5LfpxB/k7p7xMOe
+yW0bFgNhSQMDmPJ2iTnW+iliBXOntGQda/W/uWE3LZ03Z2xTq+2SlXtDllVh6Ma2
+QaYKBnGzozJvTcMbyP/aZ3lj
+=kPmv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5D67BFFCBA1F9A39
+sub    DBE749136BF76809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFUHdtcBCAC5xFdAcSc5qQsPkujcRdzeldrESZBo1/SfGwFV0T+lgp99QJuI
+LDwZ1OEG/lQck59J0JRdAgxlUj1um5LzNYexIJSdxRz2DffQ/z9R+hw4DF2h0fyP
+0lXPOb/sIYJyQIMaY7Rw6NJ9iiP2Q+yAd/rL34NbaelOjNy00rQkVNBixp88iZB8
+WjzHAZnCy9nz5nL7fDz6c518PaHMwVnQtt6Aza+fZ/4Na5NmKMvLC01SLFSKqV8+
+j1T0bh50vss+7rLBIYjuq024WpNdZjIUdbzsLFRZTgmv6nUKtamlDVu++qDV2tWE
+POV3OyXAPCxim2+kwVoBCsJbhFC2NMo0P28pABEBAAG5AQ0EVQd21wEIAK88nihe
+mV8Hm1g95BXaqc1UCRxXOnYT2wOmeS7nkOQlFzQNSsn6FIRCbSYUae6Q2Wv7NqvJ
+OGmiBCaKXgMSq8iEEPrbY3Ed9BTqiFtoA2smBswA2Do6SjWg9kiuXv+sRLiOMTKf
+jitErkL9Wi5CNnERoD09jICcEcMHeZbzvjslADzJz1iW4cSRmbJC+tY9Tf9LMwUe
+etTmeXYJSv2w34vxuT0zzosN9ucEElmdE1oQXQ1Ryrts4Gyv354R7+raIzEPIcGd
+4fbub+x69G5Xxy3AKI9DbVapwskME7oENwotlxzLm0or/1vVC9tOnjVh1HSd1u5T
+M4DeCQ/7wgxl8Z0AEQEAAYkBHwQYAQIACQUCVQd21wIbDAAKCRBdZ7/8uh+aOduc
+B/9wmTVaPsUtaC7+tsFBf+EM6zVsVgMe6aY8/AG1llwX1IujYRyhs8YvqD+cc9/7
+CvK3GlT2wJyBrRaiHZXE9u0COJUgBHyuIvnV0W7fE8aD5AoPCVMacKxZWoRTY4xe
+r+gde8NpAp5f2AKu8kEquXOiIymG8kXJlUqgvZmQWSFYOWF+j7Xx7iRp2+0j2f6k
+nayvHLvyvMGygvNzzhLYKl5zZMks6XMTk6daVt6WbgaSuT0le5LfpxB/k7p7xMOe
+yW0bFgNhSQMDmPJ2iTnW+iliBXOntGQda/W/uWE3LZ03Z2xTq+2SlXtDllVh6Ma2
+QaYKBnGzozJvTcMbyP/aZ3lj
+=kPmv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C727D053C4481CF5
+uid    TFLite Support <[email protected]>
+
+sub    29E792953D515FC5
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=zvsL
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6CCC36CC6C69FC17
+sub    C694465FAACEE66F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEtrDFABCADLXGAhjPxdh+naC6XU5kficZYEVAURNRa8MTnaMKr+31v2zcAk
+nyqyjihcXGQBCeaNsz2mQkc/MrKdnFNVSwp715JcmcqDJGfR9aIDMUs9PvoNkkqv
+IDtx9Tn73piqbplT2xQxd7HjFvaVuy7oXI68gwcyAGDvQZeiFUodcbAsKrVwFT+R
+94JU6UODFqE/Ihq15Za8Sc8WhWitm8XTQsCsLeh8abGhkvNEmRLi56fh8/Bz8LHv
+8T7r8zkROoQFlUEYaOR2wH5bbipww9+HEg64hrcak2w5smNt0NJUXZ2O1l00u3sF
+Qdu54hM9nZ51xxcqvo+tGft9kIr2AfTrJ28ZABEBAAG5AQ0ES2sMUAEIAOqnjBPR
+FjX47AxlF9NJhzOUECJ2QaoezMOcKQ7RTnDhOiDi/Tzl0MXJoo7ktkeSAMlPIXlb
+K/C2qrM2hT62O/5GSRy1dPErTZx53mNIWTsT0wjQCgxeiAs/+5bqceahRO4PES0L
+J7VR+wiCUP33CIK/Ea2c6ODB97OSly0/RY97jWbM1xwKuzeHH5H0QKTJky1CIdg+
+avdfeeHBDEpCi3BZA55JiAKMuFNYl+Q4yf/FoYI0ZqKFhIwK0OQLY+unIPlX+qPy
+B6TkPIj9tcK/cebpN3VcFvNzVkcqYXdxwUU9G0GyzC3Be437oyzm3SJWw1DRd2Fj
+wFeiL0fWOjwcfvkAEQEAAYkBHwQYAQIACQUCS2sMUAIbDAAKCRBszDbMbGn8F0LE
+B/9O8wwEDuRjidsflZTopMs2drKS/TN/EB/leBFsOqtw712+dYSNhM/LJVZchWS8
+y0RLHQMAd6aX89ooJpvmkijJvJhB9YtuHwmGfT40uco7ATqbo6tYW/aA1rfOs9HA
+jLb1UWQvEsL+96WsiQRLwIoX6AaKebG6mLYikiKKji4LJRp5HVdXpTxRaX/nSPSL
+aau62V7XKJXaVgFvSTy4xn2eph4eRVACKym/psNkXbRyj1maf4a1sdq3WMdiDRHS
+n3rRKsUGVv7HxE45vR7W7hqN0Bna4VzOgNEocRCKO9pDEiOmXsKXUvDJBOrvTddJ
+VHX3/m585HZda1drtSgEv3Rs
+=VojG
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6CCC36CC6C69FC17
+sub    C694465FAACEE66F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEtrDFABCADLXGAhjPxdh+naC6XU5kficZYEVAURNRa8MTnaMKr+31v2zcAk
+nyqyjihcXGQBCeaNsz2mQkc/MrKdnFNVSwp715JcmcqDJGfR9aIDMUs9PvoNkkqv
+IDtx9Tn73piqbplT2xQxd7HjFvaVuy7oXI68gwcyAGDvQZeiFUodcbAsKrVwFT+R
+94JU6UODFqE/Ihq15Za8Sc8WhWitm8XTQsCsLeh8abGhkvNEmRLi56fh8/Bz8LHv
+8T7r8zkROoQFlUEYaOR2wH5bbipww9+HEg64hrcak2w5smNt0NJUXZ2O1l00u3sF
+Qdu54hM9nZ51xxcqvo+tGft9kIr2AfTrJ28ZABEBAAG5AQ0ES2sMUAEIAOqnjBPR
+FjX47AxlF9NJhzOUECJ2QaoezMOcKQ7RTnDhOiDi/Tzl0MXJoo7ktkeSAMlPIXlb
+K/C2qrM2hT62O/5GSRy1dPErTZx53mNIWTsT0wjQCgxeiAs/+5bqceahRO4PES0L
+J7VR+wiCUP33CIK/Ea2c6ODB97OSly0/RY97jWbM1xwKuzeHH5H0QKTJky1CIdg+
+avdfeeHBDEpCi3BZA55JiAKMuFNYl+Q4yf/FoYI0ZqKFhIwK0OQLY+unIPlX+qPy
+B6TkPIj9tcK/cebpN3VcFvNzVkcqYXdxwUU9G0GyzC3Be437oyzm3SJWw1DRd2Fj
+wFeiL0fWOjwcfvkAEQEAAYkBHwQYAQIACQUCS2sMUAIbDAAKCRBszDbMbGn8F0LE
+B/9O8wwEDuRjidsflZTopMs2drKS/TN/EB/leBFsOqtw712+dYSNhM/LJVZchWS8
+y0RLHQMAd6aX89ooJpvmkijJvJhB9YtuHwmGfT40uco7ATqbo6tYW/aA1rfOs9HA
+jLb1UWQvEsL+96WsiQRLwIoX6AaKebG6mLYikiKKji4LJRp5HVdXpTxRaX/nSPSL
+aau62V7XKJXaVgFvSTy4xn2eph4eRVACKym/psNkXbRyj1maf4a1sdq3WMdiDRHS
+n3rRKsUGVv7HxE45vR7W7hqN0Bna4VzOgNEocRCKO9pDEiOmXsKXUvDJBOrvTddJ
+VHX3/m585HZda1drtSgEv3Rs
+=VojG
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1861C322C56014B2
+uid    Niall Pemberton (Code signing) <[email protected]>
+
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEGVK0ERBADwhGhmOMvSgvGaqHW3ial0NS80ZXyE1EeNL6ke/WrXHB4dT6if
+inoAuUgRz3v9Na4rjSQ8YVFjn3NaZq1i8RM2KJOUU8ZkJ2AsrH6fqStjofLTd5ng
+iQaq2wLM5rTQfdjLsGQb1iDNDyCXU56+/l4mFZ2JiEGCq3Re9EFHelRBKQCg/7k0
+BIfyoFVTHw39PKaDBmCYF2sD/3CMD0J/WldhBM7gLOndH9/YEQaEMy+PJNXcfTWN
+WLygGPSOQdNBulyLkvcFIZjUTxFVakh7FbjMq3dsAP1oqthwmK7L8A1zsvRgp/TI
+4YMHkZSkgcs0PBBby+h/lpgRrWmtwjTPzql/K5xX4VSRS+umHye/7R+4ZEH7mABa
+m/ZABADkPGG2ECvfjNosPQDHZVFuF9oVaske0OjzxI+rU6sR1fJKtbOPl9d+bgz+
+df7rZ3mwppkPX2r/muUbd0CM1Se10sK7ZAoPYmWqHX+vB/oj3Jq+iqb6M5mDZzEz
+6h4hdnaGERyxbktZvhRV7Psco9CGi8o7RFUQTR79Y5ElnBavqLQyTmlhbGwgUGVt
+YmVydG9uIChDb2RlIHNpZ25pbmcpIDxuaWFsbHBAYXBhY2hlLm9yZz6IXQQQEQIA
+HQUCQZUrQQcLCQgHAwIKAhkBBRsDAAAABR4BAAAAAAoJEBhhwyLFYBSyAKIAoIPb
+v9xBs809MQUUr/3CftPBAhpmAJ9sM30JnnEkNtCks1EoOpqxcXuDsIg+AwUAPp7V
+nZhjoec1euOMEQLccACeMqbTeO6szsJJG3MTpvrtsVQjshwAl1W/8tod5YULuIO6
+ML8ftQohn7WIPwMFAD6e1Z2YY6HnNXrjjBECNFIAoJ/E7v3re3VLCBdV3KICJEL+
+GSSQAKCm5Ks+L25fh2f+smVdDmCTF5CCV4g/AwUAPp7VnZhjoec1euOMEQKxzwCg
+g2TDBEUuQqaXAwMJWDNn9jJ09WIAoKTfxc3v5drH2fNpCA1cpDJJ2WaIiD8DBQA+
+ntWdmGOh5zV644wRAvZaAKDf1SuAqpgk9bYDvLyyFFqMgg5t2ACgnpPsS8Kh7w4Y
+LrQMJ8W6u+6BvryIPwMFAEEnnIOYY6HnNXrjjBECPL0AoIkThk9G9eaSYkEIH+o6
+DB+txwp0AKC+pK8CPBnZoyojO6vHvsjPuPhbPYg/AwUAQSechJhjoec1euOMEQIJ
+QwCfUh0B1SW8zYA7fRFhCHwskFx+VgUAn0qWDcRZ3dzwofMb5859cJ2dpdXOiD8D
+BQBBJ5yEmGOh5zV644wRAjwdAJ0UZUdzMp9viVXfbQnU47PitIxqdACg+OmEEca8
+0yZz7SRjAD/fBIgHjOuIPwMFAEEnnISYY6HnNXrjjBECa2QAnjxzaeU2LzKpSrog
+M8geCfJMrhmkAJ0VFjSDvtUxuHuSfYusGihFN+oBTog/AwUAQbk1bphjoec1euOM
+EQLOHwCgh29Lcjs773oMdmm6cevuKIJzumkAoLJczbrh1ZcV2y1UwVs5ntyfi7Ng
+iD8DBQBBuTVvmGOh5zV644wRAnARAJ97bp+664Z/6JD6hFzpaYHQSBrrxwCg2gI5
+RBEdl8k1QMBd0gCV/WGXPbWIPwMFAEG5NW+YY6HnNXrjjBECmQEAoKLZl6FWr7os
+OIQgSjFJGgYzZCDEAJ0ZxfT55sxbh91b58lKfv7qgIN4cYg/AwUAQbk1b5hjoec1
+euOMEQJUDACggzTk9CEUa0c5xmKV+xaYw+o/rYgAoI+HMWjJ6An1TbW7PzQe9+Fl
+N6tciEYEEBECAAYFAkfpTHUACgkQ8Q7IWlRTPPMizwCgtmalo1l4CYmsGJW7xPNt
+MTKLlRsAniDKIWgsBZxrJG5KaETLuD/k2uPPiGsEExECACsFAkf9KiYkGmh0dHBz
+Oi8vd3d3LmNhY2VydC5vcmcvY3BzLnBocCNwNS4yAAoJEH9YT55N2dHEFfUAn3b5
+Is2tga0qszQ7p7CuhWWBMrXzAKC6TY0eya2AyHuGWAwD16bwiO4VtIhGBBARAgAG
+BQJH/UXxAAoJEJA4TZo1x+lC3gYAniwMdQHJ3WV6RLb1k36W9kxbIzObAKCOu1IS
+3lZhFmNRDwijlXX3viJQk4hGBBARAgAGBQJH/cYrAAoJEBg4H9dLG+aYqMAAoKed
+Dqyt25U134GVywsix+COH/rzAJ4tw9Bj2PLyiZOQykADw2P9UHWdh4hGBBARAgAG
+BQJH/du/AAoJEHPdjBYBUwI135QAniMDbi06tNBDHU/qLuwUt8suzfveAKCFpiHl
+btOk7v6du6vUsDRB35DxSIhGBBMRAgAGBQJH/hGTAAoJEIEvIIXC1Qv7y/8An3+V
+w4pRPLHzmrapajVxFEgyfqscAJ0R9wi81PbqDjmgDKBQtpsG8/uPLIhGBBIRAgAG
+BQJH/jg+AAoJEIuWKUP8JD88iCUAnjCzMS/aS+kcSh3MEQzAwIAQIchlAJ4nfbxt
+HE7c339gdVk3NrBOP2uxMYjGBBARAgCGBQJH/kXbMRxEci4gVGhvbWFzIFZhbmRh
+aGwgPHRob21hcy52YW5kYWhsQGNvbnRlYy1kdC5kZT4kHFRob21hcyBWYW5kYWhs
+IDx0aG9tYXNAdmFuZGFobC5vcmc+KBxUaG9tYXMgVmFuZGFobCAoQXBhY2hlKSA8
+dHZAYXBhY2hlLm9yZz4ACgkQLrlGgoiBdAJrdACfeBqnmjgKGEQWGXN/CkRc6Kn6
+2EYAoP5F+Q67aZLIyCINEIfmWNr6MXVuiJwEEAECAAYFAkf+TdYACgkQMaY9luwU
+C4GqcAP/Zd/qYdGzHzRTrb/yLjmtbHAlZU3PxrSCA9W0HO3jXRQCWloBY/Of1WOg
+YeqQRpQtK8e0aeUUZ966ir7Iqpt8kMuo/vvqnN4LZmTSBZIp3cpp9zDVWU4nCOgZ
+v6/mxhp7EsjtTpCdsfy9/GsqKjZhaikyJWyEJWV5o5zdmj6/WsqIRgQQEQIABgUC
+R/5PbwAKCRD9b4jGIdCnG12AAJ4/2920ifdU6veCaAu6COBiJFbpEACcCGIyiCMz
+/+1GlVZsBoDy9Sv+jeiIRgQQEQIABgUCR/9SzQAKCRA8mkIEDAiFtEMuAJ9UolA/
+MvkvDQeiBce9MLeoRw5wUwCcDfdPjZpG6rOhBwjU4j01gOuNd9uIRgQTEQIABgUC
+R/+mnwAKCRBMBCgYMRo95UB3AKCYEbZIjTTLiUlSixmWpAIQita/oACcCrZBvELK
+GXntPR3jo21pbLN7aC6IRgQQEQIABgUCSAIH0gAKCRD1wmAWTO7XX6zlAJ9IihAT
++kUrFtH4iXFsVk6D8lzepACgk7XDbEYSBVfOAZC5OvdZH61nCzCIygQQEQIAigUC
+SAN5GR8cSmltIEphZ2llbHNraSA8amltQGFwYWNoZS5vcmc+IBxKaW0gSmFnaWVs
+c2tpIDxqaW1AamFndU5FVC5jb20+HxxKaW0gSmFnaWVsc2tpIDxqaW1AamltamFn
+LmNvbT4iHEppbSBKYWdpZWxza2kgPGppbWpAY292YWxlbnQubmV0PgAKCRCLOmAf
+CMl15dUXAKCdley4hYAIF6VQ9DDdqGZiX44nJgCeOZvjSdl4X9PwnKdu5M5jHOwt
+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
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=bKSo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1861C322C56014B2
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEGVK0ERBADwhGhmOMvSgvGaqHW3ial0NS80ZXyE1EeNL6ke/WrXHB4dT6if
+inoAuUgRz3v9Na4rjSQ8YVFjn3NaZq1i8RM2KJOUU8ZkJ2AsrH6fqStjofLTd5ng
+iQaq2wLM5rTQfdjLsGQb1iDNDyCXU56+/l4mFZ2JiEGCq3Re9EFHelRBKQCg/7k0
+BIfyoFVTHw39PKaDBmCYF2sD/3CMD0J/WldhBM7gLOndH9/YEQaEMy+PJNXcfTWN
+WLygGPSOQdNBulyLkvcFIZjUTxFVakh7FbjMq3dsAP1oqthwmK7L8A1zsvRgp/TI
+4YMHkZSkgcs0PBBby+h/lpgRrWmtwjTPzql/K5xX4VSRS+umHye/7R+4ZEH7mABa
+m/ZABADkPGG2ECvfjNosPQDHZVFuF9oVaske0OjzxI+rU6sR1fJKtbOPl9d+bgz+
+df7rZ3mwppkPX2r/muUbd0CM1Se10sK7ZAoPYmWqHX+vB/oj3Jq+iqb6M5mDZzEz
+6h4hdnaGERyxbktZvhRV7Psco9CGi8o7RFUQTR79Y5ElnBavqLkCDQRBlStBEAgA
+9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt
+90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcw
+Yc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZr
+M2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEs
+tSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8
+vYlLIhkmuquiXsNV6TILOwACAggAw6kL0PhPZ/EPI0mPfmIYeaKUgTB8q47nDKY4
+6wDs1l/msVJHAVwGEBHuxmbC7r/qfAgfSW+/Lj4XbSLCqaZIWSu6lfY43IOIYXD4
+pe5cCnWkQij+h3LxRR6uDmBr5cwheHEuB2sMFU5lJiiQR1+eXYkPNK4FgVQpHLWe
+boODAlTf0j8gRR+aTs5eWXqfSA+UEsXpn6453bfZKELXkRmEznb4xyGWJaLW2Mlm
+aRlauYvc61M7FK8z15SSZbq6oictpnEcfkgnBxcNza3jZQV7WOWZ3BlD1nKQ661s
+bmS81/nLnxbov9ASs25K2olXBsHkERhjMnERedvv7avlmBwi1ohMBBgRAgAMBQJB
+lStBBRsMAAAAAAoJEBhhwyLFYBSyGTQAn2u/CvPzKwRv1FUkPYR751j9PGwDAJ4k
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=alQS
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1861C322C56014B2
+uid    Niall Pemberton (Code signing) <[email protected]>
+
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+BQJH/jg+AAoJEIuWKUP8JD88iCUAnjCzMS/aS+kcSh3MEQzAwIAQIchlAJ4nfbxt
+HE7c339gdVk3NrBOP2uxMYjGBBARAgCGBQJH/kXbMRxEci4gVGhvbWFzIFZhbmRh
+aGwgPHRob21hcy52YW5kYWhsQGNvbnRlYy1kdC5kZT4kHFRob21hcyBWYW5kYWhs
+IDx0aG9tYXNAdmFuZGFobC5vcmc+KBxUaG9tYXMgVmFuZGFobCAoQXBhY2hlKSA8
+dHZAYXBhY2hlLm9yZz4ACgkQLrlGgoiBdAJrdACfeBqnmjgKGEQWGXN/CkRc6Kn6
+2EYAoP5F+Q67aZLIyCINEIfmWNr6MXVuiJwEEAECAAYFAkf+TdYACgkQMaY9luwU
+C4GqcAP/Zd/qYdGzHzRTrb/yLjmtbHAlZU3PxrSCA9W0HO3jXRQCWloBY/Of1WOg
+YeqQRpQtK8e0aeUUZ966ir7Iqpt8kMuo/vvqnN4LZmTSBZIp3cpp9zDVWU4nCOgZ
+v6/mxhp7EsjtTpCdsfy9/GsqKjZhaikyJWyEJWV5o5zdmj6/WsqIRgQQEQIABgUC
+R/5PbwAKCRD9b4jGIdCnG12AAJ4/2920ifdU6veCaAu6COBiJFbpEACcCGIyiCMz
+/+1GlVZsBoDy9Sv+jeiIRgQQEQIABgUCR/9SzQAKCRA8mkIEDAiFtEMuAJ9UolA/
+MvkvDQeiBce9MLeoRw5wUwCcDfdPjZpG6rOhBwjU4j01gOuNd9uIRgQTEQIABgUC
+R/+mnwAKCRBMBCgYMRo95UB3AKCYEbZIjTTLiUlSixmWpAIQita/oACcCrZBvELK
+GXntPR3jo21pbLN7aC6IRgQQEQIABgUCSAIH0gAKCRD1wmAWTO7XX6zlAJ9IihAT
++kUrFtH4iXFsVk6D8lzepACgk7XDbEYSBVfOAZC5OvdZH61nCzCIygQQEQIAigUC
+SAN5GR8cSmltIEphZ2llbHNraSA8amltQGFwYWNoZS5vcmc+IBxKaW0gSmFnaWVs
+c2tpIDxqaW1AamFndU5FVC5jb20+HxxKaW0gSmFnaWVsc2tpIDxqaW1AamltamFn
+LmNvbT4iHEppbSBKYWdpZWxza2kgPGppbWpAY292YWxlbnQubmV0PgAKCRCLOmAf
+CMl15dUXAKCdley4hYAIF6VQ9DDdqGZiX44nJgCeOZvjSdl4X9PwnKdu5M5jHOwt
+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
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=bKSo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1861C322C56014B2
+uid    Niall Pemberton (Code signing) <[email protected]>
+
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+BQJH/jg+AAoJEIuWKUP8JD88iCUAnjCzMS/aS+kcSh3MEQzAwIAQIchlAJ4nfbxt
+HE7c339gdVk3NrBOP2uxMYjGBBARAgCGBQJH/kXbMRxEci4gVGhvbWFzIFZhbmRh
+aGwgPHRob21hcy52YW5kYWhsQGNvbnRlYy1kdC5kZT4kHFRob21hcyBWYW5kYWhs
+IDx0aG9tYXNAdmFuZGFobC5vcmc+KBxUaG9tYXMgVmFuZGFobCAoQXBhY2hlKSA8
+dHZAYXBhY2hlLm9yZz4ACgkQLrlGgoiBdAJrdACfeBqnmjgKGEQWGXN/CkRc6Kn6
+2EYAoP5F+Q67aZLIyCINEIfmWNr6MXVuiJwEEAECAAYFAkf+TdYACgkQMaY9luwU
+C4GqcAP/Zd/qYdGzHzRTrb/yLjmtbHAlZU3PxrSCA9W0HO3jXRQCWloBY/Of1WOg
+YeqQRpQtK8e0aeUUZ966ir7Iqpt8kMuo/vvqnN4LZmTSBZIp3cpp9zDVWU4nCOgZ
+v6/mxhp7EsjtTpCdsfy9/GsqKjZhaikyJWyEJWV5o5zdmj6/WsqIRgQQEQIABgUC
+R/5PbwAKCRD9b4jGIdCnG12AAJ4/2920ifdU6veCaAu6COBiJFbpEACcCGIyiCMz
+/+1GlVZsBoDy9Sv+jeiIRgQQEQIABgUCR/9SzQAKCRA8mkIEDAiFtEMuAJ9UolA/
+MvkvDQeiBce9MLeoRw5wUwCcDfdPjZpG6rOhBwjU4j01gOuNd9uIRgQTEQIABgUC
+R/+mnwAKCRBMBCgYMRo95UB3AKCYEbZIjTTLiUlSixmWpAIQita/oACcCrZBvELK
+GXntPR3jo21pbLN7aC6IRgQQEQIABgUCSAIH0gAKCRD1wmAWTO7XX6zlAJ9IihAT
++kUrFtH4iXFsVk6D8lzepACgk7XDbEYSBVfOAZC5OvdZH61nCzCIygQQEQIAigUC
+SAN5GR8cSmltIEphZ2llbHNraSA8amltQGFwYWNoZS5vcmc+IBxKaW0gSmFnaWVs
+c2tpIDxqaW1AamFndU5FVC5jb20+HxxKaW0gSmFnaWVsc2tpIDxqaW1AamltamFn
+LmNvbT4iHEppbSBKYWdpZWxza2kgPGppbWpAY292YWxlbnQubmV0PgAKCRCLOmAf
+CMl15dUXAKCdley4hYAIF6VQ9DDdqGZiX44nJgCeOZvjSdl4X9PwnKdu5M5jHOwt
+vRWIRgQQEQIABgUCSAU/GQAKCRCOo7BoTHZX8UH4AJ0d5DL3klUXnkCazZtoAt0I
+vpG3+gCfZs69ZMO8/4UlwLIb9g06vERVFzGIRgQTEQIABgUCSAn0oAAKCRDegOZW
+GfkpGGuaAKCindvuPaVfmK6xdGBq8j4LntE67QCgppmNBKTRudAPbgx8qiDGSQ4G
+ssGIcgQQEQIAMgUCSAtk1yscQmVybmQgRm9uZGVybWFubiAoQVNGKSA8YmVybmRm
+QGFwYWNoZS5vcmc+AAoJELOX3RpTbavtpH0AnjgPhfFt/4gamXsuHUcH5US4A5wD
+AJ4j1beuY1AbJDXGIkiGBmBPZgEyQohGBBARAgAGBQJIIhYXAAoJEA9FCiZiEL/A
+6iAAn3Xv0IpctMSCY3t1X/WGpLoGiG9UAJ9IkTmBWrghmMKKvOUzyGfuZW2brYkC
+HAQQAQIABgUCSEQGrQAKCRAZPxgKtV2Zd+F/D/9qMw9DHeD1aK7CAa3rCsazad4j
+j7F2jXAzcjA0ZNyU/X1oQUQMFh9Q4eUh7aYr3JOVwBQysxtQBzFqAvzKJQnsZzaY
+sgg73W7zIV5nZQt2dx1Ae8MseuHLCUKGbhH7BoDO+b7XL111ZGbKWChRPxzdtDth
+Km52KFT919iWH8DveugsC3qcwetBtrI4tUU0C0RFD5O36Wq38oIVPsEbLY3IQRD9
+64z7XVLCuyeOJY5mnI9OpjH0IufkQNTacfpH/bnHQeTPT69MuwX0XynDwGWSBkCi
+RbvqM60hJk++DCfrEQSHD4V3IsuqpB9z3XWjqGof8hyIQaES8dT5YKmoLGOat3jD
+dJHR7mazyFaS7JiSUM6zdKu1BiPtMV5+AFbj7/+t8oDoAV0srxr9FhineHstrpkz
+d9sxedJaZxhAdNvaVnPXuGGQ4ZxrCmm21ct4AHqzErVxstwIFRW3ECFD1Hq3LjtT
+t8+S5OGd4kZBIFp9qzPXcT+USsf11Av50E9TnvddQ2qnGf6Z5SydusBsO2qztQMR
+fDHvQ5GXwyYRsnm1rnB+fVUwE9JM8APC0iYzNYjRJSC/iqEkxTJ7/EIDJGBJ90mB
++Ccr04+ts3oZLzbRIS+G8EHZdzS40f5ms3tk6DsLquG+bkh8b5dtmdgOcDobtaxF
+9o5MdV+6Vdvv1hGeIYhGBBARAgAGBQJIWT8jAAoJENUzTnWxMT3ilc4An2xwxFs7
+rhJCY6O1SYdtFLsAVzPGAKDAPrrBvq3yu/SyTjE+FIvDGVW7FLkCDQRBlStBEAgA
+9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt
+90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcw
+Yc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZr
+M2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEs
+tSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8
+vYlLIhkmuquiXsNV6TILOwACAggAw6kL0PhPZ/EPI0mPfmIYeaKUgTB8q47nDKY4
+6wDs1l/msVJHAVwGEBHuxmbC7r/qfAgfSW+/Lj4XbSLCqaZIWSu6lfY43IOIYXD4
+pe5cCnWkQij+h3LxRR6uDmBr5cwheHEuB2sMFU5lJiiQR1+eXYkPNK4FgVQpHLWe
+boODAlTf0j8gRR+aTs5eWXqfSA+UEsXpn6453bfZKELXkRmEznb4xyGWJaLW2Mlm
+aRlauYvc61M7FK8z15SSZbq6oictpnEcfkgnBxcNza3jZQV7WOWZ3BlD1nKQ661s
+bmS81/nLnxbov9ASs25K2olXBsHkERhjMnERedvv7avlmBwi1ohMBBgRAgAMBQJB
+lStBBRsMAAAAAAoJEBhhwyLFYBSyGTQAn2u/CvPzKwRv1FUkPYR751j9PGwDAJ4k
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=bKSo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1861C322C56014B2
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEGVK0ERBADwhGhmOMvSgvGaqHW3ial0NS80ZXyE1EeNL6ke/WrXHB4dT6if
+inoAuUgRz3v9Na4rjSQ8YVFjn3NaZq1i8RM2KJOUU8ZkJ2AsrH6fqStjofLTd5ng
+iQaq2wLM5rTQfdjLsGQb1iDNDyCXU56+/l4mFZ2JiEGCq3Re9EFHelRBKQCg/7k0
+BIfyoFVTHw39PKaDBmCYF2sD/3CMD0J/WldhBM7gLOndH9/YEQaEMy+PJNXcfTWN
+WLygGPSOQdNBulyLkvcFIZjUTxFVakh7FbjMq3dsAP1oqthwmK7L8A1zsvRgp/TI
+4YMHkZSkgcs0PBBby+h/lpgRrWmtwjTPzql/K5xX4VSRS+umHye/7R+4ZEH7mABa
+m/ZABADkPGG2ECvfjNosPQDHZVFuF9oVaske0OjzxI+rU6sR1fJKtbOPl9d+bgz+
+df7rZ3mwppkPX2r/muUbd0CM1Se10sK7ZAoPYmWqHX+vB/oj3Jq+iqb6M5mDZzEz
+6h4hdnaGERyxbktZvhRV7Psco9CGi8o7RFUQTR79Y5ElnBavqLkCDQRBlStBEAgA
+9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt
+90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcw
+Yc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZr
+M2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEs
+tSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8
+vYlLIhkmuquiXsNV6TILOwACAggAw6kL0PhPZ/EPI0mPfmIYeaKUgTB8q47nDKY4
+6wDs1l/msVJHAVwGEBHuxmbC7r/qfAgfSW+/Lj4XbSLCqaZIWSu6lfY43IOIYXD4
+pe5cCnWkQij+h3LxRR6uDmBr5cwheHEuB2sMFU5lJiiQR1+eXYkPNK4FgVQpHLWe
+boODAlTf0j8gRR+aTs5eWXqfSA+UEsXpn6453bfZKELXkRmEznb4xyGWJaLW2Mlm
+aRlauYvc61M7FK8z15SSZbq6oictpnEcfkgnBxcNza3jZQV7WOWZ3BlD1nKQ661s
+bmS81/nLnxbov9ASs25K2olXBsHkERhjMnERedvv7avlmBwi1ohMBBgRAgAMBQJB
+lStBBRsMAAAAAAoJEBhhwyLFYBSyGTQAn2u/CvPzKwRv1FUkPYR751j9PGwDAJ4k
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=alQS
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1861C322C56014B2
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEGVK0ERBADwhGhmOMvSgvGaqHW3ial0NS80ZXyE1EeNL6ke/WrXHB4dT6if
+inoAuUgRz3v9Na4rjSQ8YVFjn3NaZq1i8RM2KJOUU8ZkJ2AsrH6fqStjofLTd5ng
+iQaq2wLM5rTQfdjLsGQb1iDNDyCXU56+/l4mFZ2JiEGCq3Re9EFHelRBKQCg/7k0
+BIfyoFVTHw39PKaDBmCYF2sD/3CMD0J/WldhBM7gLOndH9/YEQaEMy+PJNXcfTWN
+WLygGPSOQdNBulyLkvcFIZjUTxFVakh7FbjMq3dsAP1oqthwmK7L8A1zsvRgp/TI
+4YMHkZSkgcs0PBBby+h/lpgRrWmtwjTPzql/K5xX4VSRS+umHye/7R+4ZEH7mABa
+m/ZABADkPGG2ECvfjNosPQDHZVFuF9oVaske0OjzxI+rU6sR1fJKtbOPl9d+bgz+
+df7rZ3mwppkPX2r/muUbd0CM1Se10sK7ZAoPYmWqHX+vB/oj3Jq+iqb6M5mDZzEz
+6h4hdnaGERyxbktZvhRV7Psco9CGi8o7RFUQTR79Y5ElnBavqLkCDQRBlStBEAgA
+9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt
+90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcw
+Yc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZr
+M2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEs
+tSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8
+vYlLIhkmuquiXsNV6TILOwACAggAw6kL0PhPZ/EPI0mPfmIYeaKUgTB8q47nDKY4
+6wDs1l/msVJHAVwGEBHuxmbC7r/qfAgfSW+/Lj4XbSLCqaZIWSu6lfY43IOIYXD4
+pe5cCnWkQij+h3LxRR6uDmBr5cwheHEuB2sMFU5lJiiQR1+eXYkPNK4FgVQpHLWe
+boODAlTf0j8gRR+aTs5eWXqfSA+UEsXpn6453bfZKELXkRmEznb4xyGWJaLW2Mlm
+aRlauYvc61M7FK8z15SSZbq6oictpnEcfkgnBxcNza3jZQV7WOWZ3BlD1nKQ661s
+bmS81/nLnxbov9ASs25K2olXBsHkERhjMnERedvv7avlmBwi1ohMBBgRAgAMBQJB
+lStBBRsMAAAAAAoJEBhhwyLFYBSyGTQAn2u/CvPzKwRv1FUkPYR751j9PGwDAJ4k
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=alQS
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1861C322C56014B2
+sub    9A347756830C4541
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEGVK0ERBADwhGhmOMvSgvGaqHW3ial0NS80ZXyE1EeNL6ke/WrXHB4dT6if
+inoAuUgRz3v9Na4rjSQ8YVFjn3NaZq1i8RM2KJOUU8ZkJ2AsrH6fqStjofLTd5ng
+iQaq2wLM5rTQfdjLsGQb1iDNDyCXU56+/l4mFZ2JiEGCq3Re9EFHelRBKQCg/7k0
+BIfyoFVTHw39PKaDBmCYF2sD/3CMD0J/WldhBM7gLOndH9/YEQaEMy+PJNXcfTWN
+WLygGPSOQdNBulyLkvcFIZjUTxFVakh7FbjMq3dsAP1oqthwmK7L8A1zsvRgp/TI
+4YMHkZSkgcs0PBBby+h/lpgRrWmtwjTPzql/K5xX4VSRS+umHye/7R+4ZEH7mABa
+m/ZABADkPGG2ECvfjNosPQDHZVFuF9oVaske0OjzxI+rU6sR1fJKtbOPl9d+bgz+
+df7rZ3mwppkPX2r/muUbd0CM1Se10sK7ZAoPYmWqHX+vB/oj3Jq+iqb6M5mDZzEz
+6h4hdnaGERyxbktZvhRV7Psco9CGi8o7RFUQTR79Y5ElnBavqLkCDQRBlStBEAgA
+9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt
+90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcw
+Yc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZr
+M2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEs
+tSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8
+vYlLIhkmuquiXsNV6TILOwACAggAw6kL0PhPZ/EPI0mPfmIYeaKUgTB8q47nDKY4
+6wDs1l/msVJHAVwGEBHuxmbC7r/qfAgfSW+/Lj4XbSLCqaZIWSu6lfY43IOIYXD4
+pe5cCnWkQij+h3LxRR6uDmBr5cwheHEuB2sMFU5lJiiQR1+eXYkPNK4FgVQpHLWe
+boODAlTf0j8gRR+aTs5eWXqfSA+UEsXpn6453bfZKELXkRmEznb4xyGWJaLW2Mlm
+aRlauYvc61M7FK8z15SSZbq6oictpnEcfkgnBxcNza3jZQV7WOWZ3BlD1nKQ661s
+bmS81/nLnxbov9ASs25K2olXBsHkERhjMnERedvv7avlmBwi1ohMBBgRAgAMBQJB
+lStBBRsMAAAAAAoJEBhhwyLFYBSyGTQAn2u/CvPzKwRv1FUkPYR751j9PGwDAJ4k
+Pt2uco8an9pO9/oqU6vlZUr38w==
+=alQS
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    72385FF0AF338D52
+sub    458AAC45B5189772
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+BemLeqNijrvozak+6IJUvgac
+=NN0Q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    72385FF0AF338D52
+sub    458AAC45B5189772
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+BemLeqNijrvozak+6IJUvgac
+=NN0Q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    43203BE58F49479D
+uid    Viktor Klang <[email protected]>
+
+sub    1364C5E2DF3E99C5
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+4g==
+=dPSa
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    873A8E86B4372146
+uid    Olivier Lamy <[email protected]>
+
+sub    1AFEC329B615D06C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+875QwNruE4Qkt/W0Rhy/QRIZ
+=eBqU
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    8614D6AB265B4C63
+uid    Antoine Levy-Lambert (Apache Ant Committer) <[email protected]>
+uid    Antoine Levy-Lambert (Apache Ant Committer) <[email protected]>
+
+sub    8832A83FA3060393
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+NACdFJ4KIATJDK/5ajFq5+irOpodoHc=
+=VIEf
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    8614D6AB265B4C63
+uid    Antoine Levy-Lambert (Apache Ant Committer) <[email protected]>
+uid    Antoine Levy-Lambert (Apache Ant Committer) <[email protected]>
+
+sub    8832A83FA3060393
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+NACdFJ4KIATJDK/5ajFq5+irOpodoHc=
+=VIEf
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BEABCFBEE059E4E5
+sub    6579F3D193AD0019
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFOv78cBCACj4w72ksYDdLAY3GzwpRa1fo6S4aF7r96PitlETY83ct7AVF7j
+XaBGk5ylNAZXan3vlsSAKtxlI7skZOE5iKjqDo7SUfohs1WXdmL765mUNsSmkbG+
+WMOwDneg7Z6+licSC780OUFbifiPOKpgzGuaj91vrNigOmtyA+cbIHckhy+t3/PQ
+w4fO0S3RyJvQM/aQeDsyvhhBf2QzrUN7RQSfS69n0gtlVcu8usM7FZwOlBDGVPqi
+2Pauuj9QEyQIqnn07uWAUTzKrWF/WtcAXmLMxs59VuVRC3xnPVxekQTcJeCKas2L
+Aaic1HKp3AfTOT7+Ao2RRg4GpIiFhaJpul0dABEBAAG5AQ0EU6/vxwEIALyM80xq
+kaopZN0A1tNL6KUnoLZx/Tme1qp10JQ+AtYP5eFqPpM2yQIkFgWoQFFRZ3saPsqE
+jYlAAeyrRLOJ65PGRycHckckdhyEmGFCbHl4bJl3qnfJZuAqOSUlmxMwvhFTi7Hc
+BCOcWOqCBm99Y91IIy6NGeB+D5Oe7RGox4a9iDDh/NfyYCTTRo1vR6GW4JK5y/oJ
+GfWGx0U3CkzrwPw5efhCgSXmo0U+tQyUSWKl+J9DtdR+kP5mNoWOOxYMN3w4D68A
+IDXdD9ECEAXZKcKAlEXQ3AkVQ+Gfi24S4z5ewsHm8he6HFOsYb+FYtEByeydskWl
+U829LN49xrG2sm0AEQEAAYkBHwQYAQIACQUCU6/vxwIbDAAKCRC+q8++4Fnk5S9M
+B/wLDuqtJf1ANTTf7pyQBmjyeD9QE/Tzv606tnLxZwkZKqtEa/+3EJuPJLYOVHkn
+XpWl4VlMdJv6DEg4DrOQuJDEvv0R7YrIRqKZcZNRn+9donI6PI9jqrbY+8ZWsoA1
+kom+hU2VEoutPgxkZsZPHMj3LfWTGouTa3/HEOP5cxi5leiqJmYLKKBXJs4iMNBO
+BsqNQQjD/0rLeyh1JlVF/bpsapQJJ2kijowt5Yqg0rPOC2qq7EQUV54EVhiq4+40
+iyn5JNPmXaRHH8lFCavNWLNUh9HxNZHUOb7/UmFG9T77reY4ATTl0hZUYKdCYHeX
+eOq2bxXEhHlRB6yktjak7zk8
+=y0Hp
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BEABCFBEE059E4E5
+sub    6579F3D193AD0019
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFOv78cBCACj4w72ksYDdLAY3GzwpRa1fo6S4aF7r96PitlETY83ct7AVF7j
+XaBGk5ylNAZXan3vlsSAKtxlI7skZOE5iKjqDo7SUfohs1WXdmL765mUNsSmkbG+
+WMOwDneg7Z6+licSC780OUFbifiPOKpgzGuaj91vrNigOmtyA+cbIHckhy+t3/PQ
+w4fO0S3RyJvQM/aQeDsyvhhBf2QzrUN7RQSfS69n0gtlVcu8usM7FZwOlBDGVPqi
+2Pauuj9QEyQIqnn07uWAUTzKrWF/WtcAXmLMxs59VuVRC3xnPVxekQTcJeCKas2L
+Aaic1HKp3AfTOT7+Ao2RRg4GpIiFhaJpul0dABEBAAG5AQ0EU6/vxwEIALyM80xq
+kaopZN0A1tNL6KUnoLZx/Tme1qp10JQ+AtYP5eFqPpM2yQIkFgWoQFFRZ3saPsqE
+jYlAAeyrRLOJ65PGRycHckckdhyEmGFCbHl4bJl3qnfJZuAqOSUlmxMwvhFTi7Hc
+BCOcWOqCBm99Y91IIy6NGeB+D5Oe7RGox4a9iDDh/NfyYCTTRo1vR6GW4JK5y/oJ
+GfWGx0U3CkzrwPw5efhCgSXmo0U+tQyUSWKl+J9DtdR+kP5mNoWOOxYMN3w4D68A
+IDXdD9ECEAXZKcKAlEXQ3AkVQ+Gfi24S4z5ewsHm8he6HFOsYb+FYtEByeydskWl
+U829LN49xrG2sm0AEQEAAYkBHwQYAQIACQUCU6/vxwIbDAAKCRC+q8++4Fnk5S9M
+B/wLDuqtJf1ANTTf7pyQBmjyeD9QE/Tzv606tnLxZwkZKqtEa/+3EJuPJLYOVHkn
+XpWl4VlMdJv6DEg4DrOQuJDEvv0R7YrIRqKZcZNRn+9donI6PI9jqrbY+8ZWsoA1
+kom+hU2VEoutPgxkZsZPHMj3LfWTGouTa3/HEOP5cxi5leiqJmYLKKBXJs4iMNBO
+BsqNQQjD/0rLeyh1JlVF/bpsapQJJ2kijowt5Yqg0rPOC2qq7EQUV54EVhiq4+40
+iyn5JNPmXaRHH8lFCavNWLNUh9HxNZHUOb7/UmFG9T77reY4ATTl0hZUYKdCYHeX
+eOq2bxXEhHlRB6yktjak7zk8
+=y0Hp
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    62BA9C275D14234E
+uid    Pierre Yves Ricau <[email protected]>
+
+sub    FD2D3AEF63B97A64
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=ukU8
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    62BA9C275D14234E
+uid    Pierre Yves Ricau <[email protected]>
+
+sub    FD2D3AEF63B97A64
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBF/kpOgBDADKuK/xrCb39AAmyzVkFTP03ZNCAVhDnmx/1bSHTwvXFWQ2topE
+IgqlMpKmjuEH03gfOP2ibbgeJ3WOJcijqfeHNZ7wGDcslbKOnFVrcN7DuJx9LDYc
+1bjyuNIi+L/UCdrciDpFbPwMoeCZrVuxTBH6iHuhNETuA7c7NUJmlwUhQ7+qzdni
+TufaIeQK9kP4zeygqOWfZNk7zZ3FS8ft2mjhAKYG9RtMcNVbSUjYpF2nQvrhDUzJ
+qrAvtULH9TMLfE64n9S9fC3Zzq5OXBm2U/oL4SyVwfJGB/zPDdLIn9k57/Kx1Abn
+3r3AgfiFqRH2rSaMmQwLeVt9iEZVfmCsiwJ1iwyenRTxQTKHWk3vqUMRiH64C6Er
+QHwAVjn1DVgvCVRtb/gwl/3lMAdAV8Yfo9ljUZhGkGrzaHe0fEWseOiJ/auCBzWj
+HfXBDMQRJ8OCfqyUCGoDpUEtZA2mrXechdAxacwPnQQXPAN2vEOJrS3wVWSAwhNG
+ce83S+v8zkq0RNUAEQEAAbQmUGllcnJlIFl2ZXMgUmljYXUgPHB5LnJpY2F1QGdt
+YWlsLmNvbT6JAdQEEwEIAD4WIQQE6bLh8G7Lvg7QqsViupwnXRQjTgUCX+Sk6AIb
+AwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRBiupwnXRQjTl81C/9A
+SZCROhNb5rDW43mI8LWhN61j0XuJuE/VuWF2c8MvAmbqWORzsOvs00W4fIhXlnfH
+GhzNb0Kpu1zERGI9TMilzcbzLAmHf/DCL9n5wT3wSyDqeOMgEsEu6SzfCuAH6aKJ
+WjXeX9YltnxO3gZK7ZuOZOuk9op8uLrzPtyNJxvxGZ1qHfr+v2PQRMLvC8SPWJ7G
+X2AnRiwck+u6XjZy5ymin5Fnc3FjxnOiiwHzRP1w5qE1e4AvBcFvnSG4zJDi4t/o
+ODnYnRk2pX1/9a5dCBRHSv73eEMl5ozhYr78p3y9yi42pd5Afy8T1eG16bjqkdOs
+J59yD5XIbRX9pKpyNaDjfV91pUPZGF1NDrKUz95XVrzhkbxy0trhLJMMJoWmPJvA
+ofWPKMGwhp5B2Y30Odck4y2Do+1sEnaoDeauVmaD3H844qKPv8Ey0C0DoVvDzC8e
+RX/eLSoqAq8eJ91VRGcW0b0En/yX10mltzhO/t+J7qfoz3cHo/oThe64VO3e5Ya5
+AY0EX+Sk6AEMALMIROt8lYitFNu8dNaNvhxqIANd7rT14ywe46YAYg55xFGCGv1N
+Ilgpdu+QzCW3MZr23kxQYTE0dLomq7YmIhiq4+bqRtzon2im9ygPTnv3itkv7wOB
+w6dRIz8A1pl+0h5OYAohY8jUvKtpPsoT34o+A4oeDFiiGSN+B6WWPtl/imit7lh8
+K7nvyGOcggLqwqQMN3uw+Wd6gtyo1sxngItPMaDV8JjymufuhpWIw250TAaZTBDD
+Jh8HZU7jAnT4jtSP3LggFkDVdTnFJKbFng7x4N4qPscnmNHGnMm1HiXynG8MjX6h
+nyRTaIoX4HsNFVP+960lkAO2+fT0hv+apYn9oYnVTHuDeB7nGMk8fkwZpy5Om0k9
+Gbxre2RgADim/0zV7zMAcxVLwB0eiy/Jms+vep84oiS41QLdwYnmNDI6SM9ydJyf
+kip+vLuaQ/NnAQlMWA/gZkiYBzV0offSpMAzPoxLnkDzp/m4oh8jiO9ltvpHKH+/
+OuNcDLLxmKvY4wARAQABiQG8BBgBCAAmFiEEBOmy4fBuy74O0KrFYrqcJ10UI04F
+Al/kpOgCGwwFCQPCZwAACgkQYrqcJ10UI07KOwv+ILdBSAqr9RfoDyoxdDxJIwDL
+C2E0GVsvd2uVX61Ke4QYnUt77z+xzFyf6et/RmCA/opxhQZyQ58fwggUDNrayL/D
+FCUM9eAYCoAPS68NPs4dLtBPbM29mDvuBCEiTgfCcwl5MKY/2A5hoDl1Dt2vemf2
+mjbHB4oOzwb27JUVOKoE68qr2yRv9rWwbJ2+ebDrmJ6LzLeLQcvyPi72NaHZ2JmC
+ebFoPDP8YMbAvudzuYmPq1ARX7mBhUKuRsFj1squb+q59oIYFcjtV2EkyHHEJDPW
+P5oKEAuKZravlQruk/R9i5xzJagA9DG7osWidwO1F8aIB3eDvnxfnrkcJq9dlg8z
+0OZuVBkxldl5hyckQhq/4ZmF5GbT/Sel8Iz3PivPYkoDol7N9BtteKQiLj0k1/bF
+jsIJDsheAG7kuYgvv1OD6J32TVaHA3WNu/1WxgA8QRIQCJDdaWt5NFnnXLjkZEX7
+4K846L8IOXtYDpCyqGyRe8sCBjlAVPvrZ/QBLs3c
+=ukU8
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    29579F18FA8FD93B
+sub    9DF7F2349731D55B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFYFiMABCADYpblWssqGxbjTwsyroPh48BwdSKl59zbFKoEHDw87NeWq7fik
+h95RkbdeWsQSvduXWgQZsUDq9cLOkuS/ChAMkAAd3MPp1NMdFmAqS7BX5wU5s5I7
+XD+/p51SWLMvgrLxoenmoE04EuQqQiXd4DbU+HGPseiNx+mN0cxPssaZMBBsmi2r
+RjwcQrFTaC1iffzh8FKLQvoTDzci//b5bWcxCLbsY9dYcUaDCbBAkL8HzyZUKNE9
+XwXh/Rq8wDakI/VEg/905a9c4xq6Rss6Yn5E4V2SAo2+B3hYmvHFsefaM9kkqvXk
+MQ6zjx83LAtzavOzmthjhhPIgCAfoQ5Q5oDzABEBAAG5AQ0EVgWIwAEIAJ29KWGH
+aEt7gXV8EweJkrYd02nwjc1LyjUT2TRwEzZ9N9qUiVqfpkgnZn4mpHCToxFoqkHa
+iv/QDfj7cp8jbZJa2wjaUkDbH2pZqLBGJ0sUUBZ1KNPM2uhhWRzAnmF/bIo3+Yfl
+hGINLNqoevkYoo9cdelP3hepef4+PUuPmKmeo856uknmaWQ89LPwLlV7oj6wiqMY
+p22sHqTGAgXeR/fSLMK7d0vSPm+57LZed5ECoRMeqYFUwSMV64RjTMkKPsvFBGvR
+hppJ+uWQiMjFFuFq2DFeNBVtueHSdgCHx1TP9i+x+7JmYsmFFmRwnEdbxO3THFXa
+gFQGr4ima+oOjLcAEQEAAYkBHwQYAQIACQUCVgWIwAIbDAAKCRApV58Y+o/ZO+ZZ
+CACL1DlaVyRNjNxzC+30X6xGykPwCdwMRF3CRjoeIicss2pBJRaIdTYFpg3bCZKJ
+J5KDC6s+03zmd3ddnKEq1fEfRcoLZ9PNBYF3IESHnNPlR68RL2cjMgq6segbhOxa
+v13ZcOIOnyrWzgbVw0ZgN8P3vCllFtifwvuF50vTshIRY11G8Gluu+GZ7tfSkPww
+Eo+pRd8scdol62aUUo6a71rDOMg2XPULz0l2hxKWfeUsksT5EY03seZd3CYqOacL
+R+jaHyOc5Nh6R1MzcRz65YTwzVbKplXtZjOghMh+rS4eDIjEKlo456M4spKFBbTf
+Ub+QS9kCkBU8csUzwF0nk/oP
+=SZ35
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BB2914C1FA0811C3
+sub    7AEAF265B448E2F3
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBFHwyNYRBACkCXpipiMx0lCEccXXzv0bE7LHHbcQYtb1vT/o9WXYoP8JMChJ
+cvuAe8Tvg+s7EUjKHJRhu7I7kie+IJ2wtH5uVARkYxoP2OslYN6MSXa/bmwU8fwQ
+EFkVeFV7q2UFvH4cqpa7UKWggKcUzvB7z5spg/iKuMDQ/aBkxpmUcrpefwCg4/IC
+Omi4O9ROfzJ5Q1YHSrr8A0MD/0OTgJjkBPPBcel/pFetsWhlqA6dkYINT5qdlht6
+d+aye97QFUccg3ODnCq4fnDPHK9PMK8cTGkrnoux5XY240XkWX95tQDyrssGqldC
+zOLxoii4/gsw5s6j4x/AjycsAI8DxaecQb3/sNg05V30ZNm2+kQNmGGV+0oERpo6
+DAVQA/92UVwQdZjMzCs/6NTbsq/2tRX/XXiIxTij6fpZUeHvR4Ek3meuaXs9PPwC
+o2f/90aO71bNKjh0LHSI0CEuMWbnixmBgOEQY1yv0HvW1OB7otXrTS7EI1m+4k4c
+WlwidtR3XjqqgXTjFz3J/ipT8j15a5HOtoIwP5AHw4e+1cEmCbkCDQRR8MjWEAgA
+mqaIVMeh86G+K7uq7m6m8F9s4WtEkmYAYHdk5FXOXEJ+uOSiUiYLcYSBYRkahk9Z
+o7QSv0bWRmqCFI96Jvo5f0MBLkwR9hxYzrr3vkkJyreMsG7ybyXA0O+ga6ex1091
+bBm0f1vekvT7VGdcTtjWhpDiMBXZgTJDGUEpzz0Z/8MxYEfTsk1P7TNMMAvm4AOw
+vRk/xL8Rc6Gapr5EGMLhKRADwvWU3vYIhRjXApXZUem8tNq58cmR4q6EEsmedDri
+LuufwVBPT98/+sxEPMgPFnSoLPDc7AB7vD9s0Ip+8jG5Rtbc39Phz4GDHmCUwJ01
+Mo8k7Sr+jguGb0fthSfM9wAEDQf+LRyfjdWJ6CW+mGSYFsW1ivKzLujvfiQip3CM
+y68Si8BmUJvN8aPWS58knZY0ikXOai+m7W+4yVMkdNLm8JpJ7SX9NevZCYAb5lOg
+mE7kvHoGFar5oA9ttUIV6RZXbQi0fXtksKse3c5gWqMTmEzTV+7thtQ3V6UmXpIv
+OHKvLJdocHP5T3yDgnKwr1ajw7028XT3wsaiUV+sgjtc+1KMME9/Zhwa1jWSzuZ4
+Pb0kxVIjzebsTr1nMdtQqARg+KKc+R8Gc3NCP9MZ/s59NUFyfCkg3TqazsIXQ1bi
+KMv0GppFbFMnC/ifijqtl9g9phuoF3N6/Cs38zVlRHneyHRAG4hJBBgRAgAJBQJR
+8MjWAhsMAAoJELspFMH6CBHD4SEAniBrVdd83vjrwn/3vXYTuZrmjIO/AKC9Ib56
+Z/+UEC1v8wCMk2365rUPKw==
+=vlw0
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BB2914C1FA0811C3
+sub    7AEAF265B448E2F3
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBFHwyNYRBACkCXpipiMx0lCEccXXzv0bE7LHHbcQYtb1vT/o9WXYoP8JMChJ
+cvuAe8Tvg+s7EUjKHJRhu7I7kie+IJ2wtH5uVARkYxoP2OslYN6MSXa/bmwU8fwQ
+EFkVeFV7q2UFvH4cqpa7UKWggKcUzvB7z5spg/iKuMDQ/aBkxpmUcrpefwCg4/IC
+Omi4O9ROfzJ5Q1YHSrr8A0MD/0OTgJjkBPPBcel/pFetsWhlqA6dkYINT5qdlht6
+d+aye97QFUccg3ODnCq4fnDPHK9PMK8cTGkrnoux5XY240XkWX95tQDyrssGqldC
+zOLxoii4/gsw5s6j4x/AjycsAI8DxaecQb3/sNg05V30ZNm2+kQNmGGV+0oERpo6
+DAVQA/92UVwQdZjMzCs/6NTbsq/2tRX/XXiIxTij6fpZUeHvR4Ek3meuaXs9PPwC
+o2f/90aO71bNKjh0LHSI0CEuMWbnixmBgOEQY1yv0HvW1OB7otXrTS7EI1m+4k4c
+WlwidtR3XjqqgXTjFz3J/ipT8j15a5HOtoIwP5AHw4e+1cEmCbkCDQRR8MjWEAgA
+mqaIVMeh86G+K7uq7m6m8F9s4WtEkmYAYHdk5FXOXEJ+uOSiUiYLcYSBYRkahk9Z
+o7QSv0bWRmqCFI96Jvo5f0MBLkwR9hxYzrr3vkkJyreMsG7ybyXA0O+ga6ex1091
+bBm0f1vekvT7VGdcTtjWhpDiMBXZgTJDGUEpzz0Z/8MxYEfTsk1P7TNMMAvm4AOw
+vRk/xL8Rc6Gapr5EGMLhKRADwvWU3vYIhRjXApXZUem8tNq58cmR4q6EEsmedDri
+LuufwVBPT98/+sxEPMgPFnSoLPDc7AB7vD9s0Ip+8jG5Rtbc39Phz4GDHmCUwJ01
+Mo8k7Sr+jguGb0fthSfM9wAEDQf+LRyfjdWJ6CW+mGSYFsW1ivKzLujvfiQip3CM
+y68Si8BmUJvN8aPWS58knZY0ikXOai+m7W+4yVMkdNLm8JpJ7SX9NevZCYAb5lOg
+mE7kvHoGFar5oA9ttUIV6RZXbQi0fXtksKse3c5gWqMTmEzTV+7thtQ3V6UmXpIv
+OHKvLJdocHP5T3yDgnKwr1ajw7028XT3wsaiUV+sgjtc+1KMME9/Zhwa1jWSzuZ4
+Pb0kxVIjzebsTr1nMdtQqARg+KKc+R8Gc3NCP9MZ/s59NUFyfCkg3TqazsIXQ1bi
+KMv0GppFbFMnC/ifijqtl9g9phuoF3N6/Cs38zVlRHneyHRAG4hJBBgRAgAJBQJR
+8MjWAhsMAAoJELspFMH6CBHD4SEAniBrVdd83vjrwn/3vXYTuZrmjIO/AKC9Ib56
+Z/+UEC1v8wCMk2365rUPKw==
+=vlw0
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2C7B12F2A511E325
+sub    10DA72CD7FBFA159
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS
+2gUXM0R+SunMlun9KsqjnojJ2ObVPvbm1Hg/66JSRgR3JWfIpSlJxLicpfu8rCfN
+bOjh4v9ZipD+px8w3o/RNrnZH/KRsoJg9yER6pf+pUZqTJfdg5lXezc1WF+/1qVo
+ypldMGfrkfLsPrUZTT689ubbig978e7eYmJEqldtaIwaAzHQnB70wIJyg/rEwFUM
+ldsvs6t6czSuJ4zPMvmh8TMpTg9e6+DMktPl1CWRONl8RPpgYMIC96gb4OnfDDjk
+Ex6clSCwgbDwdeAyOjjR6pVq+pCNTo1Pcj5jABEBAAG5AQ0ET5k74QEIALaxogmJ
+1t7arw82krV7ILlcOu6aLuuXTuy03K1/jU73oyWfUqwvPSbH4igcLb8kt1/6ogfk
+u0T9tTx+0mDsvqK8A8NZ2nDTXok3T58UAg0FTXlqUqZmy5QPtG+it2j3/xGgip3V
+5p0Ml1TqEl2SfW6gHtLptDUWzuzPi9SgK1ZFlueprPg7xwHmWhp0gwx0KSSOYWlK
+oEllj/1aDxFNcdKogWcGN5aJEsETCEguBP7olL75u6732wc3zola4zTy5bFT4kEY
+Dk30Du3VGQJrdsqlibdQpZYm8uH4AVXDmFMdEAjIs/DGRrUgde/oUqwtgm9U+p9M
+qcbmMoeLFdi7ajEAEQEAAYkBHwQYAQIACQUCT5k74QIbDAAKCRAsexLypRHjJV9F
+CACkvuGQCqxhvY21n800w27vc85F4Fdd7LjA/l3Bs9dA5HZbk1AV4/MFpadvPX1z
+ZuBOPYqbDSvnXGfoDgE41L29S5Yeg+mx89UDO6JcQQnlNn3k5mGCgR/BmGPSWc3w
+FzTEIXDYoj4/p7Wanj8vxBQOLmRzO1nu75dnOwgXAwKtTTXhHM6NCrxuwFrekKGj
+FZm7wNeBCmnTc65hMvWqZGoNQSr8M1yJ2AryBzGvWaonDklHCOUAmLuU7n7yBOxK
+tyoYdhMdRYjmhAPueyzK7ejbEil6wfCTWGyOaahNa8SV2Z2Lcd2aTwABHy4z3YtQ
+DpFob4bKD5ohhQunm2EOXlWy
+=Y1SU
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQSuBEwVyy4RDAC9hprQuF4fCPCYdtMlb0Mfb+6G2TqerT1MebLm8/KHCRnPbFLg
+PwGgcyynLX5R2nXUb6oBZQByDN/Dal0UMuC19KeZX83LTcFE9vr516BMXLXXKmM9
+Hz5kygsu1iwP4oqow8U+ih16rxdYDmM3KUGhPqXYExpYH777NxaxxCyPJn7Mz/Lg
+QdPkO0awyl86sex6THr0fYJqR11XW2BkbK6Pfs5ubfxrMZxy1JujUw0UmzzEkQqU
+1+lncxecrevglH1R2WdIHx2sjkHQtwqT2rcsk9gJ8ISL4gKJ7LEYfLooKRwro54x
+WVi8Eu/XZ7OHfQfgF4+JDofIrd7zN0/Dia0qKpkZWJTrYhxj6ouvYqMPr7+XEBub
+eHFU6S7Zzo62zkm4dv6bAhvT/M1WWKih+dOvYJ6+qhBt9RsHJdUePAVYLOjTcvl1
+Dn7YKRczBpeiGQTGaquSkWh3HPCw9Eom5wPs/J1L5eeLdKoqyGUQvdGMJxuFLpSM
+BVN7Q1Voom8XBt8BALG8oGuCkFZUN6ukJQn1SWXGeBr4IUbFU9gnfZUVeLMpDACS
+erCIYBhSRHK2XaHWxPppw0yMm9e/eO6WWpVBZLd/cbxtxwJUandSfOhKn5bGRsGs
+phhWXjmT4w5DF3cngfe9aMSAV6xTwfnzJ5nSBwejU/UYCiKTnGVqVkMV1N546ZoO
+XCEJLRK8GeHzBXf4bvPW+4DVhfx/LBz3h8VJ0vy/cjkEqVWPCvb05WqZ7bhnk/kc
+N5F9NzHzCnze3fMfOtUnLgPCaAwWN3S9fJpKumhwAXdkp7qZv6CuvKsXsETmAPYe
+j9GYWiUpbL4bm4C+QEC18F9VkDs5BA3PhukNWutFcYJuRoJ6gYyUaA1PSqvcTaE4
+RM7Jjn3/fbMC+PQTNOYdixN5u+ASAsgjEDDaQJYj0Nzm8hy4uDbFH8TIqU/RLs6w
+pK8oLonItiu2UQWPnExvIN+iYGCfeMWDT8Lcx9cDxpshVZTEyjImPMlQBD3dE9Ov
+Fhh1nVjAZhyVvPbfshtBC+FphC4///lHumxAVJqu5oWdVj0cTlEqEAlOMNHBzJwM
+AIwXYkRklTogkJUCSZb8g1FB+fn6DJCu7CB4Fjd596IJn46fkCZKyxQ+L16KNl6Q
+g+oEhzsGWrpiHcBDZk7Oo5II4Ajjs2IiNhEkbUKbKn1aF3fdnpByOR07Qs0fKYCD
+xuUIgoW9aLtkJiXnQv9ddgpOvNpiqyBVs9dw4c9wWJon6q87dSRv3ZnvR+x64A0I
+82gtiE/gWnv9T7n1ri/P8J0/wMN9G4mL0bs7wTSSyd/rM2dDruYysYQ+CtMD8oIl
+VhV53qEB+5/IGb24OVileRPCVW7jGSdfWLbrV93C7GOh7gLsm+M7sZYqDTLgGkq/
+JNZSiVocTCxnZbi788kT+S6LsDdjYzGwqTqrdH/kOFToxMaen2mG37vB6BjA80t5
+lg79qALXIOKWPDI3UJ9LMavq8MXILghSbgJD78QwmPEROZh+ywN11cDw6yc1HSFw
+NrSZZuKPnj01amo5/Z2N9VMw/DWCYVA0HkPGnnxLsyboIA4tE2JR/QdNuy0CGrmn
+8LQyVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluLmxlZUBkYXRhYnJpY2tz
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJgXoAqAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zON6NwA/1oYHd9ChpQGGO/D
+lKwqijmomSpy5eEz/U8iJeq1eF8JAP9nOLHArkcDUvLqXxwPyY3SD2GE19khrbRD
+w25IWil3qLQsVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluQGxpbmVjb3Jw
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJan8rAAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zONyTkA/3PTaqRvtsm6iKSU
+FD2qe6805NtersLkzPJkChAHCp7SAP0VOOoX8tDOc7f4kkBDTnSwIYdLexqaWuwg
+7HUowhiSLrQhVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0QG1vdGQua3I+iJAEExEI
+ADgWIQSIWNRb6bJ2gCMYFVuW+52yGfMzjQUCWp/KjwIbAwULCQgHAgYVCgkICwIE
+FgIDAQIeAQIXgAAKCRCW+52yGfMzjUO7AP9nd0SjT5u7bVzZ7WIDNhKc3ux2nOv/
+ixSKtENArECA0wD8C9b7o0lW0bODrhoPWyi2GLhcy3M5LD5sDTZ9LmTugc60J1Ry
+dXN0aW4gSGV1aXNldW5nIExlZSA8dGxlZUByZWRoYXQuY29tPoh6BBMRCAAiBQJM
+FcvwAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjURTAP41
+zJKS3mNA0J2q0n/pAkqMd7EZ4SDGp/BG0lyKZvZyEAD/RZmkvpGWHemaNTRpuhed
+rHv7M0LnjMftrIVSpoyDynq0LlRydXN0aW4gSGV1aXNldW5nIExlZSA8dHJ1c3Rp
+bkBnbGVhbXlub2RlLm5ldD6IegQTEQgAIgUCTBXLywIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQlvudshnzM42ERwD6A6ge7K7+/QokKj/wFdTzgxOfocpV
+ttSqLxEsmhG04WoA/Rga2VZAQ6gHxgcCIx4Ot5XJJ1S/U6duv+jlYf1OT9HjtClU
+cnVzdGluIEhldWlzZXVuZyBMZWUgPHRydXN0aW5AZ21haWwuY29tPoh6BBMRCAAi
+BQJMFcsuAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjU1P
+AQCAhboUjDQx18iRbYdtpgeMZa2GP0Go25Ms/TsyKOx/dwD/YmAwU8c6cO1qf1vM
+UgqdOMpCjxTo+qUcbU8nIwrisJ65Aw0ETBXLLhAMAP43xB9VDluJa3m0EBTwOswy
+MgHbCJL6iK/MwvBGrTbwdu93jdhNBfjSUsEExMV3YsyIK/0oBDf1s33o6y51OZFP
+UC/NrUmx+QycHcSL8D75+D4M7324T6q3dqNpg0+jFTDixHi3FmNpj8NY+7iIS+Wr
+Q1qkBCfBbKkGrUe6lxgXksenvRoDQFrBndxlZ4JLKNdmY8UL8hhFDVO2ekD50iKL
+cXGTgRaFN3NlU2BLunC+ja0iGCnTVclvAznhmtw4QL7S9aqQIo00LhZlxfZyEQi4
+ljpSrB6aX1eu6VFCrsdldA3vJ31sCPhykrJhoEph6A92a0ewW94+Eun+m7YSVoU5
+noZj5IQlQ1YZ9acQN+7blEAqUBoresm6XJMo/ago2VooTt3bUQlKyoNJhZKfQBwX
+rQr60oskczUkVTMxy2KBTKqMV4BGWEdrkPrrs1wFXUXq8adNUHJ30X3y00Iy58VU
+aRZqLx/J9n+40LsERil+9YoajUMaxa9Xnl1eATq0kwADBQwAkJG2ODt7UZPzcPms
+4eE3az26d+jSPDqNnxgZPYxeW2pidwpva7homwLdIbMT6D52WU/DC+N9LNtuo/2h
+35hnHJ7fasEhXax+ArUzWBkdi61PxP31vM78fV5h7xxFJ2JPv4t6Wmqt2i+d9GCQ
+911lHGwtwV/iAVk4FY3i4f+bs0dkJs+yNhUWsVRzSd87cfvxij2jB7qtIB5aPWdc
+qRsZtSd5T51NtGmGtIrhVr988svcecOrdATU9qBBDTPDW5AacFIWu537nultWrot
+x6S7Wwm7mU8KnOP14b7BVB4rMiQJclSYjduBe+aWHNSxOJeZmAq0JBLdgIt+nerQ
+FeMr57q0q0qqooPIVvrVlxFxzXHZGISIt/JsrOUPJFkI95T7+2huRzNUHFmfHE3A
+eHrcLTsKRMe5nx4OYw/FDgk+qgFfUtUpu6RqH28WTlGtPW/6cZIkCyzc2wtAlpkp
+iiUdIA933CtSpEQ/KiDOj+gKsdtaZb9tiBkhke+OSd7JtoThiGEEGBEIAAkFAkwV
+yy4CGwwACgkQlvudshnzM41tWAD/Qq8DwaDw114pXn00eXN7Qck0v5F2xGpW5ktW
+CO7Aci0A/1mTmMrlJszx6YZuTkJHvAVGLVGR2/uo53VEYjcEN7vR
+=PCTs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    218FA0F6A941A037
+sub    9FF24F51B06DCC19
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFjDR2UBCADDfzBacBg664xalF55ghVkhxxwLaTNUdvTJ9o0IH+cGTRj7EYr
+7QvLVa68PKigj0q7SVVwhPT7fzBLDosGjHef0UWap10ynqACBoAYSFocT9m3Www1
+nW4AGT/5chvzYfNPpN7YZ2Hkk6DUpmSzS83+6nIYdCAgrcZ5XS0Vg40vUL34TJPy
+IxJinqWxt4A14ZryqSKWbWxRcocmpCAeRLMLNxbQq5rKjjxFksTYR0Sj+t47DQsB
+rqFmnPnZFExP+Q/KG1dKQ4UE/LyvzoCzCqynuMg7gIlMuRBzDv8QB2f6DgViAHdC
+vS6m2YCTGURCQufBdJOGuGplL1uxqoEW54G3ABEBAAG5AQ0EWMNHZQEIALwz8m2S
+GdANvkFLVqXdvmOZ1RjrbrzrIP/iOjs1Bo+sD94L2qUagd+/cKjvGR2cFP3g7Zci
+YBAZVCWZpgmXTL4tL3PSZg3NVvkuXut3MU+23ksjlkl5Lfzlq0Rmidu6I1TgBsXc
+CyD8Yilr3QKtQkD0l94uXX9+Ex2PuBO92qFpNqib567wSt8druTewYm270WlAVSc
+YQ3rJzdmzJD4WT+PyKm15NSLID/wzIHxbgloe1SVs8fNmNfXP4tq3fyOY6wUnsTO
+lj5hfBuEJRiRZj1H2Fch5iFtyc7kw2pH7jhXvOHoCbztjXgA1KgAaoVixQhOHMWp
+NZMy+qDbDlmblV0AEQEAAYkBHwQYAQIACQUCWMNHZQIbDAAKCRAhj6D2qUGgN3HV
+B/98pHsmnqNOu8pflm+0oRzh9zQypjCcKlFZM0WQ7jIRghOYpIKxy+zCj3HU9110
+U64JK/PO+AAOAqHnh1XXqXCooMIapPtoPV7Wn5rvK1agsDHUqeO5yJKlZMbj60Be
+f6qR8iuLK07nZ+GJcal2NCRq/t212otXD7f70rfD5ut07MDM3ifmZFdp27eEGxCO
+TaDf+KzZhP5KUFtAcNGpuXXAEW6t/JqJ+6h9EbpddQwgLsSwoWao4p3FRyu69ZqL
+CeGx/iz2BxYeUH+oNiFh1u6Bio4Z98zze4eGD5fT4RzcWwqMvyLxWjvEjVyucG7I
+hd8aQ+J7j0jtofr9xasevdRn
+=XE73
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    218FA0F6A941A037
+sub    9FF24F51B06DCC19
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFjDR2UBCADDfzBacBg664xalF55ghVkhxxwLaTNUdvTJ9o0IH+cGTRj7EYr
+7QvLVa68PKigj0q7SVVwhPT7fzBLDosGjHef0UWap10ynqACBoAYSFocT9m3Www1
+nW4AGT/5chvzYfNPpN7YZ2Hkk6DUpmSzS83+6nIYdCAgrcZ5XS0Vg40vUL34TJPy
+IxJinqWxt4A14ZryqSKWbWxRcocmpCAeRLMLNxbQq5rKjjxFksTYR0Sj+t47DQsB
+rqFmnPnZFExP+Q/KG1dKQ4UE/LyvzoCzCqynuMg7gIlMuRBzDv8QB2f6DgViAHdC
+vS6m2YCTGURCQufBdJOGuGplL1uxqoEW54G3ABEBAAG5AQ0EWMNHZQEIALwz8m2S
+GdANvkFLVqXdvmOZ1RjrbrzrIP/iOjs1Bo+sD94L2qUagd+/cKjvGR2cFP3g7Zci
+YBAZVCWZpgmXTL4tL3PSZg3NVvkuXut3MU+23ksjlkl5Lfzlq0Rmidu6I1TgBsXc
+CyD8Yilr3QKtQkD0l94uXX9+Ex2PuBO92qFpNqib567wSt8druTewYm270WlAVSc
+YQ3rJzdmzJD4WT+PyKm15NSLID/wzIHxbgloe1SVs8fNmNfXP4tq3fyOY6wUnsTO
+lj5hfBuEJRiRZj1H2Fch5iFtyc7kw2pH7jhXvOHoCbztjXgA1KgAaoVixQhOHMWp
+NZMy+qDbDlmblV0AEQEAAYkBHwQYAQIACQUCWMNHZQIbDAAKCRAhj6D2qUGgN3HV
+B/98pHsmnqNOu8pflm+0oRzh9zQypjCcKlFZM0WQ7jIRghOYpIKxy+zCj3HU9110
+U64JK/PO+AAOAqHnh1XXqXCooMIapPtoPV7Wn5rvK1agsDHUqeO5yJKlZMbj60Be
+f6qR8iuLK07nZ+GJcal2NCRq/t212otXD7f70rfD5ut07MDM3ifmZFdp27eEGxCO
+TaDf+KzZhP5KUFtAcNGpuXXAEW6t/JqJ+6h9EbpddQwgLsSwoWao4p3FRyu69ZqL
+CeGx/iz2BxYeUH+oNiFh1u6Bio4Z98zze4eGD5fT4RzcWwqMvyLxWjvEjVyucG7I
+hd8aQ+J7j0jtofr9xasevdRn
+=XE73
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    86FDC7E2A11262CB
+sub    59BA7BFEAD3D7F94
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE2kzuwBCACYV+G9yxNkSjAKSji0B5ipMGM74JAL1Ogtcu+993pLHHYsdXri
+WWXi37x9PLjeHxw63mN26SFyrbMJ4A8erLB03PDjw0DEzAwiu9P2vSvL/RFxGBbk
+cM0BTNXNR1rk8DpIzvXtejp8IHtD1qcDLTlJ8D0W3USebShDPo6NmMxTNuH0u99B
+WHCMAdSa34wsg0ZpffwQmRxeA+ebrf2ydKupGkeZsKjkLlaXNkTVp1ghn5ts/lvg
+KeHv1SJivWKCRmFlbPhBK4+mxSUSOPdoBNAfxA51QzZoPizSk0VbRz3YufYRVLFy
+9vqPSorDmYJhCvn3f6+A38FS/j8VE+8obQ2rABEBAAG5AQ0ETaTO7AEIALN4amR3
+pf/FN8oMFa9eAc44ognamG31ea1lkqIiPssiJLC9J2z9mShkrECbsBj4o+HxeN/3
+rwW2hQFAm8cAbitujASpPs46slp7Ylx6cfmrNqh3tOkg9BW/5izPwjXAuULovMpG
+PVf30eeDpf6huwRqyc9uYQSS6Jn9KCLi9ULxIeQOZi3UPHyMOCbnehR5aQQk70tI
+jbNytmFKC+DXFrhDiBjlRQruATgtuYYKMWUBO65b/SyvLG7zPGmHXmCSfg2qCTQI
+8xKN6wxgQY6x0PN9BeXa1du3497qYGhaHrsxnW/nM6rcQO2hKoOlY/GmicB5oK40
+MMVfji8aN/EYTS0AEQEAAYkBHwQYAQIACQUCTaTO7AIbDAAKCRCG/cfioRJiy8Qw
+B/9UbKogRzDhPYPeBlnchOR6gF69B3EFP/bvE2+hY5nIZLMZiVFtFCuWj65myN8x
+z0w29pKbHLLiAtVtx29Cvc8X/8bGmEn3xbymT2X4znuN/IeecK6afsw7ij1535a6
+KA3mh640noEird9/ajUOysS8MKFg4kQ54W5bG/67sjYAEkl6ns1sHIzaf08Ty+UZ
+TfNQGBZQGyTqNP6SUqcTIcTvpbN6A8vPeO0SVO7IHuNGGPJAm7XKIkQxuzbMfxok
+Y5uLl/wm6bi0gtm4QB2gjQzdzdVGrXZzP+8vL71Vdr+z//wiwafzySPLJio7LxYk
+SOg5cWH752laIzudmSBBw2Lk
+=HHpt
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BF984B4145EA13F7
+sub    84761D363E7B0FC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF7rgogBCADU9OwoEFdIgN5U0JU5pI7s3T1T1LeDMzAQ8l2Hq4jFrhnrjcEA
+ieDSut1YIv5NTBoZv4CrklaKvvQNUXPvKrFImA4OKhBodKV3wsq2efCATDGa1JAw
+VEJx6nJxxMsCLCJvmZsD+YE8/DIBI6jjnjh8jagZVkxkSRPvUIxlZCxytIyqXI0t
+O8pLh8+8p5e0PgGb9OoszxEQZdBavsixdpe+0feU9cz0l0jJYx3W4ErZeCGGwNat
+UUiW0ctb3iz7BkNhhoV9zepxkSLzCf5zBeyA+WfD34028pAfPpyAfDYXF4x55sVP
+/3MdWGB6eU6KzPG2/QV/6or5E+C1yCMrnMy1ABEBAAG5AQ0EXuuCiAEIAMExiS4A
+u6FPSlMyjCaT8EfxP05ey79rYSSZd/ixmqyVzJkXYbf/SJCBeX9+NtWU3LEuL0L9
+WXgAA9Ys18NaJzBMC4kiQJfyXK6Kak7sUfZWWvx3Ad3It35X4svJNuR9GoqgsOvC
+D1SPgK7MfTcAF8e4j2UUqgRnjM5S6dRa6AH2s3bCj8GE+YSH9Ag2osNcKBgosNiv
+w04tYh+sjx8W5ehKaOEMrBDO8OMYVeiIEOvBIjsCZpJgAnOBPh/7zIQ72tPa9Ou3
+nAWBwdiPBgqv5FTIVmHWMfAJKRRCW4ri2hN6toHGrjJMgobtwW56vTibb82EGLdY
+3BF41DQT2MEiM1UAEQEAAYkBPAQYAQgAJhYhBB0Ki153xninxyREWr+YS0FF6hP3
+BQJe64KIAhsMBQkDwmcAAAoJEL+YS0FF6hP3VWoH/1Uhih+Q/iJIddvBatWdzpgO
+e03ppK9pCWZ2KepukILbR8bpX3cqUiTbFD3W+ybrrY0k4Oe9hXcm3re0N2GAfEWf
+tRknxXH0TMeyWoBlldfSM5DjrljM88XAIkk/T2wcARv1PC59IIZGKOpixItF5Pps
+YII4YzlripU98sXBTSlJLU1/UZaT7XNOZ9O1/PVxADpVIeH6MVdWh4W7AV/dYZ5j
+d31NbXDTtyDJBUYoiq2hu10+RNoqq28WmJQGD8aqIuKOpeBA8EirLcRoDGELSqYT
+lQyC8nl8P5PgkEZ5CHcGymZlpzihR3ECrPJTk39Sb7D3SxCW4WrChV3kVfmLgvc=
+=WqT9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BF984B4145EA13F7
+sub    84761D363E7B0FC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF7rgogBCADU9OwoEFdIgN5U0JU5pI7s3T1T1LeDMzAQ8l2Hq4jFrhnrjcEA
+ieDSut1YIv5NTBoZv4CrklaKvvQNUXPvKrFImA4OKhBodKV3wsq2efCATDGa1JAw
+VEJx6nJxxMsCLCJvmZsD+YE8/DIBI6jjnjh8jagZVkxkSRPvUIxlZCxytIyqXI0t
+O8pLh8+8p5e0PgGb9OoszxEQZdBavsixdpe+0feU9cz0l0jJYx3W4ErZeCGGwNat
+UUiW0ctb3iz7BkNhhoV9zepxkSLzCf5zBeyA+WfD34028pAfPpyAfDYXF4x55sVP
+/3MdWGB6eU6KzPG2/QV/6or5E+C1yCMrnMy1ABEBAAG5AQ0EXuuCiAEIAMExiS4A
+u6FPSlMyjCaT8EfxP05ey79rYSSZd/ixmqyVzJkXYbf/SJCBeX9+NtWU3LEuL0L9
+WXgAA9Ys18NaJzBMC4kiQJfyXK6Kak7sUfZWWvx3Ad3It35X4svJNuR9GoqgsOvC
+D1SPgK7MfTcAF8e4j2UUqgRnjM5S6dRa6AH2s3bCj8GE+YSH9Ag2osNcKBgosNiv
+w04tYh+sjx8W5ehKaOEMrBDO8OMYVeiIEOvBIjsCZpJgAnOBPh/7zIQ72tPa9Ou3
+nAWBwdiPBgqv5FTIVmHWMfAJKRRCW4ri2hN6toHGrjJMgobtwW56vTibb82EGLdY
+3BF41DQT2MEiM1UAEQEAAYkBPAQYAQgAJhYhBB0Ki153xninxyREWr+YS0FF6hP3
+BQJe64KIAhsMBQkDwmcAAAoJEL+YS0FF6hP3VWoH/1Uhih+Q/iJIddvBatWdzpgO
+e03ppK9pCWZ2KepukILbR8bpX3cqUiTbFD3W+ybrrY0k4Oe9hXcm3re0N2GAfEWf
+tRknxXH0TMeyWoBlldfSM5DjrljM88XAIkk/T2wcARv1PC59IIZGKOpixItF5Pps
+YII4YzlripU98sXBTSlJLU1/UZaT7XNOZ9O1/PVxADpVIeH6MVdWh4W7AV/dYZ5j
+d31NbXDTtyDJBUYoiq2hu10+RNoqq28WmJQGD8aqIuKOpeBA8EirLcRoDGELSqYT
+lQyC8nl8P5PgkEZ5CHcGymZlpzihR3ECrPJTk39Sb7D3SxCW4WrChV3kVfmLgvc=
+=WqT9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    012579464D01C06A
+sub    CB6D56B72FDDF8AA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFgnlA8BCACVtx3oLXcanfvwtMRwal6pLQ8IVMG9+fr4xGdbSHXCRNbosDa5
+agU7WeQMPhusSxJGaA3w7NOdjAwD/LeHADhDPeI6llJg1Fb3EyqH0NZaODKU/Or/
+dID/i1onAX1dE914J4lf3XvIAxGiAjmr3UvWO9RiFxRUkecMAMlCBp2FuHuvxkcn
+Mk8q9dP9Ef360wu8X5rj0kgP6vPhgl9/RhuPsUxlazb2Kn9Zxi/RmDKDiH/vDuwy
+WdRGFOR1OPV7l3Ws01nrs4vKd2v5rsUmsjvQ8ldxdrA1xzX4IszHRDgSC9PI8ItZ
+1VlbaKjE0L03acPfFTg/wRFSF5zsrGNbTmq1ABEBAAG5AQ0EWCeUDwEIAMGWqQT5
+ccT/Q1OypoOQGEZn+oRkgEdnzt8mjo7aOXd6pkNTkt3+LCkmb8Pp3/a3iYEfvSvB
+Zbb2JbY9xnmM8jBucWnow1iwEPxGhUuu3jlIpRsCwLk+utLkMALRkooXqanDoVRW
+xuVeFYN0as8nndgWiJT30innN4vfaR3x3E6/nS57zp5IggxZYsXTRHb25kaof9lg
+lHyXeypW7quKOP4SeES70PVVUnYZBlLpnX8a2msRtJiouWxCv/kHnYsjW62vc7nq
+vWAsSsfBT61TVx7yI9CckVFBnkpG1I8C9WpfcR+j9yauptgUMfrfDTFg3Aip7czM
+SoL4Jpu7jBcXy9UAEQEAAYkBHwQYAQoACQUCWCeUDwIbDAAKCRABJXlGTQHAapGT
+B/oCoCsuJ7617gpcuEAXxWTBfcXKo4z8ObBek2RUh0AY9aXjRYSzwwbtVFRC01Es
+r7R9b5ScY7W1TDQBKL0OSRZ3jwy7/hA7k8P7xAp3mC4+FdHaHMH8nGz2IbUjGWl3
+Yp01NRn4jc8gcnHnqcUff7PXsRMUtJ3dnbsIYOrBAbWKld07RVEQUyafgUfdF9cx
+e6P/slSZxATJrlIPveB5bgcVDMMw1UQNqJL9LWP2IM7xcljOBHY7jqwqnQ4pRER9
+2VzhLdtsdwF0H1SuERpDxBAuibchMoCfQ3HER+K2mTUoJ04xog7MQs2aaMwSbem1
+LMvNBZ/mfF7QMYfMV2n7rbIk
+=PoPV
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    012579464D01C06A
+sub    CB6D56B72FDDF8AA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFgnlA8BCACVtx3oLXcanfvwtMRwal6pLQ8IVMG9+fr4xGdbSHXCRNbosDa5
+agU7WeQMPhusSxJGaA3w7NOdjAwD/LeHADhDPeI6llJg1Fb3EyqH0NZaODKU/Or/
+dID/i1onAX1dE914J4lf3XvIAxGiAjmr3UvWO9RiFxRUkecMAMlCBp2FuHuvxkcn
+Mk8q9dP9Ef360wu8X5rj0kgP6vPhgl9/RhuPsUxlazb2Kn9Zxi/RmDKDiH/vDuwy
+WdRGFOR1OPV7l3Ws01nrs4vKd2v5rsUmsjvQ8ldxdrA1xzX4IszHRDgSC9PI8ItZ
+1VlbaKjE0L03acPfFTg/wRFSF5zsrGNbTmq1ABEBAAG5AQ0EWCeUDwEIAMGWqQT5
+ccT/Q1OypoOQGEZn+oRkgEdnzt8mjo7aOXd6pkNTkt3+LCkmb8Pp3/a3iYEfvSvB
+Zbb2JbY9xnmM8jBucWnow1iwEPxGhUuu3jlIpRsCwLk+utLkMALRkooXqanDoVRW
+xuVeFYN0as8nndgWiJT30innN4vfaR3x3E6/nS57zp5IggxZYsXTRHb25kaof9lg
+lHyXeypW7quKOP4SeES70PVVUnYZBlLpnX8a2msRtJiouWxCv/kHnYsjW62vc7nq
+vWAsSsfBT61TVx7yI9CckVFBnkpG1I8C9WpfcR+j9yauptgUMfrfDTFg3Aip7czM
+SoL4Jpu7jBcXy9UAEQEAAYkBHwQYAQoACQUCWCeUDwIbDAAKCRABJXlGTQHAapGT
+B/oCoCsuJ7617gpcuEAXxWTBfcXKo4z8ObBek2RUh0AY9aXjRYSzwwbtVFRC01Es
+r7R9b5ScY7W1TDQBKL0OSRZ3jwy7/hA7k8P7xAp3mC4+FdHaHMH8nGz2IbUjGWl3
+Yp01NRn4jc8gcnHnqcUff7PXsRMUtJ3dnbsIYOrBAbWKld07RVEQUyafgUfdF9cx
+e6P/slSZxATJrlIPveB5bgcVDMMw1UQNqJL9LWP2IM7xcljOBHY7jqwqnQ4pRER9
+2VzhLdtsdwF0H1SuERpDxBAuibchMoCfQ3HER+K2mTUoJ04xog7MQs2aaMwSbem1
+LMvNBZ/mfF7QMYfMV2n7rbIk
+=PoPV
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    858FC4C4F43856A3
+uid    J. Daniel Kulp <[email protected]>
+uid    J. Daniel Kulp <[email protected]>
+uid    J. Daniel Kulp <[email protected]>
+uid    J. Daniel Kulp <[email protected]>
+uid    J. Daniel Kulp <[email protected]>
+
+sub    594E23256A36A392
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+B8ab72h8ySjaeEd9kV96ByEtpm09
+=OErs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EB380DC13C39F675
+uid    Mark Vedder <[email protected]>
+
+sub    BB09D73166EEF1AD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+V3Y=
+=gTWy
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EB380DC13C39F675
+uid    Mark Vedder <[email protected]>
+
+sub    BB09D73166EEF1AD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+V3Y=
+=gTWy
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5F7786DF73E61F56
+uid    Ting-Yuan Huang <[email protected]>
+
+sub    73F7734B17EC71F4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=v4+t
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5F7786DF73E61F56
+uid    Ting-Yuan Huang <[email protected]>
+
+sub    73F7734B17EC71F4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=v4+t
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D5F4C07A434AB3DA
+uid    Egor Andreevici (My key) <[email protected]>
+
+sub    9D49CFE20A7A3EE7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Umx6zyOUi5AfW8LWHwPYuk2dkLY=
+=KXp1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D5F4C07A434AB3DA
+uid    Egor Andreevici (My key) <[email protected]>
+
+sub    9D49CFE20A7A3EE7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Umx6zyOUi5AfW8LWHwPYuk2dkLY=
+=KXp1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1669C4BB543E0445
+uid    Emily Johnston <[email protected]>
+
+sub    5F6BA89D4B0869B9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=wp39
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    99CE9D9F22DC5C99
+uid    Benjamin Gehrels (used for *@gehrels.info) <[email protected]>
+uid    Benjamin Gehrels <[email protected]>
+uid    Benjamin Gehrels (My Jabber ID) <[email protected]>
+uid    Benjamin Gehrels <[email protected]>
+uid    Benjamin Gehrels (Used for *@gehrels.info) <[email protected]>
+uid    Benjamin Gehrels <[email protected]>
+
+sub    6C907406A9482E08
+sub    B2581403B6FA2318
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+vyI+RlHq3tcMp5tjpfuk7+E=
+=gZhQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    62C82E50836EB3EE
+sub    2AC7BF2F3349DE80
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+egz57oSj4I+NT33hA64x6jicEKyBNxNI
+=T3Bh
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    62C82E50836EB3EE
+sub    2AC7BF2F3349DE80
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFeOGY0BEADIr99yL4ahwgM3KB7zMVzDk/PEkzUWpm1BSxqUxuQtzWArFj13
+Y3Zi6g1tw5jKESfxtmpXx7j7xR3qVdJbsYJMU0zQi+FehwnKox3Go3UnIKt7kydz
+CGowsRjmEuLErftU6QCDof4Xpum/IPFgu3mcQK3dp+EL2sJDDBahz52DF5bxcSZw
+4OawjX13pnjaPHGw7iWt/fhMEDRmlr6c158lTpEMGpIHH4cum/QTFW1xRf2osjbk
+RysnD/e2QMTwnm05WdImBQq0PQGU3Scz6HQr06UAWyaaukp+k9nZD//hZ7t68w5Y
+wHxHcpFI7JTxesRTv8PNgG5+EC61O2fxMgAefDv9UwhUpYDfxtc0yJYz0QTfNQQB
+RTd8Os6J3OjExDnUFUtPN0Xvgl/SzfCIbxmr/mKqWLzazJMiuNs6mfASrYVuYERl
+c8Gm5TXRU2Pg55KeL6iDAyXDuObKvmqYKb8qXM/qba+RI+KOhBLPSMfWVw5nziVL
+XY6sjXHLIyM1AfDfeM0DHReDR4aIkdnQ4yzyzshmhTodguDbZe2H1FlPNqzriS6c
+4s7CoyO8tTTSHmrxkVLJhMaTc1XazhcQrsp/1s6SJ5MUy0rFUt9QyIt8zfGqzQVH
+pqXmFZd+ISd8Eivsyh5gEU4JER+3J7kSuMQx/wMMZqzu1RczUz4gI0nzTwARAQAB
+uQINBFeOGY0BEADaPmufkJ3ZMMpXhbkBISnPYW/2QGIU0mtwGOO13PnkxFGn4bFI
+es0459axyzMAT2DiOF+cOh0R38DJN9r3ZZFgjAuiy0WTaHyFuON9Ebm3uDLN/VrC
+laXhHI2BxzcYC+uCAor/zJRytD36Cxq8c20NqqQqqq/p7mMDp5S0EjoDpuvXQ55w
+vNmH8dwqu1WBgSYbv+R52fzmQfy7OktbU/mvzkSaxnfqTiLDr2ZkAZcZjgURFvGr
+OB262jvFQ6iTj0ATCrj+xauvpazAAP3z0EgUyegFOHQX/VjA8zqJgMF7d8WcKfzG
+xohxIck7ozOXmcroLzUPLb/i8riDOftXqUcKIkuWD0vtpMVytXYG5RUAo24ypGjm
+Bmvyjy5EkPlc/Yys7Bja/tUKG6F7pcZep0OHTT5bWHUyfvC621cc0RODMC0jCOHb
+MJCetcMBtoPioGBhpjZGrGp6qXfTBg/HmvNgPfWgLDdnBL8iE7aq+Ob/PcnodIGm
+tzAskUhpzNqhtDNbkHV7GDxdlzb3ktZMBGwYgeCal6YzwF76gqlLDy9LQlc/KVme
+A//xB8TAOMEP/qrlGgNJV7kohcvY+4drpTf1MyL3zpZZvD275+sdkL/tjzV8ow95
+ggVesGRDrxvcGvbsS/saKQxf7iwaZyShaNNTCqm+131UWizvVN+enO30ZQARAQAB
+iQIlBBgBCgAPBQJXjhmNAhsMBQkHhh+AAAoJEGLILlCDbrPuA7wQAITWcr3QPf5O
+c7JLjJP+KY93Nis1SXz/fVeFtb8J4FanXfHXE1qkwi84Wm2JsQwi+4gPjt7Ou5Uz
+no7kUHKlCtHsPmQOxnkZSosfwi1l77d5gyLEhlbLwWeahM/YDLg17Z4l/BtKED+y
+A28dNhj+na4zf5zHHKT+KanqlyMAKxrqExwS3OMcBz3MBpjTjhsyHhPuJDgCumvJ
+cc0EnU4A/L2pjX7mH3qGNstlATi5xG8PEJe33N75bcYzTm2ebL0YvqH1P3PEmsPy
+G931P6FRSwDnXXCFRpyjZjTorPQaBYRDtUqaro2LfW93YlFdd51kXhiEP19CkrJ0
+GMHbl30dx2WbBCMJpojYfarTMcD8W9VXnJaFj3r3gq83WIux4q0IO1cQkvzVZHB+
+HA85ufWk+lDwxmWbd3qVI/36uP/2o1E37LGVX6k3PmaGTQTj7LzZ4dHK5kjV6Z0n
+24SdWW8X5iB2vhnmAG5cTxQ93uQpy55Y+WLuQ0T4G7vc70nudNsNnGw/i1Ij6UCN
+vMk0CpWLzwLMzJ16sxv9U3LGsJbkYU2xLF3NLpKhgHpeXwoOBlBmk9TVeRqXPnWK
+R9uFRTPm2NRfi8JR4nk8l9f93O92HyfvZmKCQGvlU638CuV/+g078eb4AnCiNSch
+egz57oSj4I+NT33hA64x6jicEKyBNxNI
+=T3Bh
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    F1F111AF65925306
+uid    Luke Hutchison <[email protected]>
+
+sub    EF375EEBBDEFD775
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFS2J+0BCADZI8RYk32YeO9gnEkY9RN+4dKb+H1AR4v+IGxmy0UYy+O8bo4m
+YzkQHTlPpEPGe10/quKk1embDifEfNa9mwcSJl+XUPFlTrSA97SR31mdyK/Ua146
+GKMW0F6v8aCgLUlm9BCJo/OmOat2jsc94SuKnPiRRywhmapte/8o9t7/0GghqLyj
+X+Ifz4WSKyKZ8oe9mRFg1ZIA+z52a8QnfyI8WS8bpGHM/dXkBXZpzIDlrfKvoZYb
+I2DcbOotJK/ZzStAZ81e4E/q2BEw96NUKJC5X+G8qahEFNJDcJz33UAxLiTFqWmw
+iKLqy8oL8p9qPYlx0IAXoW/GxV7E0rBoA95pABEBAAG0JUx1a2UgSHV0Y2hpc29u
+IDxsdWtlLmh1dGNoQGdtYWlsLmNvbT6JATgEEwECACIFAlS2J+0CGwMGCwkIBwMC
+BhUIAgkKCwQWAgMBAh4BAheAAAoJEPHxEa9lklMGaJIH/jjzVBHF28G+gYmktFGh
+zhclmHsEvfqNEgaWkjyUOVTlccA5Ej+8GWrumWqX9PJbHoZVJWeVikkjFsTltspx
+bQkIv+hygvqIyMBJLks32pLUCXlWrxOnTFTljWzPhy3TMeBzE5Zgt8YhHwyuLGRu
+roOnYz/1VDY5SHB8ST37VAr4lZdwslAwW8RLXAXfQfbKnMCwjNBZf4FmllZk6GWM
+3YyaTuWtQN0qEJ7y1BZJYZwKC7EFGk4viTuoU3gFC5uI6idcmFFBWxgYmnkbQilc
+akbBGU7qhsTyyAWxPlKZg7ldQoLFrZgoO9CAdmLLzbCyPM0w3MpPa4Szw1nyJb5r
+Qjm5AQ0EVLYn7QEIAMde+nVUcozJy9dzLCUpn91SCoWld/wTaSckxTnVMcr4uNLl
+JI/2PFjMb9ya91grr1yuwqSG3jE8P0Qdk9Bi6t6NkMIGUSJuzyIipsDDWaiCfjWx
+s7seFd9c+rgcH6r9CaUbNRfUrPqEZSeL+RDwIIz1gQkXmosF94DjZHP9abZYObH1
+/Or64CSRD8Ocf6kTRndwJOZkRdDtUX5NPFSiU17E/DoEkyryuXMR+Ci0b/hjQ4Jn
+riGeyy6c0StWQUW18SEYPV0j3VyRRUcOLhJajEu8KU4Xaaxgb/2X7o/BosjjQ8BP
+PUdTz2wRluU/1tKUQ8D+O8QH7dCR3lJt76kKWbsAEQEAAYkBHwQYAQIACQUCVLYn
+7QIbDAAKCRDx8RGvZZJTBvJ/B/9vrvZR1pFqDfux/ezze7ovgYF3jkxfQj3Hqgx1
+GvLYdvNacZiJG1bfGRuoEvLPv8lPIfEBTSqJGxzRiEl33eUUXlatI20Dh4oeRYUE
+70hCfqRn7cqITJ7nXwctMZGtwSLduNa4+cjKdSaWq6kffpQVSLrjvJYyxk8td+Nv
+CLYiTDnyybAmSGge44RppDjwGsQ+9X8wyd5b9hwcBQOY4UTm/6RPDJF66KPlPaU2
+qy8NeQB5AcO6goAdGI9WwOJuxg9IzULwpCvRYB0chLKkGOBh0vuyQbHoRmI6gs2K
+/I3i0q8Df30ObL7oBALsr2QfkkKatq4qx+xU7QMdeMs8STRj
+=CCVw
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    F1F111AF65925306
+uid    Luke Hutchison <[email protected]>
+
+sub    EF375EEBBDEFD775
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFS2J+0BCADZI8RYk32YeO9gnEkY9RN+4dKb+H1AR4v+IGxmy0UYy+O8bo4m
+YzkQHTlPpEPGe10/quKk1embDifEfNa9mwcSJl+XUPFlTrSA97SR31mdyK/Ua146
+GKMW0F6v8aCgLUlm9BCJo/OmOat2jsc94SuKnPiRRywhmapte/8o9t7/0GghqLyj
+X+Ifz4WSKyKZ8oe9mRFg1ZIA+z52a8QnfyI8WS8bpGHM/dXkBXZpzIDlrfKvoZYb
+I2DcbOotJK/ZzStAZ81e4E/q2BEw96NUKJC5X+G8qahEFNJDcJz33UAxLiTFqWmw
+iKLqy8oL8p9qPYlx0IAXoW/GxV7E0rBoA95pABEBAAG0JUx1a2UgSHV0Y2hpc29u
+IDxsdWtlLmh1dGNoQGdtYWlsLmNvbT6JATgEEwECACIFAlS2J+0CGwMGCwkIBwMC
+BhUIAgkKCwQWAgMBAh4BAheAAAoJEPHxEa9lklMGaJIH/jjzVBHF28G+gYmktFGh
+zhclmHsEvfqNEgaWkjyUOVTlccA5Ej+8GWrumWqX9PJbHoZVJWeVikkjFsTltspx
+bQkIv+hygvqIyMBJLks32pLUCXlWrxOnTFTljWzPhy3TMeBzE5Zgt8YhHwyuLGRu
+roOnYz/1VDY5SHB8ST37VAr4lZdwslAwW8RLXAXfQfbKnMCwjNBZf4FmllZk6GWM
+3YyaTuWtQN0qEJ7y1BZJYZwKC7EFGk4viTuoU3gFC5uI6idcmFFBWxgYmnkbQilc
+akbBGU7qhsTyyAWxPlKZg7ldQoLFrZgoO9CAdmLLzbCyPM0w3MpPa4Szw1nyJb5r
+Qjm5AQ0EVLYn7QEIAMde+nVUcozJy9dzLCUpn91SCoWld/wTaSckxTnVMcr4uNLl
+JI/2PFjMb9ya91grr1yuwqSG3jE8P0Qdk9Bi6t6NkMIGUSJuzyIipsDDWaiCfjWx
+s7seFd9c+rgcH6r9CaUbNRfUrPqEZSeL+RDwIIz1gQkXmosF94DjZHP9abZYObH1
+/Or64CSRD8Ocf6kTRndwJOZkRdDtUX5NPFSiU17E/DoEkyryuXMR+Ci0b/hjQ4Jn
+riGeyy6c0StWQUW18SEYPV0j3VyRRUcOLhJajEu8KU4Xaaxgb/2X7o/BosjjQ8BP
+PUdTz2wRluU/1tKUQ8D+O8QH7dCR3lJt76kKWbsAEQEAAYkBHwQYAQIACQUCVLYn
+7QIbDAAKCRDx8RGvZZJTBvJ/B/9vrvZR1pFqDfux/ezze7ovgYF3jkxfQj3Hqgx1
+GvLYdvNacZiJG1bfGRuoEvLPv8lPIfEBTSqJGxzRiEl33eUUXlatI20Dh4oeRYUE
+70hCfqRn7cqITJ7nXwctMZGtwSLduNa4+cjKdSaWq6kffpQVSLrjvJYyxk8td+Nv
+CLYiTDnyybAmSGge44RppDjwGsQ+9X8wyd5b9hwcBQOY4UTm/6RPDJF66KPlPaU2
+qy8NeQB5AcO6goAdGI9WwOJuxg9IzULwpCvRYB0chLKkGOBh0vuyQbHoRmI6gs2K
+/I3i0q8Df30ObL7oBALsr2QfkkKatq4qx+xU7QMdeMs8STRj
+=CCVw
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    012579464D01C06A
+sub    CB6D56B72FDDF8AA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFgnlA8BCACVtx3oLXcanfvwtMRwal6pLQ8IVMG9+fr4xGdbSHXCRNbosDa5
+agU7WeQMPhusSxJGaA3w7NOdjAwD/LeHADhDPeI6llJg1Fb3EyqH0NZaODKU/Or/
+dID/i1onAX1dE914J4lf3XvIAxGiAjmr3UvWO9RiFxRUkecMAMlCBp2FuHuvxkcn
+Mk8q9dP9Ef360wu8X5rj0kgP6vPhgl9/RhuPsUxlazb2Kn9Zxi/RmDKDiH/vDuwy
+WdRGFOR1OPV7l3Ws01nrs4vKd2v5rsUmsjvQ8ldxdrA1xzX4IszHRDgSC9PI8ItZ
+1VlbaKjE0L03acPfFTg/wRFSF5zsrGNbTmq1ABEBAAG5AQ0EWCeUDwEIAMGWqQT5
+ccT/Q1OypoOQGEZn+oRkgEdnzt8mjo7aOXd6pkNTkt3+LCkmb8Pp3/a3iYEfvSvB
+Zbb2JbY9xnmM8jBucWnow1iwEPxGhUuu3jlIpRsCwLk+utLkMALRkooXqanDoVRW
+xuVeFYN0as8nndgWiJT30innN4vfaR3x3E6/nS57zp5IggxZYsXTRHb25kaof9lg
+lHyXeypW7quKOP4SeES70PVVUnYZBlLpnX8a2msRtJiouWxCv/kHnYsjW62vc7nq
+vWAsSsfBT61TVx7yI9CckVFBnkpG1I8C9WpfcR+j9yauptgUMfrfDTFg3Aip7czM
+SoL4Jpu7jBcXy9UAEQEAAYkBHwQYAQoACQUCWCeUDwIbDAAKCRABJXlGTQHAapGT
+B/oCoCsuJ7617gpcuEAXxWTBfcXKo4z8ObBek2RUh0AY9aXjRYSzwwbtVFRC01Es
+r7R9b5ScY7W1TDQBKL0OSRZ3jwy7/hA7k8P7xAp3mC4+FdHaHMH8nGz2IbUjGWl3
+Yp01NRn4jc8gcnHnqcUff7PXsRMUtJ3dnbsIYOrBAbWKld07RVEQUyafgUfdF9cx
+e6P/slSZxATJrlIPveB5bgcVDMMw1UQNqJL9LWP2IM7xcljOBHY7jqwqnQ4pRER9
+2VzhLdtsdwF0H1SuERpDxBAuibchMoCfQ3HER+K2mTUoJ04xog7MQs2aaMwSbem1
+LMvNBZ/mfF7QMYfMV2n7rbIk
+=PoPV
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+/x9PJbkJSwWj3BCUK98Giw5/tdG3Ib1y
+=OVOn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9C4F7E9D98B1CC53
+uid    Benson Margulies <[email protected]>
+
+sub    32E3DF6FC5E91334
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+4Q==
+=gGyT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9C4F7E9D98B1CC53
+uid    Benson Margulies <[email protected]>
+
+sub    32E3DF6FC5E91334
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+4Q==
+=gGyT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    44CE7BF2825EA2CD
+sub    E01173141D06B1BF
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEzQQMUBCACbwbw7tuTWgwPsDAdQTWGO355jP75oBLHwGgEwV+OCKtxkNXNw
+wrJqXst83vmD1dEJyHflQww+d+Olj90IefQGfR+K7O005C2nky7eNGIomxaP52Y/
+90+tmw8qtsI4nsPWPuVj4WdFvlFgUwIZ0SmX4CauVzg0Ris8f0taxg7PH9zEvICs
+G/WAXdB9em08WDD6ruhMAvDF4W8Yy7mpGmdWiFD+B9OC006tv+GzYAvUHRFeCnnT
+SoKRiBeLejW+t4kpdMnEfC9ILAYBEEjNYvBIyPdPKBwNfy0yjRebsUf0eNmjGTpk
+VPlfofjVaUaOZytUOQvntYpocMX+377DGQIdABEBAAG5AQ0ETNBAxQEIANp35mwg
+ILWWQI36F2SyWFTFF8zupjzqlcF4Vx1Mjs2rQYErv1qs09TJfO+uxPRAva0fKik9
+PFmZ0vLM7UAveZgaknzjTQveOaAJuT5OjudoyptG81ilHO66+e9RnuyV6gSINnt6
+wnq4n8KRPoEmI/nxMhvmBCPw+YmxG3ZcU5Zko4GtjLA4J01nag7jY+LH08qFfPcK
+sADmx7EtCRuBcXgQ202kF3o7BjULcLV3R8vni3jp5nljH0vJG5USSY2ZR1bFiLtT
+CMO8cm+jIuay25iWil5DaejASIXzbzTtSYg9Skxet29AWjlrt1+zKZsMSLPbKJ6q
+hdW5XNU4Qo9ycx0AEQEAAYkBHwQYAQIACQUCTNBAxQIbDAAKCRBEznvygl6izZwg
+B/4gOqGHc0Cc165PZggwbf1nyJZ+af0QiKWasgoUzo4a7OSIISmBYPGnW/VP4EMs
+aNEhnqWK3Tu+cuidW6z7MWHRsqLcvYUKeiZE2IhnMP85ad2S14UOHE8cbkLwfIGe
++rIu+zYpzyc5bcRYqeLvd5Dk1H/eW0/hsadW9qpSWQRGxWPEsMqaAhiret0ntlGH
+2igswZ7SYNYLNtK78wppFqqFHfFvnVu1XNmiTDDuk2IokPIGRjeWO59eSR/kotg0
+zox4S+CJbRdQdPq2ofDNqKCIEtg6y4yM+dc7c7n1Txk53fMBMzXfGnLGfbTFLo1h
+pYdC5sepAZA1XWLRgZ3+5+vD
+=HSWu
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    44CE7BF2825EA2CD
+sub    E01173141D06B1BF
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEzQQMUBCACbwbw7tuTWgwPsDAdQTWGO355jP75oBLHwGgEwV+OCKtxkNXNw
+wrJqXst83vmD1dEJyHflQww+d+Olj90IefQGfR+K7O005C2nky7eNGIomxaP52Y/
+90+tmw8qtsI4nsPWPuVj4WdFvlFgUwIZ0SmX4CauVzg0Ris8f0taxg7PH9zEvICs
+G/WAXdB9em08WDD6ruhMAvDF4W8Yy7mpGmdWiFD+B9OC006tv+GzYAvUHRFeCnnT
+SoKRiBeLejW+t4kpdMnEfC9ILAYBEEjNYvBIyPdPKBwNfy0yjRebsUf0eNmjGTpk
+VPlfofjVaUaOZytUOQvntYpocMX+377DGQIdABEBAAG5AQ0ETNBAxQEIANp35mwg
+ILWWQI36F2SyWFTFF8zupjzqlcF4Vx1Mjs2rQYErv1qs09TJfO+uxPRAva0fKik9
+PFmZ0vLM7UAveZgaknzjTQveOaAJuT5OjudoyptG81ilHO66+e9RnuyV6gSINnt6
+wnq4n8KRPoEmI/nxMhvmBCPw+YmxG3ZcU5Zko4GtjLA4J01nag7jY+LH08qFfPcK
+sADmx7EtCRuBcXgQ202kF3o7BjULcLV3R8vni3jp5nljH0vJG5USSY2ZR1bFiLtT
+CMO8cm+jIuay25iWil5DaejASIXzbzTtSYg9Skxet29AWjlrt1+zKZsMSLPbKJ6q
+hdW5XNU4Qo9ycx0AEQEAAYkBHwQYAQIACQUCTNBAxQIbDAAKCRBEznvygl6izZwg
+B/4gOqGHc0Cc165PZggwbf1nyJZ+af0QiKWasgoUzo4a7OSIISmBYPGnW/VP4EMs
+aNEhnqWK3Tu+cuidW6z7MWHRsqLcvYUKeiZE2IhnMP85ad2S14UOHE8cbkLwfIGe
++rIu+zYpzyc5bcRYqeLvd5Dk1H/eW0/hsadW9qpSWQRGxWPEsMqaAhiret0ntlGH
+2igswZ7SYNYLNtK78wppFqqFHfFvnVu1XNmiTDDuk2IokPIGRjeWO59eSR/kotg0
+zox4S+CJbRdQdPq2ofDNqKCIEtg6y4yM+dc7c7n1Txk53fMBMzXfGnLGfbTFLo1h
+pYdC5sepAZA1XWLRgZ3+5+vD
+=HSWu
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    280D66A55F5316C5
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFOOGVgBCACiDwUZOc6943aBGUrxikkfUnsyZfHtF9jihYmA1pSgfsye+JxR
+oG9QWW9+3qx4L/d4ZEqBftTWpsjyrY7NyMaeXtJEjE0vhiWNehgXB1z4XTJ66zCX
+nhlMvixGLQtfZANqCxOmtUGoSXw+oRFY/SExAioSS19HlSxApSaUzc0prdujqp9k
+vOKKIBWTBIUELdDTA4+enfzkAnIINUX9LcMTmO+Fh0AvfjDbq4fr8rBglyVUSCqt
+TOT4oGZlbpsq9TOKrTXh5go0rm5KJcbgKvX78ZErK6pcpTgNA+XFXCz1rQ9nkIQt
+HxWaEMJtpSkIvHIBz9qoAroGtNFzz2oF4ElRABEBAAE=
+=1QGy
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+uid    Marc Philipp (JUnit Development, 2014) <[email protected]>
+
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qw==
+=iceo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9C538D5A79281639
+uid    Alec Strong <[email protected]>
+
+sub    81176177BB514041
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF3xPHMBCAC7OXU5uXXKttUU/BwWm6q08NBC3ybk0fNIfoITWiFA1RtxO7S3
+K4ijImBnLLb7ivjpTtIWzUwFAfSZHc3LgS/TBQJQ2PGsO4/AdaMAcs69irgfoPYY
+1sJkR/Iw/C1gi7KV8PR/vwIE5N6wVll42FMGjBvKl7wTmvuHDou12tANXWJp3X3M
+5qj4eMK5fIv11u0vPIsmBHQTPzZN6prxAEp8Dm3XDT7OCZxfCYsy1Rl6zUIY01ai
+/lOk6YAg6IjHqGyChlJnhQbmvu4kNrRiKRSElikiDDra1Ltj66AGD86O2yQ/21ha
+muWwm0GWkl1gd3k3BOy7EhvDTAE3RFi4f6TVABEBAAG0IkFsZWMgU3Ryb25nIDxh
+bnN0cm9uZzIyQGdtYWlsLmNvbT6JAVQEEwEIAD4WIQSbvBw+QIygnPdtGgKcU41a
+eSgWOQUCXfE8cwIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCc
+U41aeSgWOWEcB/9tOXz5kHKjfZOFKjP8v6lmDZfpJmt1oFngOLVm/fjqMrP1M47w
+cTCershV8DW2LWIoAh7p5w4/9c6Uaa48YptT5JqAQ4G21Fy0P2bAZ90uDYRxoY0m
+ybXiH9lwTWgrj7X38HBZfZthRT2THLWXYlYhbsxQ3s5Kfj0gdAN1R3IMm+C5bjxe
+n3X7fCcShwbb+rX0yCH8uUT/kjVJU0KQHXwih6QcknkK5pIpBfLRgukAf/qYY73b
+K+lUBXBxxiYUGc+ydQi0huEpNOTNokOh9PB30wBwccrLPLeWrpakGpUlNv3gZ/sI
+cHXWDtBB2g8KxKESfWzoroMq6y+XXe3ubjE/uQENBF3xPHMBCADGJu/jqEe5/eot
+oS3YqaBATQPZyKgYisyA94Ivo5ZrRGwVACW3aWbzeGdGGr3AazWmvhfMovSp5Iuc
+yFTvjIQwlNetAXHuZUi5sN4I8o0sDPER7Y2RqBfZcvU98CgTziJe85iEy1Vx0NVJ
+OSd55ZeLtEjeQbF0MNljrU4j4jqt/NR20C0DrJ+tgH4tGuo7n3AWmCSwzoXRrzEJ
+dkqf9IWXww21MjmOYGEOSClUA9L6HxeVrZX8IauV1eVeDNyTUbC5eVAhV4/8TiMM
+6KbBRUsPzW6TXbo2HTAtRPsvzM2ssC3QWV4aafLBN7MadK51ZKD1ZeNnbPvxGWrL
+XDVaXDZvABEBAAGJATwEGAEIACYWIQSbvBw+QIygnPdtGgKcU41aeSgWOQUCXfE8
+cwIbDAUJA8JnAAAKCRCcU41aeSgWOZNrB/0UbtDXcjpzehkR73Xc8dj8DLgwMANh
+5Jr/dHf/ZENXOIORuN2uWg0Dai0mZ+gPC0jb2qNK0MdTbHRNHPEcS0UX6wDBX0Bc
+BcbW3nesQXv4LYJY2DN8Q0vtxj2Ra/4FfxT+lZn3A3BmHRu+Aps9nmJoGOh06ThO
+e+6KezHnYmmo8IDzS3JuyGz8ma29Qem71VDAMlLNg0QUN3RJc7nSLdwoLUDJWmpm
+WXmOR1JD0iewyjuSmKHuizRPPNVMbg9R+eMPF9OECheR+Pseu3XTqCyqedEDItwb
+htywBZaReIkxE3VIhM7CEI9gsVAaNgoe6Q7BXIk3WMDpo3t6JWORF/PE
+=EwZF
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9C538D5A79281639
+uid    Alec Strong <[email protected]>
+
+sub    81176177BB514041
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF3xPHMBCAC7OXU5uXXKttUU/BwWm6q08NBC3ybk0fNIfoITWiFA1RtxO7S3
+K4ijImBnLLb7ivjpTtIWzUwFAfSZHc3LgS/TBQJQ2PGsO4/AdaMAcs69irgfoPYY
+1sJkR/Iw/C1gi7KV8PR/vwIE5N6wVll42FMGjBvKl7wTmvuHDou12tANXWJp3X3M
+5qj4eMK5fIv11u0vPIsmBHQTPzZN6prxAEp8Dm3XDT7OCZxfCYsy1Rl6zUIY01ai
+/lOk6YAg6IjHqGyChlJnhQbmvu4kNrRiKRSElikiDDra1Ltj66AGD86O2yQ/21ha
+muWwm0GWkl1gd3k3BOy7EhvDTAE3RFi4f6TVABEBAAG0IkFsZWMgU3Ryb25nIDxh
+bnN0cm9uZzIyQGdtYWlsLmNvbT6JAVQEEwEIAD4WIQSbvBw+QIygnPdtGgKcU41a
+eSgWOQUCXfE8cwIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCc
+U41aeSgWOWEcB/9tOXz5kHKjfZOFKjP8v6lmDZfpJmt1oFngOLVm/fjqMrP1M47w
+cTCershV8DW2LWIoAh7p5w4/9c6Uaa48YptT5JqAQ4G21Fy0P2bAZ90uDYRxoY0m
+ybXiH9lwTWgrj7X38HBZfZthRT2THLWXYlYhbsxQ3s5Kfj0gdAN1R3IMm+C5bjxe
+n3X7fCcShwbb+rX0yCH8uUT/kjVJU0KQHXwih6QcknkK5pIpBfLRgukAf/qYY73b
+K+lUBXBxxiYUGc+ydQi0huEpNOTNokOh9PB30wBwccrLPLeWrpakGpUlNv3gZ/sI
+cHXWDtBB2g8KxKESfWzoroMq6y+XXe3ubjE/uQENBF3xPHMBCADGJu/jqEe5/eot
+oS3YqaBATQPZyKgYisyA94Ivo5ZrRGwVACW3aWbzeGdGGr3AazWmvhfMovSp5Iuc
+yFTvjIQwlNetAXHuZUi5sN4I8o0sDPER7Y2RqBfZcvU98CgTziJe85iEy1Vx0NVJ
+OSd55ZeLtEjeQbF0MNljrU4j4jqt/NR20C0DrJ+tgH4tGuo7n3AWmCSwzoXRrzEJ
+dkqf9IWXww21MjmOYGEOSClUA9L6HxeVrZX8IauV1eVeDNyTUbC5eVAhV4/8TiMM
+6KbBRUsPzW6TXbo2HTAtRPsvzM2ssC3QWV4aafLBN7MadK51ZKD1ZeNnbPvxGWrL
+XDVaXDZvABEBAAGJATwEGAEIACYWIQSbvBw+QIygnPdtGgKcU41aeSgWOQUCXfE8
+cwIbDAUJA8JnAAAKCRCcU41aeSgWOZNrB/0UbtDXcjpzehkR73Xc8dj8DLgwMANh
+5Jr/dHf/ZENXOIORuN2uWg0Dai0mZ+gPC0jb2qNK0MdTbHRNHPEcS0UX6wDBX0Bc
+BcbW3nesQXv4LYJY2DN8Q0vtxj2Ra/4FfxT+lZn3A3BmHRu+Aps9nmJoGOh06ThO
+e+6KezHnYmmo8IDzS3JuyGz8ma29Qem71VDAMlLNg0QUN3RJc7nSLdwoLUDJWmpm
+WXmOR1JD0iewyjuSmKHuizRPPNVMbg9R+eMPF9OECheR+Pseu3XTqCyqedEDItwb
+htywBZaReIkxE3VIhM7CEI9gsVAaNgoe6Q7BXIk3WMDpo3t6JWORF/PE
+=EwZF
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6EFF5EF5523052D4
+uid    Thilo Schuchort <[email protected]>
+
+sub    E2F840B227D3C024
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF2ClL8BCADs2bbaF1ZMiMkTUUb59NTlyAbOOVWoIh7cnKeNjMWBUTP0kLFI
+XpoKiyccQLP4rFdbP2yI6h+LJR0Kj/lJmKpCaAooNlooxfIyPUX5TMvDTRutzwBO
+c38DafLBAJTUl5BMYsbWTGSvmpC3/qmZ9uJAQH6BVEQxmGNO6jpPsgi/YA2AhrN9
+w1F5Pm5Capc8QQ9fEj+AohXGtpOA6aMhnPLjJ45h0VEwYskRIva0AoqbM660YVi7
+HZPNEqspOtmCrR5yzvRmlDmQQ4uKp4InSQ2Sz0OMw3G9cuZy5AzfAL+/SG+iL626
+S1UeIGAjsCu2GGIFDVRuj4KvfmUZz1H/US5DABEBAAG0LFRoaWxvIFNjaHVjaG9y
+dCA8dC5zY2h1Y2hvcnRAZ29vZ2xlbWFpbC5jb20+iQFUBBMBCAA+FiEEKk9V2c2l
+h3cx++dGbv9e9VIwUtQFAl2ClL8CGwMFCQPDI+EFCwkIBwIGFQoJCAsCBBYCAwEC
+HgECF4AACgkQbv9e9VIwUtTFBQgAt+ZETCausF/UT43FRFa2Pkp+gXnuvY+pSiiS
+lqSP7BvVOvTFnYtljLLufK/O74/MJqGYbiyurNA6Zrhe3yMjQqCQlYGuGBeo8Ssg
+0RC+Z4NJPEyTwrx5XYYLaDyeRMcQwV2pH6sWXc86TZg+6gBWBHrvb1PDBFqd89hd
+UY0xI9Vyc4VWTpJCshX9qA+Bjh0xzmxie7leZo7ejF5L0ymPuROZz9VquxORHyE7
+DAqaKesgQVbmOb1Lc5Vpdy70IIVlscyLIfFycTra31cnxPZsb6Iak6sed5VFM5pc
+9qYiLsNk4FyzEs7w2nmlDjE06jmWWY0So76q2IddcNYeKSggV7kBDQRdgpS/AQgA
+0x3w8TNxkGuXMEXxDcRIXQ54KRF4upy8P1exrJPenVutDAvNJeHLxc/uwrAfPGcR
+/DIJCWLbQv0T36WwjQSpW+VBxX41I5/YRrp1BRqUtT1r9Fx5KodpG+c0Nsjs2qSu
+ju+/9RI5Tyu+fO+bgYfuOfPq1E9H7POHu33Gz5Fap7ZB7VmRPw5uAOU2ev67Qq+d
+cfcKsbh0TUwkErGdzp5HpcspEtHxoQCpc6ZX5Ttoj5FS96vN/VIOnvwgVjxNMEme
+CjwHkcXJkkcFGwkJC2lpZx7y/Uv5RPjeKLoJoKKHofRutL723mGORe/uj/0pYfLy
+gfwtaT9kmsWZbZwNCrCuQQARAQABiQE8BBgBCAAmFiEEKk9V2c2lh3cx++dGbv9e
+9VIwUtQFAl2ClL8CGwwFCQPDI+EACgkQbv9e9VIwUtRRxwgAjqQpC4OL0igysJgI
+xcSUAdltJ080Po9eUcrxszIakH3fYeuN+vtKi37NbTI8BxltbXDZC3JxF2Vqxkqi
+6ow6ZTk3NMS0R42DvkBjO4DGvpIF1F+4rkiF5+w3CJHHyEJYGvBt4MGQ2Ivrp1rs
+C/VKazgG7Bkl160msMq5TMUAvVOuTn3pMljVUcsQLDxK8vAvaI2iox3dOtWj0w0r
+dc3OWmufCl7W/RDicP1Xrodm2QrHZXftDEMr6qB+HvkesWCnc/yqCuCr1UXqsTsJ
+5291U3pZ0RCl8aTFwloSctwwQvGxWxT4uXD1beqJ1tGKyoB1kzhwXnzuCBrzCcmY
+h3cm1w==
+=WIxE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6EFF5EF5523052D4
+uid    Thilo Schuchort <[email protected]>
+
+sub    E2F840B227D3C024
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF2ClL8BCADs2bbaF1ZMiMkTUUb59NTlyAbOOVWoIh7cnKeNjMWBUTP0kLFI
+XpoKiyccQLP4rFdbP2yI6h+LJR0Kj/lJmKpCaAooNlooxfIyPUX5TMvDTRutzwBO
+c38DafLBAJTUl5BMYsbWTGSvmpC3/qmZ9uJAQH6BVEQxmGNO6jpPsgi/YA2AhrN9
+w1F5Pm5Capc8QQ9fEj+AohXGtpOA6aMhnPLjJ45h0VEwYskRIva0AoqbM660YVi7
+HZPNEqspOtmCrR5yzvRmlDmQQ4uKp4InSQ2Sz0OMw3G9cuZy5AzfAL+/SG+iL626
+S1UeIGAjsCu2GGIFDVRuj4KvfmUZz1H/US5DABEBAAG0LFRoaWxvIFNjaHVjaG9y
+dCA8dC5zY2h1Y2hvcnRAZ29vZ2xlbWFpbC5jb20+iQFUBBMBCAA+FiEEKk9V2c2l
+h3cx++dGbv9e9VIwUtQFAl2ClL8CGwMFCQPDI+EFCwkIBwIGFQoJCAsCBBYCAwEC
+HgECF4AACgkQbv9e9VIwUtTFBQgAt+ZETCausF/UT43FRFa2Pkp+gXnuvY+pSiiS
+lqSP7BvVOvTFnYtljLLufK/O74/MJqGYbiyurNA6Zrhe3yMjQqCQlYGuGBeo8Ssg
+0RC+Z4NJPEyTwrx5XYYLaDyeRMcQwV2pH6sWXc86TZg+6gBWBHrvb1PDBFqd89hd
+UY0xI9Vyc4VWTpJCshX9qA+Bjh0xzmxie7leZo7ejF5L0ymPuROZz9VquxORHyE7
+DAqaKesgQVbmOb1Lc5Vpdy70IIVlscyLIfFycTra31cnxPZsb6Iak6sed5VFM5pc
+9qYiLsNk4FyzEs7w2nmlDjE06jmWWY0So76q2IddcNYeKSggV7kBDQRdgpS/AQgA
+0x3w8TNxkGuXMEXxDcRIXQ54KRF4upy8P1exrJPenVutDAvNJeHLxc/uwrAfPGcR
+/DIJCWLbQv0T36WwjQSpW+VBxX41I5/YRrp1BRqUtT1r9Fx5KodpG+c0Nsjs2qSu
+ju+/9RI5Tyu+fO+bgYfuOfPq1E9H7POHu33Gz5Fap7ZB7VmRPw5uAOU2ev67Qq+d
+cfcKsbh0TUwkErGdzp5HpcspEtHxoQCpc6ZX5Ttoj5FS96vN/VIOnvwgVjxNMEme
+CjwHkcXJkkcFGwkJC2lpZx7y/Uv5RPjeKLoJoKKHofRutL723mGORe/uj/0pYfLy
+gfwtaT9kmsWZbZwNCrCuQQARAQABiQE8BBgBCAAmFiEEKk9V2c2lh3cx++dGbv9e
+9VIwUtQFAl2ClL8CGwwFCQPDI+EACgkQbv9e9VIwUtRRxwgAjqQpC4OL0igysJgI
+xcSUAdltJ080Po9eUcrxszIakH3fYeuN+vtKi37NbTI8BxltbXDZC3JxF2Vqxkqi
+6ow6ZTk3NMS0R42DvkBjO4DGvpIF1F+4rkiF5+w3CJHHyEJYGvBt4MGQ2Ivrp1rs
+C/VKazgG7Bkl160msMq5TMUAvVOuTn3pMljVUcsQLDxK8vAvaI2iox3dOtWj0w0r
+dc3OWmufCl7W/RDicP1Xrodm2QrHZXftDEMr6qB+HvkesWCnc/yqCuCr1UXqsTsJ
+5291U3pZ0RCl8aTFwloSctwwQvGxWxT4uXD1beqJ1tGKyoB1kzhwXnzuCBrzCcmY
+h3cm1w==
+=WIxE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    98FE03A974CE0A0B
+uid    Kotlin Release Key <[email protected]>
+
+sub    CC3328A2F49A80C8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFhlXQUBCACoN2nTeSRVZnGoktKHyiCgeYQ/hEKKKDDAbWubnnQwonCTILaN
+Qw3GmIT6plmi9iy4rl+rJprSzDeQDZngQCx1KPYcXCrrc0pnjERDaogw9fC3c3z2
+B6+90qT6UJSTNmxMs5zbhgzKDWb3eaDmVDqVqzsM5xz9GxX6zo83o37fTFSbVbtA
+9+c100+KaAldVL/6uLeGoQsAIxtMH8GiOPiSjrw+XCQ5mbP6e+oYYBKxEyAgu1XW
+8jP4bF0rz2+1lkIGfWfYHZmMbmSutDxXqOXA9cZomhOayOSe+iczoxXkVXkQzMxq
+bG4ru5CHxPh+RSfpwA+9StLvzLeoFrBUlqW3ABEBAAG0KktvdGxpbiBSZWxlYXNl
+IEtleSA8c3VwcG9ydEBqZXRicmFpbnMuY29tPokBOQQTAQgAIwUCWGVdBQIbAwcL
+CQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEJj+A6l0zgoLPTgH/AkH+uBwgQhS
+xIfYNA/pEt+ni0eGtjClsFtFF89jjQQAAOMsflebvBmGB/ptpfAEp2QYqRiGX8Mz
+3cRYwa8JcwEVWbN8BrXSgtS3P5zlzBJNPSJJFqpXENxs0VOLZUd63ZbDgQ3h1DDt
+lP7VwsIlF/ogq/wql6gC4qdP9c/kA57eqvZeMrflSUCIUlN2XkeMZhGugWd/Juee
+kz8qMRXY/kEKGbojJkmrehLKOsFz/L8vOW9TLskFuYBIb9PHf2hqLFOOQ3z4o/NN
+fgrOGQVZxM4LWIsUMkO1hRiIdk6R0jLEdFJIOS0z7mGqKzODWNOVegPNhjUX1E7E
+viyo727zBJu5AQ0EWGVdBQEIAKNt/VhkI5bXMxoM2XYMh9MPz67sAaqc9Eixan/O
+ONftycStOVHB0YhfQ9lsNeLIb6qQvvesktI1exv18wxSpN+AEwroMGDSDfixhpga
+eOGzj8omXOTBZ7Bv73A+4dCVeoQ1F/ss4OkRK7Jx5jLM7TuY7IG64XSYy6D6QvMO
+oIxKdqB81f6JYDzVwszFvUUbDqVQIfhXcuCLAbYxtJVVzAldGBWR/72Uq8nE3ere
+eeZjHniADawU+XR2Egv1aMDvP8zUpWl2mRzOKA+1SJyXhA569435s604PfxPdESl
+KnMYlinWZNvL5rrRV15vYYU2u59ol/g27DOFy33UCrCgZ4EAEQEAAYkBHwQYAQgA
+CQUCWGVdBQIbDAAKCRCY/gOpdM4KC2NwCACTClhcW6GbsRaRHzSdnXDPUNlWf0UD
+Pz0amNp8mQwsygL+jW0awtrfxxSqbv+1myMQB7g6tLFGcTH+jqfkDsN2rpQ2/cnr
+UVmunMjkCnoSyhrqolSv9ow0L7K+FERmxq5QGorE/Gya87oK38ovXZmGUs79OGSt
+AeEnXXkta+dDlX3nyTGM52HEaabPJRv/eMoryZPgv86ahajMUxbc9LdjkdVnwj+x
+a5Ux6ZVuPGHeodq+MWTZuKM//qT9uXbOsgiKWJ1E3YPy4Ip7kc4ne950WGndzu/O
+3aBldqsxUstQ0abZXtAVj1j2Io/Jgvt9btE9i0ssfGT8HCatMFwsfi98
+=2z1p
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    22E44AC0622B91C3
+uid    Cedric Beust <[email protected]>
+
+sub    BFE9E301CD277BAF
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFpqN94BCACaAb8Afmng1QPu5k5uzLoA1FJnF6Wf31ZU1FzDxHFHLNUYSWN2
+Bg6k95QH5ruZ+Z/QOJSoIB+b3htDklyxd8m+G2KsMIqnQs0BaTN18hb3PFyMIknM
+YWkkTPF3nVV9APk73AebTAcd2V1GB7xOP+L3T7tyUcB9/7bDeM3od6qPksdVGNMA
+0S32U8SNhe4jw8uXKdFL6PSxgyg9yeu0V7DyR92V9jF+ZicZWxaLeKpf/Vn3MBX8
+JdePR9SCJc8CNj0n/tsvg/aSmGZ3OMZTUYYvrtfgpXUw0WVkyma+T0ANcdDN91uZ
+P8lV3o+Ic8f15xwsTePDhMhmtOapIz/85ukFABEBAAG0H0NlZHJpYyBCZXVzdCA8
+Y2VkcmljQGJldXN0LmNvbT6JAU4EEwEIADgWIQTHC4RPAC8h9tK5yHUi5ErAYiuR
+wwUCWmo33gIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAi5ErAYiuRw5Md
+B/9ajI8dvk0oUaenxcPCchWQ6pwA2B5w9yQVWQBoJbxMI+pvEqpS6ur7PI+bJ0or
+rCyNLiNj/okFuU6yeh9g8eeKIR3984HtBAkGo59TtH9kTg3HDZF2ys5j+tdtcb3r
+KrGafc41llryb4XTGiLjcCS4n6q1EmZIJjCwvt1sIO1fo3cBim/1kjhjMgXSpiYz
+yB+ve1NaG+f//nfallAnryxFHVfk2/N373cNZTD9bV2FRZs9SSO2mO9BoyG8deSF
+x89lwLxK7MeoSH6pAioMMRGoZhNz2Thb9voUjrqS3P3+auwPt//JbhmCR3Zg+upu
+n6Aw5q67aj4V959Qra3ZpD/TuQENBFpqN94BCADAfXydE1VYais6o/4JpVQwk9JL
+3r2hkgwfN68B2rRvw9ofXZoqaBCFgbw+Nvz15GLmONoiDvP4rb1TsaT2Ti/hTUb3
+ov2W1RJ6OFRmiSkOuOjZHlVslYF2fPlZEXWdJ9PWvoKM/3taaICXy/AVSm1NBera
+1l2MsJ1ePr6dpMMDBjUU15rzWm3WOqwBNE34whhOjvU9vDl8u4h1xV96E5B47ZbV
+B1pR6y3vSYQgwj6BYkp3Uz2Mg3GQ/nBFoNuwV/F7LiUb5W68wOe8Q98NuREh1ico
+/OM+iudjP2LO0vz2sGe6X5UZGwCfbJnlq/fqoPhiyW6HPb1+JHU08kKeY5BJABEB
+AAGJATYEGAEIACAWIQTHC4RPAC8h9tK5yHUi5ErAYiuRwwUCWmo33gIbDAAKCRAi
+5ErAYiuRw+XKB/0ToXO2daY6/ZlkfK69O8jRBzbhn90/2dePM/qLy5Fe3UaG2sge
+uFYbTMGbRPvCpn9E5bceczdhkJKqEj5dPHVhUU6+jeyH/DdDgrcP12SQR2vHg9hR
+e0pzVouiMDX4QnUbW09CwpmhymlIp3pXb5jNa4iNxjYIBmuHDEmMP+uW5Ue+e2lg
+IAFWRFovZ9C1DCg0YYyGktc47cakq3ENKNU2LFvRcbgoyfjM0EprSUColUUNN3yy
+UNc+I+bvGL5swhKqdnRHagbg7kelsn/05oDFGPQHi0/VOlWU7wBh+vUw6lb3Zi7C
+obUInUhW3rPu5LubTOtT+oIH7+RSUIEJO1hE
+=j2aw
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    22E44AC0622B91C3
+uid    Cedric Beust <[email protected]>
+
+sub    BFE9E301CD277BAF
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFpqN94BCACaAb8Afmng1QPu5k5uzLoA1FJnF6Wf31ZU1FzDxHFHLNUYSWN2
+Bg6k95QH5ruZ+Z/QOJSoIB+b3htDklyxd8m+G2KsMIqnQs0BaTN18hb3PFyMIknM
+YWkkTPF3nVV9APk73AebTAcd2V1GB7xOP+L3T7tyUcB9/7bDeM3od6qPksdVGNMA
+0S32U8SNhe4jw8uXKdFL6PSxgyg9yeu0V7DyR92V9jF+ZicZWxaLeKpf/Vn3MBX8
+JdePR9SCJc8CNj0n/tsvg/aSmGZ3OMZTUYYvrtfgpXUw0WVkyma+T0ANcdDN91uZ
+P8lV3o+Ic8f15xwsTePDhMhmtOapIz/85ukFABEBAAG0H0NlZHJpYyBCZXVzdCA8
+Y2VkcmljQGJldXN0LmNvbT6JAU4EEwEIADgWIQTHC4RPAC8h9tK5yHUi5ErAYiuR
+wwUCWmo33gIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAi5ErAYiuRw5Md
+B/9ajI8dvk0oUaenxcPCchWQ6pwA2B5w9yQVWQBoJbxMI+pvEqpS6ur7PI+bJ0or
+rCyNLiNj/okFuU6yeh9g8eeKIR3984HtBAkGo59TtH9kTg3HDZF2ys5j+tdtcb3r
+KrGafc41llryb4XTGiLjcCS4n6q1EmZIJjCwvt1sIO1fo3cBim/1kjhjMgXSpiYz
+yB+ve1NaG+f//nfallAnryxFHVfk2/N373cNZTD9bV2FRZs9SSO2mO9BoyG8deSF
+x89lwLxK7MeoSH6pAioMMRGoZhNz2Thb9voUjrqS3P3+auwPt//JbhmCR3Zg+upu
+n6Aw5q67aj4V959Qra3ZpD/TuQENBFpqN94BCADAfXydE1VYais6o/4JpVQwk9JL
+3r2hkgwfN68B2rRvw9ofXZoqaBCFgbw+Nvz15GLmONoiDvP4rb1TsaT2Ti/hTUb3
+ov2W1RJ6OFRmiSkOuOjZHlVslYF2fPlZEXWdJ9PWvoKM/3taaICXy/AVSm1NBera
+1l2MsJ1ePr6dpMMDBjUU15rzWm3WOqwBNE34whhOjvU9vDl8u4h1xV96E5B47ZbV
+B1pR6y3vSYQgwj6BYkp3Uz2Mg3GQ/nBFoNuwV/F7LiUb5W68wOe8Q98NuREh1ico
+/OM+iudjP2LO0vz2sGe6X5UZGwCfbJnlq/fqoPhiyW6HPb1+JHU08kKeY5BJABEB
+AAGJATYEGAEIACAWIQTHC4RPAC8h9tK5yHUi5ErAYiuRwwUCWmo33gIbDAAKCRAi
+5ErAYiuRw+XKB/0ToXO2daY6/ZlkfK69O8jRBzbhn90/2dePM/qLy5Fe3UaG2sge
+uFYbTMGbRPvCpn9E5bceczdhkJKqEj5dPHVhUU6+jeyH/DdDgrcP12SQR2vHg9hR
+e0pzVouiMDX4QnUbW09CwpmhymlIp3pXb5jNa4iNxjYIBmuHDEmMP+uW5Ue+e2lg
+IAFWRFovZ9C1DCg0YYyGktc47cakq3ENKNU2LFvRcbgoyfjM0EprSUColUUNN3yy
+UNc+I+bvGL5swhKqdnRHagbg7kelsn/05oDFGPQHi0/VOlWU7wBh+vUw6lb3Zi7C
+obUInUhW3rPu5LubTOtT+oIH7+RSUIEJO1hE
+=j2aw
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BCF4173966770193
+uid    IntelliJ IDEA Sign Key <[email protected]>
+
+sub    C9F04E6E2DC4F7F8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFKneXIBCACtnX3ZQmPujf6ocvdnhsBheze71DSl34TfebyW2Qt+g9NhMxo4
+DaJy+iFNnsaMwLZRr6k/qf+ISE3A4opWAQlbk+Wb5s6DPPA2cHH6W4GdkxtuJzqt
+tFn6YtkFhA15Aahr/vz31NBjUJlBmO4PwvkyxiF/MYP6TQ/AHar4xP1RxSYEPcCi
+dIQczQ8nXzya4OqOyTfibeGz/eiHHuwTLHi3Rd2kihQnlRQdhE1rmm8uTyzFe1H+
+P7WW7kQgygW6yxQ3J+DXrG8kG+nbe57ZY1oyv3F/fOBxzn/kuoKHZ3JJEMJmTIrT
+Lr1ngCZApgteAynRHk4t/SYZiyoyqZCuBcwHABEBAAG0RUludGVsbGlKIElERUEg
+U2lnbiBLZXkgPGludGVsbGlqLWlkZWEtc2lnbi1rZXktbm9yZXBseUBqZXRicmFp
+bnMuY29tPokBPwQTAQIAKQUCUqd5cgIbAwUJEswDAAcLCQgHAwIBBhUIAgkKCwQW
+AgMBAh4BAheAAAoJELz0FzlmdwGTIqEH/AsyCUbhP0m7BJRULiYIWyB1WHK0L8cm
+yLid5X1P6VrktgcRbTMEzn4t08eeqb978P+GHp79xgBU6EQ+2IYiyeeAedZ/m6Lt
+Kv6imJsFPXZO3BLeNfwIzPC8QXdrkyVqU0vG/pSdULyBpc1aGNEK7Hr2dY5vQTX/
+sUrlwxDEH3LCmOnIgilf/M927Gelond9VmUh14HqCqtybv49XQiMUdkVkXmzKNld
+QQk+O24XbnSGOknPW2sADDglwoMu8EZTkZGdetgM/8X9PTBWWd9pEV32AnoYNMtd
+d2ujH+4i7AhH+Kbmn+zWYBQv3J3yQWj/dmFlOa/SFilLmmAtBEgl7wm5AQ0EUqd5
+cgEIAL3PEOztIFUibB6FYEkObVhsDbCnHw9yO5MAvAWB60Ohf1J4T9QK63jZ5/Ci
+qcDrw+uab9I+Ruz/SgGyFS0UXAkwfTICUdhT5kUzZmGyoj2ul+iFDP9uUdEgSgyX
+XakrxBbBPzNaMx8+GyIXRVFyRTH7+1gWgPQsdN1sGYOgZ+f8TMzAv6sxu0JVzjKX
+AAbXdiZTyJh9d6h1jS5Icilu8vRwn3Qc/ZzstBRk+eLbb69wS9YGoUlzYvDBz+5t
+iNwvHUriKc6zVT4Edngcr0mKWTdvD+AsvZffU0XK+vxbgMuRWi/51qb+VgK2gFeA
+seV6a+D1059u2+5Pn3h/Fv/vRAEAEQEAAYkBJQQYAQIADwUCUqd5cgIbDAUJEswD
+AAAKCRC89Bc5ZncBk0qgCACdP8kyUZVqfncA2RsQH38NFYhBz5MAEOIhCm7qwPC6
+XG08CUZfpPXdUbxZGUliE6vhfj7rZbvUKKHlcHDPobdTJqGof2jt2MfsjJ18JY0e
+xSWuVTmNmqAC3gsiMfEGIqjQFWonfm0Od4AvduLuc0TPkyfr0gobakgYvhDjk7eQ
+vgC1QfKlk6hHA/OAFW774qaQsyrANrFevRa7CBQEob6V6N8aV1vNxgl8a6fJzPTN
+BOOmP0mq7xk6nykQuqYTVFyqfXN0p1bbTxHBoW/fvdizi7zMSsuBkWUtfG1wyN70
+uoEQzSQwqgWCIaddzrPZPmaZ8CtzzyB7+JdSNItBB2Sp
+=3tsV
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    42575E0CCD6BA16A
+uid    Taro L. Saito <[email protected]>
+
+sub    47624A56526BF2F2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=6Iv0
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    42575E0CCD6BA16A
+uid    Taro L. Saito <[email protected]>
+
+sub    47624A56526BF2F2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=6Iv0
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B57BD58EF6D0A713
+sub    781D1F35916E0113
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBFsZf3oBDADUgeJsq9asQLaUajkGON9KmxKBtJS+IbGa0jgvx37T4LDigKS/
+wh4axvdJ0mE31uXKitBVDkr5TptyxA0jojYwlt5YLXsotnskdHrIg35Q8xpMp72K
+BfBsqtnfdmBUd/oBZEKgxMM2Pl/VZ+1wmF+KnyToSWuy4Q+9d88ame+8Jdq5ELJn
+zWZWYhwE3c2Y8t62VGzXeZg9Zz747Qt0ITl02//ufoR8aLdb+8uLuidNktyoqpt2
+UG8oLr8mgOAaOn6npN81FbteIWCEcuGewCjiiYTHGpA13JmToDDUfopWYGJirkSI
+dYjP4fZBu4aryHKwXt/zsiD7rzbHrn821CAAZKGptVVu9IfqD3jCBhJilGmkWw+j
+IozAd33hLvlCnH8miXRnGPyNT5T481qbi09wOnQEUYrXBe1zOvBAEVxwSLcNcxe5
+/2gRDbSNU9NJst994hzofSyxA/3X/CDiOSHDKdAcOglgqfpistQIS68FqDGo4eIS
+WeR3S583Two98+UAEQEAAbkBjQRbGX96AQwA5IIECRfqpRDQKsgEYdDMzEYED5i4
+w8GrkqK9Bl2KErI6WQmuBnZaHr71bMrYFS8duUOYetasTKCxjU/Ps0THuOmTnuLv
+Am6PCkpzJ+qBNM4jf5sxHflcb1jRUQ/R+qoWOsWcwJhOw2OgNONHhW8/2mAs+5Zz
+ThWe4cL62YRK3CeWdWphwcUSGx+zQo5vYBZzIbdQ+E+c7aRyc4qEPfyGNccAJRdQ
+eW1tAWydmf+QIYGMbANWNPXm+g80wE5xCA9wwU7N26Rk0zn6e9+lSy8e+l6+hsNh
+uNxWxDDBubF8YMuzD4q+VM4dOOsAJARtp6HW/0mBTcTD5BEOqnDd/aRsNOrR9Cbk
+K4nU1aSrYOeOby8jc7Zu0SnYC6g+JXalt0jtDEGVaxY9IMIe6AcIJhSXlgllK87b
+YX+t4uVXYFb10QfxRj1oduBQEHJkCovsi3EIIl5a4XyoGdNUGn2IgWg+C0RXrcb/
+KDrg7iakp9SwXP0xBSbcNiwE/3C3Xom0l3ijABEBAAGJAbwEGAEKACYWIQQit59F
+awb051uLV521e9WO9tCnEwUCWxl/egIbDAUJA8JnAAAKCRC1e9WO9tCnE/ydC/9g
+6xJK/aIvvKLSraYfS90XamIyUqNgAyXgivWn0jqaTwoz27HG/hRgWR85q72vZ4qV
+vYwx06S8WHMijKMcI5fBtEL318c9V6Y8Pl7jwSOy5yN0k8IFA+TzqHGXVvPcuCwH
+TQAvvP/9v2d7ZrOiH7urM0eoRDXj7Tq+K4rLjeVIHALLEhqBT8w8LGBOEZUAwS7t
+aaGrURVuhO80QW2gJAoG5AU1qMUkzFsTXBsRTcwPP25FIPYClXPNsMR+2iVZAZ1e
+3yBqQkwRlymU3gPGY3M+TOyplfoYIJy6oT2ri0wYa2jeNdo6eEmLUjNAbpdiIEop
+ruzQLLaT7PUk+RU1UFVHjV0rgrXrTYvdgKyI4dX2yGlTTmnq94eaxMOsMxkHAGBh
+GrOJpBDWzJKXX48WAdi/4WpnhOD6N1BOrvWq9QWIU2374WutAX09dt1kBG3m4kGR
+STHuixCePH/e8n89lWDXSsqkV/+imzi75cTN9RWBT1mRltc4jNQ0B2WwUgrTSPo=
+=yiE5
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B57BD58EF6D0A713
+sub    781D1F35916E0113
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBFsZf3oBDADUgeJsq9asQLaUajkGON9KmxKBtJS+IbGa0jgvx37T4LDigKS/
+wh4axvdJ0mE31uXKitBVDkr5TptyxA0jojYwlt5YLXsotnskdHrIg35Q8xpMp72K
+BfBsqtnfdmBUd/oBZEKgxMM2Pl/VZ+1wmF+KnyToSWuy4Q+9d88ame+8Jdq5ELJn
+zWZWYhwE3c2Y8t62VGzXeZg9Zz747Qt0ITl02//ufoR8aLdb+8uLuidNktyoqpt2
+UG8oLr8mgOAaOn6npN81FbteIWCEcuGewCjiiYTHGpA13JmToDDUfopWYGJirkSI
+dYjP4fZBu4aryHKwXt/zsiD7rzbHrn821CAAZKGptVVu9IfqD3jCBhJilGmkWw+j
+IozAd33hLvlCnH8miXRnGPyNT5T481qbi09wOnQEUYrXBe1zOvBAEVxwSLcNcxe5
+/2gRDbSNU9NJst994hzofSyxA/3X/CDiOSHDKdAcOglgqfpistQIS68FqDGo4eIS
+WeR3S583Two98+UAEQEAAbkBjQRbGX96AQwA5IIECRfqpRDQKsgEYdDMzEYED5i4
+w8GrkqK9Bl2KErI6WQmuBnZaHr71bMrYFS8duUOYetasTKCxjU/Ps0THuOmTnuLv
+Am6PCkpzJ+qBNM4jf5sxHflcb1jRUQ/R+qoWOsWcwJhOw2OgNONHhW8/2mAs+5Zz
+ThWe4cL62YRK3CeWdWphwcUSGx+zQo5vYBZzIbdQ+E+c7aRyc4qEPfyGNccAJRdQ
+eW1tAWydmf+QIYGMbANWNPXm+g80wE5xCA9wwU7N26Rk0zn6e9+lSy8e+l6+hsNh
+uNxWxDDBubF8YMuzD4q+VM4dOOsAJARtp6HW/0mBTcTD5BEOqnDd/aRsNOrR9Cbk
+K4nU1aSrYOeOby8jc7Zu0SnYC6g+JXalt0jtDEGVaxY9IMIe6AcIJhSXlgllK87b
+YX+t4uVXYFb10QfxRj1oduBQEHJkCovsi3EIIl5a4XyoGdNUGn2IgWg+C0RXrcb/
+KDrg7iakp9SwXP0xBSbcNiwE/3C3Xom0l3ijABEBAAGJAbwEGAEKACYWIQQit59F
+awb051uLV521e9WO9tCnEwUCWxl/egIbDAUJA8JnAAAKCRC1e9WO9tCnE/ydC/9g
+6xJK/aIvvKLSraYfS90XamIyUqNgAyXgivWn0jqaTwoz27HG/hRgWR85q72vZ4qV
+vYwx06S8WHMijKMcI5fBtEL318c9V6Y8Pl7jwSOy5yN0k8IFA+TzqHGXVvPcuCwH
+TQAvvP/9v2d7ZrOiH7urM0eoRDXj7Tq+K4rLjeVIHALLEhqBT8w8LGBOEZUAwS7t
+aaGrURVuhO80QW2gJAoG5AU1qMUkzFsTXBsRTcwPP25FIPYClXPNsMR+2iVZAZ1e
+3yBqQkwRlymU3gPGY3M+TOyplfoYIJy6oT2ri0wYa2jeNdo6eEmLUjNAbpdiIEop
+ruzQLLaT7PUk+RU1UFVHjV0rgrXrTYvdgKyI4dX2yGlTTmnq94eaxMOsMxkHAGBh
+GrOJpBDWzJKXX48WAdi/4WpnhOD6N1BOrvWq9QWIU2374WutAX09dt1kBG3m4kGR
+STHuixCePH/e8n89lWDXSsqkV/+imzi75cTN9RWBT1mRltc4jNQ0B2WwUgrTSPo=
+=yiE5
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    CB43338E060CF9FA
+sub    C59D5D06CF8D0E01
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DEWnnCsLSDubW3nXYsAeK/6d
+=/Ri5
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    CB43338E060CF9FA
+sub    C59D5D06CF8D0E01
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DEWnnCsLSDubW3nXYsAeK/6d
+=/Ri5
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+uid    Kevin Wooten <[email protected]>
+
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG0H0tldmluIFdvb3RlbiA8
+a2V2aW5Ad29vdGVuLmNvbT6JATcEEwEKACEFAlVB0KACGwMFCwkIBwMFFQoJCAsF
+FgIDAQACHgECF4AACgkQR9z8Kln1m1tCNwf+MaNFqR4lezA6ebkpZ4vIKGPoCOAx
+b0zEXgKPUIsqiH3R0oYzkTqrhm85w9cwJDnPKISg/uoP6gKqJIFIwjSVWO9ESg7w
+SSXKpHZTd34XaqrBWS102btT3wi0PwRs7Bl098jgKmtFT2AhctwZfh1gULHGjHYp
+tOK4KuDch6gYoJ4h01rxMZ6vkO6IWT5rjkgl8SYbjHMsffl1/eLMpS7UvA9S6xIF
+JLxI1+/+5gg2M6VRAgMFZXujstoKOym6t/8ayZbz3HNA9Sw01vJiMYXmWoNn6Gj4
+nxxCtsorIcTW9qzGubnoDGR/DkUlux7QZrEl84A3/f4Z9SWfZ7u8aTuqsLkBDQRV
+QdCgAQgA7kQawwfOhqatOWR4JvWROpgk3TQE9QJGKOPkIlkaxTws0cyap4idMcZo
+RETVqXCpFiWcwVqwDbThQUhJx36EGn3P4mByNN2wLYw05fN4nofiuM708v7hG6SV
+2DcsYHyKXT6dc7pZDWSyCtEMv03ST93rTPaGjM+X0lj7gBgODyYLAtHcAgOuAFkD
+ZU2k1CfGWnm06QZ8Uj+EBf6fGp0sc9aySGQx9asyV6pVa+tksLuJVCsHesT7Up01
+cwtbBQsfSDh4eAuYemqNiHS0H8EI8PEozwsDdmJYtXwGyoP0rvXojv3v0pgrJgfs
+cJsyPrc7ajsWWMMP/HsPQr6DV4OcUwARAQABiQEfBBgBCgAJBQJVQdCgAhsMAAoJ
+EEfc/CpZ9ZtbLAsH/14uJWhG6mxG28lIaWqsNbv6fcRFVBK182n2ZziTZR9zvgqv
+dFZCX4mJA14JtbPV7SMl4Jt5wCcj+lrL2Zg9ywCspGXDp9gDRczYeG4uZHOUOuP1
+sF0QHtjUPCl4vrzcgo9BHx40tg83Yqkl4684Jk1GsXGmjX9krndXpYpZxjqvZEy+
+UcrlzfBwAxMiFWPbHxRaUyAlJADF87AC83CythCne8+MwnR51gNwX6VB9e5G8CJh
+KI79Ml4Nxu9bshJivTH4X1hHy1WZ4RTpYh9+QiX/mUWpESL/3MHE258/4t4kSmmZ
+uibIH78M76e5PfyVjZBdAdgcuQBYGJ0p9c7qSM4=
+=/5Qn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    80C08B1C29100955
+uid    Jake Wharton <[email protected]>
+
+sub    CF771F914C2A4A73
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBE2fCWARBAC3v9wYo5kmynmVP+43ccamidflSLQjjpsXpSDLPFokGxeuw0OC
+QJy46m8b5ACoCqRlfwnRRcEHxiSlaBATJA6hi7NRO41R39C62JXsIxNJR16JNQ5k
+oG/NOAraw0E1RQIFslznQexfxPg4yFIVrsFp1wkpCRrCklatPMNap2DuNwCg7PWJ
+1vV93YIsaH0O2fnXz3E+6zsD/3cTzUWuySEDiCLNO3JYJm97v4NDQ93encP1Ooxh
+n+PSIP4GvjrAObh3FfWUucv8UGqcw5bAL7dA1z8SgKeyFk/afs2XofXdvC+PhZqC
+DwU0NiE0D/tDWqX0qIG4ezTU2uk+5dE/WVl3R10nOBgquQdWIdYKGfV4FNTiEduD
+Uw7fA/0XcwFom7eyR9eBonQmgIadljztm4gkv11lY33V1ZfJNndPKNzwevDwX+om
+/VEHvpEfPx5toD4H523BPx55ZtfowuMtFHZI718alpCo3h6xaDhGwXvsg3s9k03k
+rfxzCjf9qcJX1gb2JVZ2+2jCwUDQZeEwV2vivjGNiN9rShWW+7QkSmFrZSBXaGFy
+dG9uIDxqYWtld2hhcnRvbkBnbWFpbC5jb20+iGAEExECACAFAk2fCWACGwMGCwkI
+BwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCAwIscKRAJVQoeAKDLeCOKKnt5aqlHD/7+
+QPOgX4iYPACgvGRCubBztEBkU2xXbr9J2cQY5em5Ag0ETZ8JYBAIALeU4dgFKEn8
+b3E1LUT25svvUUX2kuVLQ5TzokC6zjWQrPehOlsYx+ey8RSN/6A5rBLtn1z75ror
+F3+vN5kLPAz8x2Th6Cxd6lvn3DQHfvDL0YHlp0AZzhHx5ogyJxdaqwzNy0JWxava
+FGN6b8bbrR1Nf08kq/d5dNe+NGVdBXcuqUo6jt1W+tkbntklS5e+B9/Q/4L8dYkl
+8xXRIMAuKw6h8j4LFXse6xndWeWtTIkfZImz0f7cLQV5X7QSv90i1KfzT9hLiUjp
+wqPydtTNuB6+gda64jFNhVcvgW+h7MH6FT/zSss2Jh2eDR4HFrv7EJSS8dKCvPox
+y8El8pQMG/8AAwUIAIXq+ryw44voH/IdbvTQtK4t5/lp/Oj9b7QrMR3u/iQxM4K3
+dq7rUbA8hjdMM3gfMu13B4pzGtpcf25b4NIIQkhES9+CUDQDYHF+gwkrwEascbdf
+YZiLAHtcMjW1Og+IhTY8wDuJT4I1pqumSzWV8UxVJctqNUTY2eU7158oD5+prdCc
+eQLbzxoKFtu056kZ2+46v6bAl8g/w8WoVORUuHruuvKohMVPHwNQws7KHCFy9YCr
+4yIQfqC8g8oITqlgUZcZaXx6K+NndwA6LAoXJL0edaZOZBuFq5H7Fkrw07+OIQFq
+LTGcFpR12AzDh9lmtyJQ8nVfb6IjAOSwBPlEZWSISQQYEQIACQUCTZ8JYAIbDAAK
+CRCAwIscKRAJVd58AJ0YA8xv0U5Odm8u21BvyxjGS3tBZACggF6P6KjhUPpIAYTS
+6v3TtzhkJdo=
+=Zirr
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0374CF2E8DD1BDFD
+uid    Sonatype, Inc. (Sonatype release key) <[email protected]>
+
+sub    F2E4DE8FA750E060
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+pA==
+=OkOT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0374CF2E8DD1BDFD
+uid    Sonatype, Inc. (Sonatype release key) <[email protected]>
+
+sub    F2E4DE8FA750E060
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+pA==
+=OkOT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3C27D97B0C83A85C
+sub    4BC7B9A81C39EBA0
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBGEdX1MBDACuRDzoPMh3CyUHQydFo363R6OdXqMZ8mJQMdysIJCXOXZGRwUC
+uyPOUfH6uSG24RU2zvD72D2SGAehQKLXLQeN6XCt9PRAszP18dJADm10xgkXJm+G
+GJm69bRYP0GIskQI0D2hXoUlSyXFKZa154pkVzmeM40UXo90FrMC/YjH5dLp7uDn
+QtZbsASlHiy7lXFX0IoJHSHZFppmHcW2KOmFfKwgE9dpku7CdTdySY9BXiLC/Erb
+l2WjwzSDEkQbnq6Jm3/wb/AXxDEu9H2SE6kOxrERqXBfc1ycaEsJMxpLxYpk/kGz
+U6YXqXiOla1SYC78/SnSV8Dkj4/hN1/XtFmkmLUn/WgctmPnsE+fMN/ALXrH2OE7
+pUYLTy7jxJ46dChpjIPJ6Tp5z7EbxdsXR9JwLFQP+Fyp/anqLO/uLkZhZGhI3r6t
+lvFyZW8zoAuf6UpKL6bIvxld9SDuEqahbU1RcLsK/7Lwh8gFYXvq6k9siV2Fs4K+
+UWyVrn5cdSMErMMAEQEAAbkBjQRhHV9TAQwA0zBHsAralWNrZBdCkXHvNI0VqeJf
+Ix1c6AMqFW6FN73153uan6AYkpeBSWz9iHgchZY5UXgaKwx75eW+89X4X0SBU2Lb
+B39584+VDdjieynrW4HH2Fv8VJicioyMYyB/16ERidkIPRAREN3K6SuDXRkkzIZF
+LbHhRZZ6XByKDXeAZ/U56TPgsvYEsdFoj7vn+44ZP1GaAeje5v7nqXiHB1lNrpFw
+T7NV7YQXSpkqQJ4ADaL4jzGHS7umGjY5/T4dy+43qTPIrDSakHFGElfNfW5y46ta
+JiA+Hv4BowILjDMHska9hXM123CCuUS8ZQYmouYleKTCcfp34xxXuKRNDJgY8oiB
+sjXokdCoaRhdcS/PrlQvWfCA/D49XLGCeXdC5veOeGJF9W5fk5qv8Bq1vD/jnapH
+Uf92VkCJ+aVqynf0pPTKrctf0fNsttstGrPSGg+RW6NnQ20B4zgqwZAYME+z9w2z
+jmmLjm78BRJ+nzVvgll8aHy5bel56OdSldK7ABEBAAGJAbwEGAEKACYWIQRvZWt/
+a/sjjTis+B88J9l7DIOoXAUCYR1fUwIbDAUJA8JnAAAKCRA8J9l7DIOoXBx7DACt
+p4W4buVzQKYLZM0Fxucb8AgzJyrMU/01n4ys/hHBLNlCHj/Ar49PPxJ97M/QnI8q
+7yqNWOXPGecU+slBmK9biTHtHnaRhkcC/NhZsIwPNhw0H6QGGYi55VSuUPqpus3F
+fPBQ5uhGpSCy9dfux+9swNl1ZhMj2qO+m0flVf8t1JWLqTPs9giRTWAZfHuGGFdQ
+g/I+3LMyqmcphe/ysTlashiLyusQS3x8OpNhReXjZiyU44bVO5F8K+CZ28404OZi
+rg/TV/mtrH5t5A5rniev4r1FBzLTaqEXslSrvGzZhnZyKefHNL7HMiSWe6AkJBOu
+MNzPX3/PKRjhnZlLM9wpDSpG9Z66cNDDFzUwtDYx5O7gbLFib0OrjIz7q0rhm1h9
+nWky+RZ+dRuNR6HV9OlPcS5OizxbdZ9dgjy4fUuMK7G1gXyifGEXKJCXFW1whs0n
+DOOaC87hGOpfZWMBVF1mbtI+Mhb6xY5pv4UXfmVBNUZLdT8RShMJOwemBJjUkyc=
+=f4Sq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3C27D97B0C83A85C
+sub    4BC7B9A81C39EBA0
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBGEdX1MBDACuRDzoPMh3CyUHQydFo363R6OdXqMZ8mJQMdysIJCXOXZGRwUC
+uyPOUfH6uSG24RU2zvD72D2SGAehQKLXLQeN6XCt9PRAszP18dJADm10xgkXJm+G
+GJm69bRYP0GIskQI0D2hXoUlSyXFKZa154pkVzmeM40UXo90FrMC/YjH5dLp7uDn
+QtZbsASlHiy7lXFX0IoJHSHZFppmHcW2KOmFfKwgE9dpku7CdTdySY9BXiLC/Erb
+l2WjwzSDEkQbnq6Jm3/wb/AXxDEu9H2SE6kOxrERqXBfc1ycaEsJMxpLxYpk/kGz
+U6YXqXiOla1SYC78/SnSV8Dkj4/hN1/XtFmkmLUn/WgctmPnsE+fMN/ALXrH2OE7
+pUYLTy7jxJ46dChpjIPJ6Tp5z7EbxdsXR9JwLFQP+Fyp/anqLO/uLkZhZGhI3r6t
+lvFyZW8zoAuf6UpKL6bIvxld9SDuEqahbU1RcLsK/7Lwh8gFYXvq6k9siV2Fs4K+
+UWyVrn5cdSMErMMAEQEAAbkBjQRhHV9TAQwA0zBHsAralWNrZBdCkXHvNI0VqeJf
+Ix1c6AMqFW6FN73153uan6AYkpeBSWz9iHgchZY5UXgaKwx75eW+89X4X0SBU2Lb
+B39584+VDdjieynrW4HH2Fv8VJicioyMYyB/16ERidkIPRAREN3K6SuDXRkkzIZF
+LbHhRZZ6XByKDXeAZ/U56TPgsvYEsdFoj7vn+44ZP1GaAeje5v7nqXiHB1lNrpFw
+T7NV7YQXSpkqQJ4ADaL4jzGHS7umGjY5/T4dy+43qTPIrDSakHFGElfNfW5y46ta
+JiA+Hv4BowILjDMHska9hXM123CCuUS8ZQYmouYleKTCcfp34xxXuKRNDJgY8oiB
+sjXokdCoaRhdcS/PrlQvWfCA/D49XLGCeXdC5veOeGJF9W5fk5qv8Bq1vD/jnapH
+Uf92VkCJ+aVqynf0pPTKrctf0fNsttstGrPSGg+RW6NnQ20B4zgqwZAYME+z9w2z
+jmmLjm78BRJ+nzVvgll8aHy5bel56OdSldK7ABEBAAGJAbwEGAEKACYWIQRvZWt/
+a/sjjTis+B88J9l7DIOoXAUCYR1fUwIbDAUJA8JnAAAKCRA8J9l7DIOoXBx7DACt
+p4W4buVzQKYLZM0Fxucb8AgzJyrMU/01n4ys/hHBLNlCHj/Ar49PPxJ97M/QnI8q
+7yqNWOXPGecU+slBmK9biTHtHnaRhkcC/NhZsIwPNhw0H6QGGYi55VSuUPqpus3F
+fPBQ5uhGpSCy9dfux+9swNl1ZhMj2qO+m0flVf8t1JWLqTPs9giRTWAZfHuGGFdQ
+g/I+3LMyqmcphe/ysTlashiLyusQS3x8OpNhReXjZiyU44bVO5F8K+CZ28404OZi
+rg/TV/mtrH5t5A5rniev4r1FBzLTaqEXslSrvGzZhnZyKefHNL7HMiSWe6AkJBOu
+MNzPX3/PKRjhnZlLM9wpDSpG9Z66cNDDFzUwtDYx5O7gbLFib0OrjIz7q0rhm1h9
+nWky+RZ+dRuNR6HV9OlPcS5OizxbdZ9dgjy4fUuMK7G1gXyifGEXKJCXFW1whs0n
+DOOaC87hGOpfZWMBVF1mbtI+Mhb6xY5pv4UXfmVBNUZLdT8RShMJOwemBJjUkyc=
+=f4Sq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EE9E7DC9D92FC896
+sub    3B7272A25F20140F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE/oyDcBCACgYsHtmWmtUzqyr/JN+orfJaTl2363qiS+NJ1lt2CNxUWOqldc
+VcIGyjmzokxTRpGdCFmT1Lh/hzZhcDPLjrtxf+f6njIibt80OiEbX39gjwZRIikd
+Uv44Z7zAGE/upTM87/s+1+M1h9NFHPUg4SOOHwk3hYvCbvde3bZaUDhhn2asrYb2
+wlUbPBZROtFWlxZXHGXsMnER6ZScxK3ckrJkikM5L8tGFrJlBb/lG2vS00lcZDoR
+7v7XtmHqOBxPFf4RIMP/HimGl4lEuBhc25eAt4QxoVmoqb2C4vCUWxwfAURkJzI2
+JU3l5YP0rSgO9rwrXGlTvASCuEoQyPDjwKGLABEBAAG5AQ0ET+jINwEIANpeqMgb
+VzzRnT60rHPxCM40VfwVTYFEspNZV4g9Byb/Cu4UqHtdOApqIS0XQDgT+042x4Jt
+I6OZ7fUzOpN6Xb673LnB746J9cOlDL9JkqUwD/sjFg9YYFMROvhOOB023moPDsPk
+9jSDDxWmMfpr0NWGba4xWG/R6FHAbK023oRZO1BACBcNF59M9y6iJ3Edb6qfiGXF
+fnJrvwOYfGEqzOA+5YJZHPI59RoxAMm7NT1EwhgnD3qw5qCBHBDzaI7qinAy5Zs2
+jtZIEZHlV37CAKjeXjmjCnAnYD/Tlh9vOY9ku3UK5uH5CGxYDKdd5bX5bNmWK2mb
+pRk7C6MSTGX9tTUAEQEAAYkBHwQYAQIACQUCT+jINwIbDAAKCRDunn3J2S/IluSv
+B/4o0x3rrIK3T9WK2Ylvh6eRLbB18fEiYj5B/aWRTYTHJRfGa+Tziwm55stRnQjZ
+ZMC36K7LjPQjqjAW0011azO8oFKFbJnVmmOTUrosVdkxYBdW6fcOXmFcFi2c/M4U
+At6Mb9qg7vVW1DUk5+W5OU3TC33WCBKClb3usf8Uv0hZ5TRs+gt35EWBYpHuQIhq
+W4+1ntttT9gF6+MruoAKy8ViEsPQ/tpLG0eOTc2XjWg9z2wVl0KVKJN32IQKwje8
+RtLK0bY1KEeKXo1FCUVTg9IWDaNsi2tWPL8CLpP/Hq4Qx9SX32Io/3rJxy3h+sg+
+hN0x6m3QjnijzvokolnfxsAb
+=RmVV
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EE9E7DC9D92FC896
+sub    3B7272A25F20140F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE/oyDcBCACgYsHtmWmtUzqyr/JN+orfJaTl2363qiS+NJ1lt2CNxUWOqldc
+VcIGyjmzokxTRpGdCFmT1Lh/hzZhcDPLjrtxf+f6njIibt80OiEbX39gjwZRIikd
+Uv44Z7zAGE/upTM87/s+1+M1h9NFHPUg4SOOHwk3hYvCbvde3bZaUDhhn2asrYb2
+wlUbPBZROtFWlxZXHGXsMnER6ZScxK3ckrJkikM5L8tGFrJlBb/lG2vS00lcZDoR
+7v7XtmHqOBxPFf4RIMP/HimGl4lEuBhc25eAt4QxoVmoqb2C4vCUWxwfAURkJzI2
+JU3l5YP0rSgO9rwrXGlTvASCuEoQyPDjwKGLABEBAAG5AQ0ET+jINwEIANpeqMgb
+VzzRnT60rHPxCM40VfwVTYFEspNZV4g9Byb/Cu4UqHtdOApqIS0XQDgT+042x4Jt
+I6OZ7fUzOpN6Xb673LnB746J9cOlDL9JkqUwD/sjFg9YYFMROvhOOB023moPDsPk
+9jSDDxWmMfpr0NWGba4xWG/R6FHAbK023oRZO1BACBcNF59M9y6iJ3Edb6qfiGXF
+fnJrvwOYfGEqzOA+5YJZHPI59RoxAMm7NT1EwhgnD3qw5qCBHBDzaI7qinAy5Zs2
+jtZIEZHlV37CAKjeXjmjCnAnYD/Tlh9vOY9ku3UK5uH5CGxYDKdd5bX5bNmWK2mb
+pRk7C6MSTGX9tTUAEQEAAYkBHwQYAQIACQUCT+jINwIbDAAKCRDunn3J2S/IluSv
+B/4o0x3rrIK3T9WK2Ylvh6eRLbB18fEiYj5B/aWRTYTHJRfGa+Tziwm55stRnQjZ
+ZMC36K7LjPQjqjAW0011azO8oFKFbJnVmmOTUrosVdkxYBdW6fcOXmFcFi2c/M4U
+At6Mb9qg7vVW1DUk5+W5OU3TC33WCBKClb3usf8Uv0hZ5TRs+gt35EWBYpHuQIhq
+W4+1ntttT9gF6+MruoAKy8ViEsPQ/tpLG0eOTc2XjWg9z2wVl0KVKJN32IQKwje8
+RtLK0bY1KEeKXo1FCUVTg9IWDaNsi2tWPL8CLpP/Hq4Qx9SX32Io/3rJxy3h+sg+
+hN0x6m3QjnijzvokolnfxsAb
+=RmVV
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3F36885C24DF4B75
+sub    97859F2FE8EAEB26
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFmfSwYBCADdZEuR8cs2ejLLW3+Glxiq15rVbHbxaWmmZApGNijFro/LzFrR
+z+99N1mnA5+Ar/yKmn8lsCiTWukGQzWbdH/QSRUdyHtzxbCSeONdMhdKl3sJY1h2
+jW28oYL6iOMtNYe8qKoCrHRtyTl7oqYtYuhMwdNedGrkVWPrInmg0ILUSz9RufCh
+6KW3V3eAwz0LbckpSi9ZNyCNssjINvr6bRf10HMucViAB0O1DjrwO6aiFnatTCyO
+ig5MMZjgRPKjMASsPG8Ri1xivBYS/tpgamQzq+htWkbEydNv9+g31S5sN0pPw2km
+e8SjKp3C8RkSgz+dJz+P6tQrmGvZNs+pm2M9ABEBAAG5AQ0EWZ9LBgEIAL3j10Fr
+ODkE7yVreTlYs7UrZGaJwdx8stENYdHHA7MmDIMkVnjAOkzAwW4zRXdtFHqICLUO
+L4ZRnAiGuyxiwvxXM7NuGgCfC94M2w58xf2JREaCmU5kII/O3KOv60y8+QixFZl/
+c7p3YOGwOQEEit5445chxYwM88Bq+LgkXAn9zNnZbOyUv+E4gx17khkyZOXP+Z2P
+d606+KRvENLlFbrlVaJ7vzGiLhvIr62I4g3hJj/ob5nXT2tZSyMN19bJOtOd48R6
+NXFDmVC3uLWBgqLK1UgV5SylyKg6N32CUdds6E43DHLVUipawknN4QDc3s+ok6j3
+nN688afjFCLQVE8AEQEAAYkBHwQYAQIACQUCWZ9LBgIbDAAKCRA/NohcJN9LdaVO
+CAC7wk7tKsSNDxLhcq+Oa6TrE3JDQUYx6xlVsw0ZOq+TIbk2D7S/4phY+YSUUqWZ
+rp2vpFlszbcJXx41+s/ljfNnkMVjoU6D/A3R0az9weFfmq0J8CoJeP86CNxCiRIX
+d1rZ6wHlc67QJZe/aaYzxOO8vkzkeEiDaXjvmaSoADucbF1c6KjQms/yJ9nFz/Mk
+FPRxWntD1UkxNLh8UQZhIZFrAmhpgdDa0xq0VCJwL1ZLEo+cm6wKTZb6iRnSqPbu
+fwS6/GYF9IKUp/WVQvhZ952mwzfrz9r1PbTg/fOo+MOGywdBZpEEPTL5pvfrrOYg
+5q0kixiYviNzHBn/YKmH2ibE
+=xwpz
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3F36885C24DF4B75
+sub    97859F2FE8EAEB26
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFmfSwYBCADdZEuR8cs2ejLLW3+Glxiq15rVbHbxaWmmZApGNijFro/LzFrR
+z+99N1mnA5+Ar/yKmn8lsCiTWukGQzWbdH/QSRUdyHtzxbCSeONdMhdKl3sJY1h2
+jW28oYL6iOMtNYe8qKoCrHRtyTl7oqYtYuhMwdNedGrkVWPrInmg0ILUSz9RufCh
+6KW3V3eAwz0LbckpSi9ZNyCNssjINvr6bRf10HMucViAB0O1DjrwO6aiFnatTCyO
+ig5MMZjgRPKjMASsPG8Ri1xivBYS/tpgamQzq+htWkbEydNv9+g31S5sN0pPw2km
+e8SjKp3C8RkSgz+dJz+P6tQrmGvZNs+pm2M9ABEBAAG5AQ0EWZ9LBgEIAL3j10Fr
+ODkE7yVreTlYs7UrZGaJwdx8stENYdHHA7MmDIMkVnjAOkzAwW4zRXdtFHqICLUO
+L4ZRnAiGuyxiwvxXM7NuGgCfC94M2w58xf2JREaCmU5kII/O3KOv60y8+QixFZl/
+c7p3YOGwOQEEit5445chxYwM88Bq+LgkXAn9zNnZbOyUv+E4gx17khkyZOXP+Z2P
+d606+KRvENLlFbrlVaJ7vzGiLhvIr62I4g3hJj/ob5nXT2tZSyMN19bJOtOd48R6
+NXFDmVC3uLWBgqLK1UgV5SylyKg6N32CUdds6E43DHLVUipawknN4QDc3s+ok6j3
+nN688afjFCLQVE8AEQEAAYkBHwQYAQIACQUCWZ9LBgIbDAAKCRA/NohcJN9LdaVO
+CAC7wk7tKsSNDxLhcq+Oa6TrE3JDQUYx6xlVsw0ZOq+TIbk2D7S/4phY+YSUUqWZ
+rp2vpFlszbcJXx41+s/ljfNnkMVjoU6D/A3R0az9weFfmq0J8CoJeP86CNxCiRIX
+d1rZ6wHlc67QJZe/aaYzxOO8vkzkeEiDaXjvmaSoADucbF1c6KjQms/yJ9nFz/Mk
+FPRxWntD1UkxNLh8UQZhIZFrAmhpgdDa0xq0VCJwL1ZLEo+cm6wKTZb6iRnSqPbu
+fwS6/GYF9IKUp/WVQvhZ952mwzfrz9r1PbTg/fOo+MOGywdBZpEEPTL5pvfrrOYg
+5q0kixiYviNzHBn/YKmH2ibE
+=xwpz
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFPU8TIBCADGNvExYTJpVuNGCF9NuWw+IkitjAD7WzF7QkvFCSw9VftzgTUZ
+3PYrThRiaDdmHQAke4Sp+nYyAJ7iUcQqg/5/ONiMdzXEv5Kwy5WJN8+o2aXSunIT
+PALIw29DemZdVerw8Xc9jcdNYGxbPgtfSjr/DBCBs5Guq+RuuwsBvyTGLiHpc6hb
+91D/wX6Y0NQB4UlY9f3k6AgqiR5OGq602hXYvL10pH6eT3gSmCvxp1WvNJDBmaRi
+ZdgW76Y+bGQkmygWdAb3Q2DUEQHVH30YTBx5VFoiCfx1Jud4mD90Tv1hhPn0fS50
+oLGqI6f+VB14iJ4XLaSfyk/UMl343iF9PAg9ABEBAAG5AQ0EU9TxMgEIANAOURt9
+TLIRxc4lZLnve9LNSjTe3g88MOSoCI/EsyOR4ttMmc7NqNgCwYXyuNlak+jSGupL
+biUCaFq+ioYWPpDGmZZLfiNFPi5Zm8uJdo5RupRTzWWCGryzhb1PHlr1Pd+H4C7r
+SuB4pgTaPB06p/o7H6DU3/HKb3AEkJ40FThJX+cU2EOkVs999WQ6Xyabj8j1ivfx
+jB0K7q4SuEGEpWvbGHWCGTNuzpjcXYvYWjy0pGgJnmBfaZ4NAqD6mpyNx3yDfVvV
+Lu5D3M1t2a9Q4F6uKbaO65SuvTNNRnsCjFbk0tjCas1s2j/QQjI9IyPonKUkVdOv
+egP9XmQke1Wm/TcAEQEAAYkCPgQYAQIACQUCU9TxMgIbLgEpCRAWS9Ike5NnEcBd
+IAQZAQIABgUCU9TxMgAKCRDv6AhvnpN3Tnp6B/9b03x083+GdaHSBO5QvfJNMxe4
+7bzx53bFMrCqd8zDra7hG/AhNHLsPWdK2MyAc1U8zZt9OUqOxtcb9x1Tneq1XDLa
+bGaaNnQMhRGwU8jqmwyn1qxseE/XutZu7MjQgo2nRpUwBK+1y5CcC4I4RxsEzff1
+RFs9tOyXy+rtV3X2hhksT4GUag8O3PpCmsdX1NdMFfcL+W7Orf35z6iaaWUketOw
+YhzVALfAqZ+5BAt0ZvJktrn6oOS1/qri5YJeCuy/hGHnKuTsf1BuJUQjRmuntUzP
+y8qDPBqTAtDjitO/RnHjY0fq9SceX8Q/EItOKyqPFOC2XfCooP/zTxowcdsraXEH
+/idJYp8nHncdzsoRonzNY+0n61qXkE/0yWRtPKlcO5q+3i82ILT38+2M7MQgHBqP
+iL8UmsVRfHNwTHtJYsMHEgy90heV1mLft19OHvWEzgyopg+G6oWbaPw7CR0djHfJ
+vEPGWvldW0vHJaIA9X+lm6N2nc8tsPm62i/ig8o5tjULAUrizQanCv87VxqsSt24
+Vh9sE+eNXY3ffMv4wedl/nlaHghBD2YttcFulAwoB6nwtV8YbKu9AWx+UQsCDMdo
+slVaChMsTYWjoAKUn6vZpKNDQJaQLk/R205uhj1YKBM0wBwYQ9+0fj7FH0hD3qfq
+ZsgZV9p6yscaETbJeSljYkM=
+=FjWo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+uid    Marc Philipp (JUnit Development, 2014) <[email protected]>
+
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qw==
+=iceo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFPU8TIBCADGNvExYTJpVuNGCF9NuWw+IkitjAD7WzF7QkvFCSw9VftzgTUZ
+3PYrThRiaDdmHQAke4Sp+nYyAJ7iUcQqg/5/ONiMdzXEv5Kwy5WJN8+o2aXSunIT
+PALIw29DemZdVerw8Xc9jcdNYGxbPgtfSjr/DBCBs5Guq+RuuwsBvyTGLiHpc6hb
+91D/wX6Y0NQB4UlY9f3k6AgqiR5OGq602hXYvL10pH6eT3gSmCvxp1WvNJDBmaRi
+ZdgW76Y+bGQkmygWdAb3Q2DUEQHVH30YTBx5VFoiCfx1Jud4mD90Tv1hhPn0fS50
+oLGqI6f+VB14iJ4XLaSfyk/UMl343iF9PAg9ABEBAAG5AQ0EU9TxMgEIANAOURt9
+TLIRxc4lZLnve9LNSjTe3g88MOSoCI/EsyOR4ttMmc7NqNgCwYXyuNlak+jSGupL
+biUCaFq+ioYWPpDGmZZLfiNFPi5Zm8uJdo5RupRTzWWCGryzhb1PHlr1Pd+H4C7r
+SuB4pgTaPB06p/o7H6DU3/HKb3AEkJ40FThJX+cU2EOkVs999WQ6Xyabj8j1ivfx
+jB0K7q4SuEGEpWvbGHWCGTNuzpjcXYvYWjy0pGgJnmBfaZ4NAqD6mpyNx3yDfVvV
+Lu5D3M1t2a9Q4F6uKbaO65SuvTNNRnsCjFbk0tjCas1s2j/QQjI9IyPonKUkVdOv
+egP9XmQke1Wm/TcAEQEAAYkCPgQYAQIACQUCU9TxMgIbLgEpCRAWS9Ike5NnEcBd
+IAQZAQIABgUCU9TxMgAKCRDv6AhvnpN3Tnp6B/9b03x083+GdaHSBO5QvfJNMxe4
+7bzx53bFMrCqd8zDra7hG/AhNHLsPWdK2MyAc1U8zZt9OUqOxtcb9x1Tneq1XDLa
+bGaaNnQMhRGwU8jqmwyn1qxseE/XutZu7MjQgo2nRpUwBK+1y5CcC4I4RxsEzff1
+RFs9tOyXy+rtV3X2hhksT4GUag8O3PpCmsdX1NdMFfcL+W7Orf35z6iaaWUketOw
+YhzVALfAqZ+5BAt0ZvJktrn6oOS1/qri5YJeCuy/hGHnKuTsf1BuJUQjRmuntUzP
+y8qDPBqTAtDjitO/RnHjY0fq9SceX8Q/EItOKyqPFOC2XfCooP/zTxowcdsraXEH
+/idJYp8nHncdzsoRonzNY+0n61qXkE/0yWRtPKlcO5q+3i82ILT38+2M7MQgHBqP
+iL8UmsVRfHNwTHtJYsMHEgy90heV1mLft19OHvWEzgyopg+G6oWbaPw7CR0djHfJ
+vEPGWvldW0vHJaIA9X+lm6N2nc8tsPm62i/ig8o5tjULAUrizQanCv87VxqsSt24
+Vh9sE+eNXY3ffMv4wedl/nlaHghBD2YttcFulAwoB6nwtV8YbKu9AWx+UQsCDMdo
+slVaChMsTYWjoAKUn6vZpKNDQJaQLk/R205uhj1YKBM0wBwYQ9+0fj7FH0hD3qfq
+ZsgZV9p6yscaETbJeSljYkM=
+=FjWo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFPU8TIBCADGNvExYTJpVuNGCF9NuWw+IkitjAD7WzF7QkvFCSw9VftzgTUZ
+3PYrThRiaDdmHQAke4Sp+nYyAJ7iUcQqg/5/ONiMdzXEv5Kwy5WJN8+o2aXSunIT
+PALIw29DemZdVerw8Xc9jcdNYGxbPgtfSjr/DBCBs5Guq+RuuwsBvyTGLiHpc6hb
+91D/wX6Y0NQB4UlY9f3k6AgqiR5OGq602hXYvL10pH6eT3gSmCvxp1WvNJDBmaRi
+ZdgW76Y+bGQkmygWdAb3Q2DUEQHVH30YTBx5VFoiCfx1Jud4mD90Tv1hhPn0fS50
+oLGqI6f+VB14iJ4XLaSfyk/UMl343iF9PAg9ABEBAAG5AQ0EU9TxMgEIANAOURt9
+TLIRxc4lZLnve9LNSjTe3g88MOSoCI/EsyOR4ttMmc7NqNgCwYXyuNlak+jSGupL
+biUCaFq+ioYWPpDGmZZLfiNFPi5Zm8uJdo5RupRTzWWCGryzhb1PHlr1Pd+H4C7r
+SuB4pgTaPB06p/o7H6DU3/HKb3AEkJ40FThJX+cU2EOkVs999WQ6Xyabj8j1ivfx
+jB0K7q4SuEGEpWvbGHWCGTNuzpjcXYvYWjy0pGgJnmBfaZ4NAqD6mpyNx3yDfVvV
+Lu5D3M1t2a9Q4F6uKbaO65SuvTNNRnsCjFbk0tjCas1s2j/QQjI9IyPonKUkVdOv
+egP9XmQke1Wm/TcAEQEAAYkCPgQYAQIACQUCU9TxMgIbLgEpCRAWS9Ike5NnEcBd
+IAQZAQIABgUCU9TxMgAKCRDv6AhvnpN3Tnp6B/9b03x083+GdaHSBO5QvfJNMxe4
+7bzx53bFMrCqd8zDra7hG/AhNHLsPWdK2MyAc1U8zZt9OUqOxtcb9x1Tneq1XDLa
+bGaaNnQMhRGwU8jqmwyn1qxseE/XutZu7MjQgo2nRpUwBK+1y5CcC4I4RxsEzff1
+RFs9tOyXy+rtV3X2hhksT4GUag8O3PpCmsdX1NdMFfcL+W7Orf35z6iaaWUketOw
+YhzVALfAqZ+5BAt0ZvJktrn6oOS1/qri5YJeCuy/hGHnKuTsf1BuJUQjRmuntUzP
+y8qDPBqTAtDjitO/RnHjY0fq9SceX8Q/EItOKyqPFOC2XfCooP/zTxowcdsraXEH
+/idJYp8nHncdzsoRonzNY+0n61qXkE/0yWRtPKlcO5q+3i82ILT38+2M7MQgHBqP
+iL8UmsVRfHNwTHtJYsMHEgy90heV1mLft19OHvWEzgyopg+G6oWbaPw7CR0djHfJ
+vEPGWvldW0vHJaIA9X+lm6N2nc8tsPm62i/ig8o5tjULAUrizQanCv87VxqsSt24
+Vh9sE+eNXY3ffMv4wedl/nlaHghBD2YttcFulAwoB6nwtV8YbKu9AWx+UQsCDMdo
+slVaChMsTYWjoAKUn6vZpKNDQJaQLk/R205uhj1YKBM0wBwYQ9+0fj7FH0hD3qfq
+ZsgZV9p6yscaETbJeSljYkM=
+=FjWo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+uid    Marc Philipp (JUnit Development, 2014) <[email protected]>
+
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qw==
+=iceo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFPU8TIBCADGNvExYTJpVuNGCF9NuWw+IkitjAD7WzF7QkvFCSw9VftzgTUZ
+3PYrThRiaDdmHQAke4Sp+nYyAJ7iUcQqg/5/ONiMdzXEv5Kwy5WJN8+o2aXSunIT
+PALIw29DemZdVerw8Xc9jcdNYGxbPgtfSjr/DBCBs5Guq+RuuwsBvyTGLiHpc6hb
+91D/wX6Y0NQB4UlY9f3k6AgqiR5OGq602hXYvL10pH6eT3gSmCvxp1WvNJDBmaRi
+ZdgW76Y+bGQkmygWdAb3Q2DUEQHVH30YTBx5VFoiCfx1Jud4mD90Tv1hhPn0fS50
+oLGqI6f+VB14iJ4XLaSfyk/UMl343iF9PAg9ABEBAAG5AQ0EU9TxMgEIANAOURt9
+TLIRxc4lZLnve9LNSjTe3g88MOSoCI/EsyOR4ttMmc7NqNgCwYXyuNlak+jSGupL
+biUCaFq+ioYWPpDGmZZLfiNFPi5Zm8uJdo5RupRTzWWCGryzhb1PHlr1Pd+H4C7r
+SuB4pgTaPB06p/o7H6DU3/HKb3AEkJ40FThJX+cU2EOkVs999WQ6Xyabj8j1ivfx
+jB0K7q4SuEGEpWvbGHWCGTNuzpjcXYvYWjy0pGgJnmBfaZ4NAqD6mpyNx3yDfVvV
+Lu5D3M1t2a9Q4F6uKbaO65SuvTNNRnsCjFbk0tjCas1s2j/QQjI9IyPonKUkVdOv
+egP9XmQke1Wm/TcAEQEAAYkCPgQYAQIACQUCU9TxMgIbLgEpCRAWS9Ike5NnEcBd
+IAQZAQIABgUCU9TxMgAKCRDv6AhvnpN3Tnp6B/9b03x083+GdaHSBO5QvfJNMxe4
+7bzx53bFMrCqd8zDra7hG/AhNHLsPWdK2MyAc1U8zZt9OUqOxtcb9x1Tneq1XDLa
+bGaaNnQMhRGwU8jqmwyn1qxseE/XutZu7MjQgo2nRpUwBK+1y5CcC4I4RxsEzff1
+RFs9tOyXy+rtV3X2hhksT4GUag8O3PpCmsdX1NdMFfcL+W7Orf35z6iaaWUketOw
+YhzVALfAqZ+5BAt0ZvJktrn6oOS1/qri5YJeCuy/hGHnKuTsf1BuJUQjRmuntUzP
+y8qDPBqTAtDjitO/RnHjY0fq9SceX8Q/EItOKyqPFOC2XfCooP/zTxowcdsraXEH
+/idJYp8nHncdzsoRonzNY+0n61qXkE/0yWRtPKlcO5q+3i82ILT38+2M7MQgHBqP
+iL8UmsVRfHNwTHtJYsMHEgy90heV1mLft19OHvWEzgyopg+G6oWbaPw7CR0djHfJ
+vEPGWvldW0vHJaIA9X+lm6N2nc8tsPm62i/ig8o5tjULAUrizQanCv87VxqsSt24
+Vh9sE+eNXY3ffMv4wedl/nlaHghBD2YttcFulAwoB6nwtV8YbKu9AWx+UQsCDMdo
+slVaChMsTYWjoAKUn6vZpKNDQJaQLk/R205uhj1YKBM0wBwYQ9+0fj7FH0hD3qfq
+ZsgZV9p6yscaETbJeSljYkM=
+=FjWo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    164BD2247B936711
+uid    Marc Philipp (JUnit Development, 2014) <[email protected]>
+
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qw==
+=iceo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+uid    Groovy Operator (Groovy Language Continuous Integration Server) <[email protected]>
+
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ZIY=
+=83HN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+k2jL7nGs2D66/qmjgmO2J1/D
+=ugSE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A4B1A03FB9C2CE23
+uid    Pierre Yves Ricau <[email protected]>
+
+sub    21200D723F53CE38
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFy+swoBCADGyV4k02OjVCrziziYIvIO+qDm8Yqxt4KVd+ISw2DvmKVcP7lx
+z5WVGvxVdAl+Xy7FdcrIJYFCsYfFFxPz+BM6+np2c477HkdIcDwBWiHEoOqMehax
+wlEBhJdJUVCjTKvpMgqs4/a0PddNcp/odYx20HzDAK+X6/EgL1McZk03okfMSn0R
+TUvZeh76SbU0aQRXdGlSs5IUtywn2f+5jUNLht/TMd/bbAXWA2EQo1UallY3+dj8
+I/Y722X5Yu15rLu8u+pcVE/pMO9CHeX78mgPU2xU/xwDSGtU5lxwNXnYpHMUdFB8
+YtG/ofDtZR9+9Dcjhb3xSIv6Vlui9HgOgvctABEBAAG0JlBpZXJyZSBZdmVzIFJp
+Y2F1IDxweS5yaWNhdUBnbWFpbC5jb20+iQFUBBMBCAA+FiEEucyhPFnyHGzoQajR
+pLGgP7nCziMFAly+swoCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
+CgkQpLGgP7nCziPuugf/fDa86INrKZ08fCywB6oMcLEi/sNBbaKaysbp/zmmANwk
+nTWrIH6fqfQfkFdBpA4roPrjCNqQ3gdpjDhB9U7IeqpUzzeM+WEWVOlkA098MFrj
+ToJuxf7oCMXCPAtW3S+tGM1FdIFtqzoE3mdbhde/F0ppJDIbuAZfjKJclIeGj7eC
+6QbLua+IQeDKuQ6TRuFCc6vWl38L+LqqmNPxfw7Uta9W7CrP5oUYQqrdIszeVWGV
+ivK8cyLltXgIKcWJmj6GLsJtIUuXAj3kg1d05HQ5dpIkgaRN7+Q9BnsTcdnc+R6r
+nprvl+/QNk6XeNIRrPKiv7SWf1gYWbi4CpthjNsGy7kBDQRcvrMKAQgAvap3U+0R
+j3ZFSth8u9AnCrJrClbNtysMEYmpK0JgiNpaCDbw5lPv7yJyTPjnGTLSS2qx/+C2
+2Bml6b7lV2JgCXA54p9sa9Jpw5Mili2rx/62M0VmqMCNZi0vCxBOlj49fSpyxfKr
+IJ8eNwXd/XbHl0uKm+AYCJgtmBE4+ErSb2tJ3iEPqRBq9vYXnm1LKIZVKHzZr1Gw
+LS039UfGBFtlChF7ED7wQ4XuODmz5dx92tkI6svqvOuXZaTP1PDTqu8l5+E8yd3q
+JvonloHroLKbTDEuCtpn4jDSN/LZ1C7ekRu9OjL4gChvs/TJsPwkVka/rw4OWEOR
+KQfo2iv64g4NjQARAQABiQE8BBgBCAAmFiEEucyhPFnyHGzoQajRpLGgP7nCziMF
+Aly+swoCGwwFCQPCZwAACgkQpLGgP7nCziMSkAf+L6oedz16wE0F2ZYc4UM+J1bf
+qS2HEesB7YGTwnafi14xRQorvFOJ+CxfyDnl9HGCbfwqie1wO7VNQukhWl95wJSc
+Or1Nv3XPnHq6RKpBQrIR09eggfegf1N67HmorYRkfA25fwe9KmbNAUfPiKa6Vyrx
+6htiUIK1V7ArKVXwBL0saatdOnwrxOiHKBbxyy2jyZgt+rHKNUFmQLiiIvqg+krh
+sSksRMYzjG3Y96Wm0K/IH0XcuiQkVaHPOYSEqODz+miiS/PSqbw+WhfSNtdKfKDx
+OS6mrMnFluqthJ06aXBz+RmXGPtzJvKnI2LN7lwoGXk5zynZK8AXpTOpWED5ow==
+=Ig1p
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A4B1A03FB9C2CE23
+uid    Pierre Yves Ricau <[email protected]>
+
+sub    21200D723F53CE38
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFy+swoBCADGyV4k02OjVCrziziYIvIO+qDm8Yqxt4KVd+ISw2DvmKVcP7lx
+z5WVGvxVdAl+Xy7FdcrIJYFCsYfFFxPz+BM6+np2c477HkdIcDwBWiHEoOqMehax
+wlEBhJdJUVCjTKvpMgqs4/a0PddNcp/odYx20HzDAK+X6/EgL1McZk03okfMSn0R
+TUvZeh76SbU0aQRXdGlSs5IUtywn2f+5jUNLht/TMd/bbAXWA2EQo1UallY3+dj8
+I/Y722X5Yu15rLu8u+pcVE/pMO9CHeX78mgPU2xU/xwDSGtU5lxwNXnYpHMUdFB8
+YtG/ofDtZR9+9Dcjhb3xSIv6Vlui9HgOgvctABEBAAG0JlBpZXJyZSBZdmVzIFJp
+Y2F1IDxweS5yaWNhdUBnbWFpbC5jb20+iQFUBBMBCAA+FiEEucyhPFnyHGzoQajR
+pLGgP7nCziMFAly+swoCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
+CgkQpLGgP7nCziPuugf/fDa86INrKZ08fCywB6oMcLEi/sNBbaKaysbp/zmmANwk
+nTWrIH6fqfQfkFdBpA4roPrjCNqQ3gdpjDhB9U7IeqpUzzeM+WEWVOlkA098MFrj
+ToJuxf7oCMXCPAtW3S+tGM1FdIFtqzoE3mdbhde/F0ppJDIbuAZfjKJclIeGj7eC
+6QbLua+IQeDKuQ6TRuFCc6vWl38L+LqqmNPxfw7Uta9W7CrP5oUYQqrdIszeVWGV
+ivK8cyLltXgIKcWJmj6GLsJtIUuXAj3kg1d05HQ5dpIkgaRN7+Q9BnsTcdnc+R6r
+nprvl+/QNk6XeNIRrPKiv7SWf1gYWbi4CpthjNsGy7kBDQRcvrMKAQgAvap3U+0R
+j3ZFSth8u9AnCrJrClbNtysMEYmpK0JgiNpaCDbw5lPv7yJyTPjnGTLSS2qx/+C2
+2Bml6b7lV2JgCXA54p9sa9Jpw5Mili2rx/62M0VmqMCNZi0vCxBOlj49fSpyxfKr
+IJ8eNwXd/XbHl0uKm+AYCJgtmBE4+ErSb2tJ3iEPqRBq9vYXnm1LKIZVKHzZr1Gw
+LS039UfGBFtlChF7ED7wQ4XuODmz5dx92tkI6svqvOuXZaTP1PDTqu8l5+E8yd3q
+JvonloHroLKbTDEuCtpn4jDSN/LZ1C7ekRu9OjL4gChvs/TJsPwkVka/rw4OWEOR
+KQfo2iv64g4NjQARAQABiQE8BBgBCAAmFiEEucyhPFnyHGzoQajRpLGgP7nCziMF
+Aly+swoCGwwFCQPCZwAACgkQpLGgP7nCziMSkAf+L6oedz16wE0F2ZYc4UM+J1bf
+qS2HEesB7YGTwnafi14xRQorvFOJ+CxfyDnl9HGCbfwqie1wO7VNQukhWl95wJSc
+Or1Nv3XPnHq6RKpBQrIR09eggfegf1N67HmorYRkfA25fwe9KmbNAUfPiKa6Vyrx
+6htiUIK1V7ArKVXwBL0saatdOnwrxOiHKBbxyy2jyZgt+rHKNUFmQLiiIvqg+krh
+sSksRMYzjG3Y96Wm0K/IH0XcuiQkVaHPOYSEqODz+miiS/PSqbw+WhfSNtdKfKDx
+OS6mrMnFluqthJ06aXBz+RmXGPtzJvKnI2LN7lwoGXk5zynZK8AXpTOpWED5ow==
+=Ig1p
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    DDDAFA7674E54418
+uid    Cedric Beust <[email protected]>
+
+sub    50C6CC55C6F24FB1
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF8tnmMBCADROe7j1ZvgiMgfsQKqCSuSqgMkfMT2DEXwZKdHqkj0gfx8MPQg
+OP1pmMgpIwIXKr5kZ9KMGiGULNnS+WU2SNqjyKeq3MlnSYW5Di52MoAD7W4cHmry
+8ekaasF/x0AS5Q3M/6X/EBOD8YLWaFkk+h5x8D4IOSqiOiWH8olGjY4ZmGblaldX
+PLr7BWSrPKQ1QDsoICn583Mnjz3YLlc4p5IKnY2wss1zm7/gQk6KkdL5bRuASxLh
+to2adZ1LEE8MQfHweauHCK915RmMg7W3KW66/EsuCyEwZKBwq6rIpAciym2FngJt
+CPnY0o4IMFSasV7d1xSH5N4jeHL3Hh2Yd9tHABEBAAG0H0NlZHJpYyBCZXVzdCA8
+Y2VkcmljQGJldXN0LmNvbT6JAU4EEwEIADgWIQR81StagpUTfIj7V0jd2vp2dOVE
+GAUCXy2eYwIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDd2vp2dOVEGLQr
+CACZTTneMoaUR4pQHa/rQfGnYcYznSL32JUP98bgstwN+g5BoivHkrN/5IinELly
+n2nxrjrPucN2arjOvObiGk7UhvUY8h1kqWKWqc5Gsc/iXwnrIx9bwzwdbYaiKqMT
+E6RJ+naIN80rNRQnOMtBRTNmRWYZ9UMk2W1DEKZeCaKUJpO2lLpMW6R+Sta/pkq9
+L36F5G9qWBrVhUS4U/rEE27G7xiDZ7fCnjYt6lfvc6mKQ72BIUGtjVDRwBAiG98X
+Zn5+TqLaMkC8NotYInuV1/CwvfE9SuYH8dn3YJqAkkn57L74y8I0V54AyMXaLNp5
+G62uRD43Xw6rLakCxGNUafcouQENBF8tnmMBCADWQEHet457l0v27b6EVxjNZMGl
+NI939o3k4NdrCBglIojODXA9jp8VkisL7+klrpOP1vmoVd80Lk0fGSOdZDcIMbzW
+WChRMVMkY0vgeDqOgKw0j6e+isqN/vNipj2nh8cYm4q+LB6GVE0pfFCsrM8RFFew
+RO+esEuw0R1qXhNYLIwpRV3Ov4ZxDp1yM7KAHSBc86HJHy1t4LqLofjA+RBP8f/6
+2MmSRKLbDwruLz/02p0fR+lp2DiJ/IN40lGq1fSxRjXMTQnI+bIdsd7TlY0AbT6R
+NklBL3i492hxU188dva1PZM0sxAMZRXSt6cFCvz/jDvlf6jB6DmN18E2ad55ABEB
+AAGJATYEGAEIACAWIQR81StagpUTfIj7V0jd2vp2dOVEGAUCXy2eYwIbDAAKCRDd
+2vp2dOVEGAwbB/sFvYn1o5Q0r+ngdMJLCjQYT8a6uy8SH8N3k8RsTJ+ad0TdfOoG
+wvxl/SFB1MEjEVpXgbojjv01gVDola2ObIYSX+GWcvlJdfXKz8oZ5f8/KdRrAc3h
+z7gf8huUVeriwHoEEA7xi14kJZpwCPh8PiMMl5KQFWuG4D1eQnwOm54cIw/9hYB3
+R7oVI+2THlm3CAlFalsXzZ1N/l/JQG6LfPkKmrubr++FveXx6izjZssdFiaLg4dk
+AQdAwgpmFmCQHb63BCKzqPwDxpazpk1wP6Y5ornLu/ISaOo9VC9ylX+vUK93eq4K
+AFuUjn/Jk55tpdUEH8mW12W6Ukjt9FxVb8ZX
+=Vb7/
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    DDDAFA7674E54418
+uid    Cedric Beust <[email protected]>
+
+sub    50C6CC55C6F24FB1
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF8tnmMBCADROe7j1ZvgiMgfsQKqCSuSqgMkfMT2DEXwZKdHqkj0gfx8MPQg
+OP1pmMgpIwIXKr5kZ9KMGiGULNnS+WU2SNqjyKeq3MlnSYW5Di52MoAD7W4cHmry
+8ekaasF/x0AS5Q3M/6X/EBOD8YLWaFkk+h5x8D4IOSqiOiWH8olGjY4ZmGblaldX
+PLr7BWSrPKQ1QDsoICn583Mnjz3YLlc4p5IKnY2wss1zm7/gQk6KkdL5bRuASxLh
+to2adZ1LEE8MQfHweauHCK915RmMg7W3KW66/EsuCyEwZKBwq6rIpAciym2FngJt
+CPnY0o4IMFSasV7d1xSH5N4jeHL3Hh2Yd9tHABEBAAG0H0NlZHJpYyBCZXVzdCA8
+Y2VkcmljQGJldXN0LmNvbT6JAU4EEwEIADgWIQR81StagpUTfIj7V0jd2vp2dOVE
+GAUCXy2eYwIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDd2vp2dOVEGLQr
+CACZTTneMoaUR4pQHa/rQfGnYcYznSL32JUP98bgstwN+g5BoivHkrN/5IinELly
+n2nxrjrPucN2arjOvObiGk7UhvUY8h1kqWKWqc5Gsc/iXwnrIx9bwzwdbYaiKqMT
+E6RJ+naIN80rNRQnOMtBRTNmRWYZ9UMk2W1DEKZeCaKUJpO2lLpMW6R+Sta/pkq9
+L36F5G9qWBrVhUS4U/rEE27G7xiDZ7fCnjYt6lfvc6mKQ72BIUGtjVDRwBAiG98X
+Zn5+TqLaMkC8NotYInuV1/CwvfE9SuYH8dn3YJqAkkn57L74y8I0V54AyMXaLNp5
+G62uRD43Xw6rLakCxGNUafcouQENBF8tnmMBCADWQEHet457l0v27b6EVxjNZMGl
+NI939o3k4NdrCBglIojODXA9jp8VkisL7+klrpOP1vmoVd80Lk0fGSOdZDcIMbzW
+WChRMVMkY0vgeDqOgKw0j6e+isqN/vNipj2nh8cYm4q+LB6GVE0pfFCsrM8RFFew
+RO+esEuw0R1qXhNYLIwpRV3Ov4ZxDp1yM7KAHSBc86HJHy1t4LqLofjA+RBP8f/6
+2MmSRKLbDwruLz/02p0fR+lp2DiJ/IN40lGq1fSxRjXMTQnI+bIdsd7TlY0AbT6R
+NklBL3i492hxU188dva1PZM0sxAMZRXSt6cFCvz/jDvlf6jB6DmN18E2ad55ABEB
+AAGJATYEGAEIACAWIQR81StagpUTfIj7V0jd2vp2dOVEGAUCXy2eYwIbDAAKCRDd
+2vp2dOVEGAwbB/sFvYn1o5Q0r+ngdMJLCjQYT8a6uy8SH8N3k8RsTJ+ad0TdfOoG
+wvxl/SFB1MEjEVpXgbojjv01gVDola2ObIYSX+GWcvlJdfXKz8oZ5f8/KdRrAc3h
+z7gf8huUVeriwHoEEA7xi14kJZpwCPh8PiMMl5KQFWuG4D1eQnwOm54cIw/9hYB3
+R7oVI+2THlm3CAlFalsXzZ1N/l/JQG6LfPkKmrubr++FveXx6izjZssdFiaLg4dk
+AQdAwgpmFmCQHb63BCKzqPwDxpazpk1wP6Y5ornLu/ISaOo9VC9ylX+vUK93eq4K
+AFuUjn/Jk55tpdUEH8mW12W6Ukjt9FxVb8ZX
+=Vb7/
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    79752DB6C966F0B8
+uid    Rob Manning <[email protected]>
+
+sub    AC9F6F1991913E30
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+1v9wlHhhdbE=
+=R3mQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    85911F425EC61B51
+uid    Marc Philipp <[email protected]>
+uid    Marc Philipp <[email protected]>
+uid    Marc Philipp <[email protected]>
+uid    Open Source Development <[email protected]>
+
+sub    8B2A34A7D4A9B8B3
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+bpJ8mdzS2PJko7mm
+=NMA1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    85911F425EC61B51
+uid    Marc Philipp <[email protected]>
+uid    Marc Philipp <[email protected]>
+uid    Marc Philipp <[email protected]>
+uid    Open Source Development <[email protected]>
+
+sub    8B2A34A7D4A9B8B3
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+bpJ8mdzS2PJko7mm
+=NMA1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7C25280EAE63EBE5
+uid    Oleg Kalnichevski <[email protected]>
+uid    Oleg Kalnichevski <[email protected]>
+
+sub    926DFB2EDB329089
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ZNfGiQCfdH3+RPBbKSQofz2bGx7/niTd9qg=
+=CP3a
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0E91C2DE43B72BB1
+sub    83552A552A0D431C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFBIm/wBCACgqvegptBhfKbyBXZiW+7XchIJCOpwq0/9QgSehKMwELbUKqNM
+sIVrywANqYn32S9hNRvBiKGm/KY7VwN9p1Cr6Ey3XuGSbRo/xN6tqfV/rV5YClL5
+6sMc67BlnEaCZRNuB9ATeUE/4wCO7fWg79jJuNl8tKQ8EYIrVGizzjmZHt76OwAi
+hQtD6A19+qjQ02SyPUJS6a2lKx+gwaHNxv4L2FqImCFGOOEToyRb12GD18Mgbf5o
+OtQVVtr3qbT07odFQt8Iyy1DiNUJbOfC+YO2wO7eMTr5xaFr1HejsTvKZiTDC0Nr
+EjtctqGxrjxPmoUPNwtxwEDTEh1lyKMhnqgJABEBAAG5AQ0EUEib/AEIAMDUgjnP
+KBeHIN0KNmXTS/uXXC4LTGltnQJ57OG2kmPz/JjAjYLoLvINY+xtghehMhRY3DmQ
+Dy/ufZsgO9oH8PztcC8QL5/dV6VTYf4U3FndbiSKgikaBX7yu5Qcrtkv8XgkJ+aw
+IEUgTGDXn2VT1hH6yEG1tA97iT/d7ZUxLEBsVgbxz9VtPellTNK5x/8NGY4NW+fM
+6+yGFpjr5juZVYRLa8u565vGBQO5FU7bg/69DftmL7vO4KRLs154VpsfAsTeo1rm
+U/8kIjgCVeKFClJG+Sg+m9rsJNYgiKy9dGfD/qDmVlEeWBuhtlAfqM7pHTv1Mu8m
+v5/DheBwvlwheg8AEQEAAYkBHwQYAQIACQUCUEib/AIbDAAKCRAOkcLeQ7crsaE0
+B/4/+ZcjdUfLPlKk/8BH0tMafEWOGvqY8bG4YpxGoJZHT/Lb/cnWDLvZzs98FVaQ
+3DKHZwQhhtnQIhnupvxSHX5wLeBZMtAANGQLauGp+A3S1WBVRHs0mzOdlVDbzJu7
+RW72mnkRMSoVd018fh4eQ0+VpZh0Pf9KfKJDwpEuESP1+6JcLLBvQXlEJYHOk7Up
+5eRkhljdIwz3TlSuJ9sCscTgM0PI7/L1eFP/iCgZIBHhpllVV6v5IGXx3P5Q7YQU
+y32zCrht4t9fdtdLct1j6eNaAQdPAU91auSbYhuVCpjgKNpwOv1ULoSWLUUPMNW5
+Qc4ZDKq+ywOElvONMnX4oaQ1
+=f1ra
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0E91C2DE43B72BB1
+sub    83552A552A0D431C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFBIm/wBCACgqvegptBhfKbyBXZiW+7XchIJCOpwq0/9QgSehKMwELbUKqNM
+sIVrywANqYn32S9hNRvBiKGm/KY7VwN9p1Cr6Ey3XuGSbRo/xN6tqfV/rV5YClL5
+6sMc67BlnEaCZRNuB9ATeUE/4wCO7fWg79jJuNl8tKQ8EYIrVGizzjmZHt76OwAi
+hQtD6A19+qjQ02SyPUJS6a2lKx+gwaHNxv4L2FqImCFGOOEToyRb12GD18Mgbf5o
+OtQVVtr3qbT07odFQt8Iyy1DiNUJbOfC+YO2wO7eMTr5xaFr1HejsTvKZiTDC0Nr
+EjtctqGxrjxPmoUPNwtxwEDTEh1lyKMhnqgJABEBAAG5AQ0EUEib/AEIAMDUgjnP
+KBeHIN0KNmXTS/uXXC4LTGltnQJ57OG2kmPz/JjAjYLoLvINY+xtghehMhRY3DmQ
+Dy/ufZsgO9oH8PztcC8QL5/dV6VTYf4U3FndbiSKgikaBX7yu5Qcrtkv8XgkJ+aw
+IEUgTGDXn2VT1hH6yEG1tA97iT/d7ZUxLEBsVgbxz9VtPellTNK5x/8NGY4NW+fM
+6+yGFpjr5juZVYRLa8u565vGBQO5FU7bg/69DftmL7vO4KRLs154VpsfAsTeo1rm
+U/8kIjgCVeKFClJG+Sg+m9rsJNYgiKy9dGfD/qDmVlEeWBuhtlAfqM7pHTv1Mu8m
+v5/DheBwvlwheg8AEQEAAYkBHwQYAQIACQUCUEib/AIbDAAKCRAOkcLeQ7crsaE0
+B/4/+ZcjdUfLPlKk/8BH0tMafEWOGvqY8bG4YpxGoJZHT/Lb/cnWDLvZzs98FVaQ
+3DKHZwQhhtnQIhnupvxSHX5wLeBZMtAANGQLauGp+A3S1WBVRHs0mzOdlVDbzJu7
+RW72mnkRMSoVd018fh4eQ0+VpZh0Pf9KfKJDwpEuESP1+6JcLLBvQXlEJYHOk7Up
+5eRkhljdIwz3TlSuJ9sCscTgM0PI7/L1eFP/iCgZIBHhpllVV6v5IGXx3P5Q7YQU
+y32zCrht4t9fdtdLct1j6eNaAQdPAU91auSbYhuVCpjgKNpwOv1ULoSWLUUPMNW5
+Qc4ZDKq+ywOElvONMnX4oaQ1
+=f1ra
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+uid    Brian E Fox <[email protected]>
+
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=o0/H
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    E0130A3ED5A2079E
+sub    0AE7BBD7FEE66E0C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFlMSXMBCADcgN0/57D/gU5cDobPiRuDT6qAxb/NWhQiqwAocKd274r4gPJm
+RbffUEZEgKhjH6l0CQfilC4R4x2QtU9sNC9kB/D6zumoS1uI0Hmx1pC4UseUy55r
+20WDxujUQ7OcJbpe2cDcQVKmMok2top7ZJqt4KVosQEeT9jjsgBBbEtg4cWb5ddR
+5rf+aJw0v/6dMLef1r9YAo0ZtLc+g2dyacqw73tcWEd3oCH++SgE26NntN+GibZu
+VXSE5u6xI4KwfT2vUT3jt5Fb29myX4sxsfB7n/xageuJYy5ms1ABS+WDO5ssEZC4
+eQEVL7eyIb9YhNAW/WtjeAuOfOKNonoqKFGXABEBAAG5AQ0EWUxJcwEIAMgrP3U+
+7YCibxSQKOZrp63RaSUkv7mCvQ3Lx4P4ZD/sDEsLOiKkAc+ZU7ETTIQkEpHaibvC
+ZNrA+R0pfAj0LYBLstEIkUxtAaVM4DBQGN13Zdup46fI8rPZEyZVb2XpZ/qS4RYi
+StFyJzUdazBJs/IB7CT0xp4DUFUOrsykVy0aWzWt4z0QBe1x3AmpAO/DdrDN5gvt
+mWzWbV3f783PuK3g41ju7F9XX5nuuatNSNHOHt65XL4vmhmSfXuP6UFjK6MKzq9z
+pbZD4ipUPoKEId5ONDSucX4C8OydpC8+rFWJCDDDvocox3/l6TzihQXf8MDDcB0u
+1TgDPz4M/S2vBh8AEQEAAYkBHwQYAQgACQUCWUxJcwIbDAAKCRDgEwo+1aIHntk2
+B/42pBknUQB2YjkPryJ1B1ArcxaLO7gVo/lgT/rLGL7BuTYsFIl9kJUD156EfkmS
+AkfsxPzwUNh/GyfVQt09F6wheprx1fLNJCFIYA9ZA0WVZGSwbE3NdiuwEaJ3/HZ7
+7IteQh5LKllqFuSlZ3u0xdtGJjnAUU9wHxWH+0W3RPm62piSJcWUw7CSqEyuX+8Z
++eq4HY0v74znfy6GyCiil7S1T9fdan22hP3xiJHgVKtyFmhhrz6YxcZLa0fYl+R3
+mCQvt2FuiaLL3d/uH0z6EzWs+XZNbjRBTGI9VmO7siIy6rjatdult3Sx1quBCixC
+4Ms2AWEA7bMqvUmCoB2M/0x8
+=6Sqy
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    E0130A3ED5A2079E
+sub    0AE7BBD7FEE66E0C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFlMSXMBCADcgN0/57D/gU5cDobPiRuDT6qAxb/NWhQiqwAocKd274r4gPJm
+RbffUEZEgKhjH6l0CQfilC4R4x2QtU9sNC9kB/D6zumoS1uI0Hmx1pC4UseUy55r
+20WDxujUQ7OcJbpe2cDcQVKmMok2top7ZJqt4KVosQEeT9jjsgBBbEtg4cWb5ddR
+5rf+aJw0v/6dMLef1r9YAo0ZtLc+g2dyacqw73tcWEd3oCH++SgE26NntN+GibZu
+VXSE5u6xI4KwfT2vUT3jt5Fb29myX4sxsfB7n/xageuJYy5ms1ABS+WDO5ssEZC4
+eQEVL7eyIb9YhNAW/WtjeAuOfOKNonoqKFGXABEBAAG5AQ0EWUxJcwEIAMgrP3U+
+7YCibxSQKOZrp63RaSUkv7mCvQ3Lx4P4ZD/sDEsLOiKkAc+ZU7ETTIQkEpHaibvC
+ZNrA+R0pfAj0LYBLstEIkUxtAaVM4DBQGN13Zdup46fI8rPZEyZVb2XpZ/qS4RYi
+StFyJzUdazBJs/IB7CT0xp4DUFUOrsykVy0aWzWt4z0QBe1x3AmpAO/DdrDN5gvt
+mWzWbV3f783PuK3g41ju7F9XX5nuuatNSNHOHt65XL4vmhmSfXuP6UFjK6MKzq9z
+pbZD4ipUPoKEId5ONDSucX4C8OydpC8+rFWJCDDDvocox3/l6TzihQXf8MDDcB0u
+1TgDPz4M/S2vBh8AEQEAAYkBHwQYAQgACQUCWUxJcwIbDAAKCRDgEwo+1aIHntk2
+B/42pBknUQB2YjkPryJ1B1ArcxaLO7gVo/lgT/rLGL7BuTYsFIl9kJUD156EfkmS
+AkfsxPzwUNh/GyfVQt09F6wheprx1fLNJCFIYA9ZA0WVZGSwbE3NdiuwEaJ3/HZ7
+7IteQh5LKllqFuSlZ3u0xdtGJjnAUU9wHxWH+0W3RPm62piSJcWUw7CSqEyuX+8Z
++eq4HY0v74znfy6GyCiil7S1T9fdan22hP3xiJHgVKtyFmhhrz6YxcZLa0fYl+R3
+mCQvt2FuiaLL3d/uH0z6EzWs+XZNbjRBTGI9VmO7siIy6rjatdult3Sx1quBCixC
+4Ms2AWEA7bMqvUmCoB2M/0x8
+=6Sqy
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
+=IIN3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BE096E29EDB8D141
+uid    Eric Lafortune (Key for signing ProGuard artefacts) <[email protected]>
+
+sub    E05A9780475FAB55
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFFGZXQBCADeZK9xuCrDwJ7v37y8RITlchzBfJEWv7cSbrSIBlFNAsUUoshW
+Y8U6xYKe0GdiLVta2F8bzs0Si4LcDeglQNi9Fxvh3/jfs0MEJUfSeZ4z1Mn5WY35
+utbdlHe6i+7qvhpHveREwWoWuvFGKeSCV8SioolG1mzxrDVLkQefPZ+Kr+xd2cYZ
+SIkbjdhCvJHcUkD9gs8Wz9q9eDyc7dGJmfBYaQ7Xa6lbd852qj8LjQ7Gd41yHU6T
+U3oo0kKfAPFkW7rX4zeJEBgpncK0i4ertd5to/y2hauqPU3VMExqNS0/L2GqKNmb
+Q2Me02pBSBCrLLCUJkm8jZorPNxlQxHpFLHDABEBAAG0T0VyaWMgTGFmb3J0dW5l
+IChLZXkgZm9yIHNpZ25pbmcgUHJvR3VhcmQgYXJ0ZWZhY3RzKSA8ZXJpY0BncmFw
+aGljcy5jb3JuZWxsLmVkdT6JATgEEwECACIFAlFGZXQCGwMGCwkIBwMCBhUIAgkK
+CwQWAgMBAh4BAheAAAoJEL4JbintuNFBUQ0H/1ahtWOeS+EEZqUxxgLE3aiuw6XR
+mcFY/9kRlnBsKpWGGyV0DRkLThXSV5fWwiP0+moef04Miv81txVXR3U5f4MY3U5J
+SDgeB1GK+BvcYz1CXxGcErgaMIDXu/K03OyQNp1lD2kjmDDz8SHdVqpv/aFfxWpL
+uMaogbStXfbDiMjeMg2zRcAzXqu7JlMt3z33uiTUZk9jubAPOBnP5/Yhuc2wcnfu
+cLUUL9xNE6gpl0Noy8qJ2TaVoHLfDEdSgVbLDNpippNQCIEXn8VtlBCG9FBtTUR7
+z8fGU8f+ijNYHMa6jNsDlSo45/RV+alQSSZhx3hPCIgO2klEkawBs0ikEjS5AQ0E
+UUZldAEIAL0CmXXJLZWMbKXEROAYFnUqQ4eNLUcLY1NfL9xrF2KP6apMXLJdftwz
+JtcenfD5vra8w5JJBn6cvY4Dr4zmueDSsN3Cpgr7c0trDNspAQMyUGmg4Cw7lAMr
+uIX2om1TTa5ALsQ1PfupnLFLFKbYd2MmfwEVHgEBAzqmr89RoG/NnlV4uxvWumb/
+OrLzzizGLHdLFjnq3Szl6wQPJwmxCtWHvzW/Y+HYclm+wp0sufvrXJ/G1RrHKxwh
+xaDVyLKsb5wkUC6SZmE477SP6ZCokoAGHqEK+5JnM9MYXreQ7N6NggRUseCokFaq
+ckze5wVBXmPuVAg76ScPFQd4JzLkGzUAEQEAAYkBHwQYAQIACQUCUUZldAIbDAAK
+CRC+CW4p7bjRQSkUCACPWdIvMXPtSQFnFR8oUIGxvcp9MYdealHNYkf3qgJTuWbH
+TeD8WpE53immju4hitOq/qDevKOWhcfSaLqCtdRyYQFFDWQt4SsiGdWfCvKiBMSM
+nrDQI9f+XCv7J3ute5alyMgv9Uo1XLyyiwhz9kJ9mzg+ENvy152PucI4TN63qMRQ
+MQbkAenrTzIer+5Q9ZY4TILC8pVVAIPQjTHuhdh8VMclTdkHab2PCFC57/3djJyY
+44PLhN3hLI4CElAGLUwBZLRa6OFOvwW5naivwgk0zeeTqq/jTOWPYiy2dyyX1pRX
+8bJh5et4mXyM7HLHRp+FblgWxpFWNvMCEpxujLsG
+=B/UT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BE096E29EDB8D141
+uid    Eric Lafortune (Key for signing ProGuard artefacts) <[email protected]>
+
+sub    E05A9780475FAB55
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFFGZXQBCADeZK9xuCrDwJ7v37y8RITlchzBfJEWv7cSbrSIBlFNAsUUoshW
+Y8U6xYKe0GdiLVta2F8bzs0Si4LcDeglQNi9Fxvh3/jfs0MEJUfSeZ4z1Mn5WY35
+utbdlHe6i+7qvhpHveREwWoWuvFGKeSCV8SioolG1mzxrDVLkQefPZ+Kr+xd2cYZ
+SIkbjdhCvJHcUkD9gs8Wz9q9eDyc7dGJmfBYaQ7Xa6lbd852qj8LjQ7Gd41yHU6T
+U3oo0kKfAPFkW7rX4zeJEBgpncK0i4ertd5to/y2hauqPU3VMExqNS0/L2GqKNmb
+Q2Me02pBSBCrLLCUJkm8jZorPNxlQxHpFLHDABEBAAG0T0VyaWMgTGFmb3J0dW5l
+IChLZXkgZm9yIHNpZ25pbmcgUHJvR3VhcmQgYXJ0ZWZhY3RzKSA8ZXJpY0BncmFw
+aGljcy5jb3JuZWxsLmVkdT6JATgEEwECACIFAlFGZXQCGwMGCwkIBwMCBhUIAgkK
+CwQWAgMBAh4BAheAAAoJEL4JbintuNFBUQ0H/1ahtWOeS+EEZqUxxgLE3aiuw6XR
+mcFY/9kRlnBsKpWGGyV0DRkLThXSV5fWwiP0+moef04Miv81txVXR3U5f4MY3U5J
+SDgeB1GK+BvcYz1CXxGcErgaMIDXu/K03OyQNp1lD2kjmDDz8SHdVqpv/aFfxWpL
+uMaogbStXfbDiMjeMg2zRcAzXqu7JlMt3z33uiTUZk9jubAPOBnP5/Yhuc2wcnfu
+cLUUL9xNE6gpl0Noy8qJ2TaVoHLfDEdSgVbLDNpippNQCIEXn8VtlBCG9FBtTUR7
+z8fGU8f+ijNYHMa6jNsDlSo45/RV+alQSSZhx3hPCIgO2klEkawBs0ikEjS5AQ0E
+UUZldAEIAL0CmXXJLZWMbKXEROAYFnUqQ4eNLUcLY1NfL9xrF2KP6apMXLJdftwz
+JtcenfD5vra8w5JJBn6cvY4Dr4zmueDSsN3Cpgr7c0trDNspAQMyUGmg4Cw7lAMr
+uIX2om1TTa5ALsQ1PfupnLFLFKbYd2MmfwEVHgEBAzqmr89RoG/NnlV4uxvWumb/
+OrLzzizGLHdLFjnq3Szl6wQPJwmxCtWHvzW/Y+HYclm+wp0sufvrXJ/G1RrHKxwh
+xaDVyLKsb5wkUC6SZmE477SP6ZCokoAGHqEK+5JnM9MYXreQ7N6NggRUseCokFaq
+ckze5wVBXmPuVAg76ScPFQd4JzLkGzUAEQEAAYkBHwQYAQIACQUCUUZldAIbDAAK
+CRC+CW4p7bjRQSkUCACPWdIvMXPtSQFnFR8oUIGxvcp9MYdealHNYkf3qgJTuWbH
+TeD8WpE53immju4hitOq/qDevKOWhcfSaLqCtdRyYQFFDWQt4SsiGdWfCvKiBMSM
+nrDQI9f+XCv7J3ute5alyMgv9Uo1XLyyiwhz9kJ9mzg+ENvy152PucI4TN63qMRQ
+MQbkAenrTzIer+5Q9ZY4TILC8pVVAIPQjTHuhdh8VMclTdkHab2PCFC57/3djJyY
+44PLhN3hLI4CElAGLUwBZLRa6OFOvwW5naivwgk0zeeTqq/jTOWPYiy2dyyX1pRX
+8bJh5et4mXyM7HLHRp+FblgWxpFWNvMCEpxujLsG
+=B/UT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    FD5DEA07FCB690A8
+uid    Baptiste Mathus (Baptiste <batmat> Mathus @ CloudBees) <[email protected]>
+uid    Baptiste Mathus (CloudBees alias for Baptiste <batmat> Mathus' account for infra access) <[email protected]>
+uid    Baptiste Mathus <[email protected]>
+
+sub    5F68B9B2F1725F16
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFFCLwoBCADxtcGi0nfolr1kGWe3jQ7n18roJFwBs4Q52nx0h4+a8ZGr7/1E
+1brakrz3t/cTSZIrhfru8kirP8cJtXBxpd/nCeRrB/4ZtXPUJiGwKx6sVGr0ix6U
+eZKQb3anH3jdGTzZ2csqt6Ro85SvIHfqAREcPOoQk7Kz3DFOGbSfECN2Wf1pTnRT
+jdF1Z5DkoTd8sGBmGOdhNMzgqMTHz6np6M2B/JVP5DpcKPbbMhQ75RPcxNEb4QSa
+HtCL+gMZiF7fndWx2Tjbpanbb5+TomfWOMizpkyziyYeUmGoyggrnXQ4BMlzsIuK
+ATz6wA5j4qfRLfoDDgNv5UacVAtWL+rlTP8NABEBAAG0TkJhcHRpc3RlIE1hdGh1
+cyAoQmFwdGlzdGUgPGJhdG1hdD4gTWF0aHVzIEAgQ2xvdWRCZWVzKSA8Ym1hdGh1
+c0BjbG91ZGJlZXMuY29tPokBOAQTAQIAIgUCV81wjAIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQ/V3qB/y2kKhonAf+Lcl9bj90OOyUANRNkZnuq2sLI+KD
+kerGmbwG7FJCM/Hvq6MgtNaXt98RfU7a1aBmmM6uTOBFko+7o8QXocnU/2TrlsnU
+yMHsFfO7OQSQJebSSyAyE1vy5VYzblsqgfs7Zreb3BO/awzr0GZXjR+g/q6ivxhK
++2pIkdfuBBkConNzoPqSC1f/F4qZuCi1e/VM5LmincIUEnWUR/PXpgXOwu/KoyzX
+X8VC/Vwk73vGaeBN3avCMVzNUmyYXELzcimcaa70ISKReUJvoYqHEDyVcMk9Yzjn
+VosDTfun0kUcfs2nd0ZySyygn80JHsZURIzEAnliz56lE8Fq5i2MO9o0ErRwQmFw
+dGlzdGUgTWF0aHVzIChDbG91ZEJlZXMgYWxpYXMgZm9yIEJhcHRpc3RlIDxiYXRt
+YXQ+IE1hdGh1cycgYWNjb3VudCBmb3IgaW5mcmEgYWNjZXNzKSA8Ym1hdGh1c0Bj
+bG91ZGJlZXMuY29tPokBOAQTAQIAIgUCV81mXwIbAwYLCQgHAwIGFQgCCQoLBBYC
+AwECHgECF4AACgkQ/V3qB/y2kKjQQQf+K6NNaERzm+5dkPOdmrVQQPAXrUxGW6b5
+Bsx12mU4qJKxQsq9tKsw9kdkvlP7rVhJATBk4J3ZYGWSqQajnVcAxznlWZVksWqo
+rCtYAH2+rhlUBo7/mvDnCW+z0vfEwBS4vQM3Oo83CyOecSnn98wp+W1O+TdCZVAf
+k8UOrODdc55VpXoQTw4PZ2uGr/56EFNYNXia6O7H0FuyDM6g5ilFd5Wxpp7qS7D7
+zJkWciSGmOwcw4NeeAMAu0bv8X9vmom30EEoFa6o3GHUJz0/DsbaoAOxcVMIymY+
+SzQQ+XyaHpTeRdpWB2qQo6BHSktm+vxp54811qSwyqPp0uKjHmVFLbQnQmFwdGlz
+dGUgTWF0aHVzIDxiYXB0aXN0ZUBjb2RlaGF1cy5vcmc+iQE4BBMBAgAiBQJRQi8K
+AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRD9XeoH/LaQqLyjB/9diBWw
+NMYG6UB3ijZYyUo0P3F49JcboW8U8vtGkDjZU8bSHkDQX/1mstMSTPoO63TrszRh
+UCn7lMxHfDaYVhbr6N622Jc10WhGiJICPGSz4azHdQA4e2tC2l2BCMnq7mvJ0bVx
+uqVb3VE5P2R884g3K8Jq3O3tjWTten5Z63UvqPcPmpN2C8WoI4EDWqxTAxyJs0GQ
+hNnfPDKycIpv7ESjprJ7c4oo/K0YUtlK5rF3eNorZSOrj6adsrdcf7IMvQxnI2Ro
+tFr49wqdvn3fTW7db+1qoXAvsHV7bHZPxc4OmOeCuqNOoh4J5ftROO8o0Gi/wC4B
+bniNzu7SndfMOTjXuQENBFFCLwoBCACaK5wadodZGLdBAAcRg9rwBzPy+F7ZXdwQ
+A1kHo0Z6xhQJP2/X3C/rEgKW59QhBLyEMBPELRtO5vTC5UYLu0pHK0XsOEacFVTW
+GQ+gLGp2UkScAJEgAQPYNNWrAz0MoAPQ//RW2Byph+WBVtgnP09nmq/WcXjv0tz7
+FrSFW/A0uADkcEdWGx6ItNiHRAZBgO4uzSY8GUw2YSEBjAilDwVs/Jftj5dlJlwI
+JzA0VzNIFunKwBTicMHSSHRNic+zlxMOs02a3XK3NBPv9a5DIffZuU9657rHmZM9
+zaS1PyHsMbpZsy+hFtxMFfVuViojg63ZC5eh9C/ghKCIbP0F+L9tABEBAAGJAR8E
+GAECAAkFAlFCLwoCGwwACgkQ/V3qB/y2kKgcqgf9EGoznHgOwfohcWsi6uIuLgsT
+ypd2f+zPAYpgySP8LK2+UZBnTzo6zxtWB0ZZAj8ICdciVOdcSYim/X29pRzygKYD
+JpHh7ZvvxeB9bxg7Gfd8Ml5Ycdf1x8L/Psi8kajbkMczrhClxhAR76Zqjpm6gvyi
+e+21f6qAnx9B+J5jQpN6p5uLg1Ac3dU+kY9MJLL8qy53yXxJHfcF+hMoAVZPajU2
+fzySiLttENnxXHIqJiYj/N53RJmcQdYLNjQNwfpq01DJy0k5nvXDGCZmgUB2T7w1
+sVIIF1w0sMxaEy8blxB+j25b3KhYYe9NiQvK+/gthDgWyhkHs2UALPQwIfd9ig==
+=YlII
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    FD5DEA07FCB690A8
+uid    Baptiste Mathus (Baptiste <batmat> Mathus @ CloudBees) <[email protected]>
+uid    Baptiste Mathus (CloudBees alias for Baptiste <batmat> Mathus' account for infra access) <[email protected]>
+uid    Baptiste Mathus <[email protected]>
+
+sub    5F68B9B2F1725F16
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFFCLwoBCADxtcGi0nfolr1kGWe3jQ7n18roJFwBs4Q52nx0h4+a8ZGr7/1E
+1brakrz3t/cTSZIrhfru8kirP8cJtXBxpd/nCeRrB/4ZtXPUJiGwKx6sVGr0ix6U
+eZKQb3anH3jdGTzZ2csqt6Ro85SvIHfqAREcPOoQk7Kz3DFOGbSfECN2Wf1pTnRT
+jdF1Z5DkoTd8sGBmGOdhNMzgqMTHz6np6M2B/JVP5DpcKPbbMhQ75RPcxNEb4QSa
+HtCL+gMZiF7fndWx2Tjbpanbb5+TomfWOMizpkyziyYeUmGoyggrnXQ4BMlzsIuK
+ATz6wA5j4qfRLfoDDgNv5UacVAtWL+rlTP8NABEBAAG0TkJhcHRpc3RlIE1hdGh1
+cyAoQmFwdGlzdGUgPGJhdG1hdD4gTWF0aHVzIEAgQ2xvdWRCZWVzKSA8Ym1hdGh1
+c0BjbG91ZGJlZXMuY29tPokBOAQTAQIAIgUCV81wjAIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQ/V3qB/y2kKhonAf+Lcl9bj90OOyUANRNkZnuq2sLI+KD
+kerGmbwG7FJCM/Hvq6MgtNaXt98RfU7a1aBmmM6uTOBFko+7o8QXocnU/2TrlsnU
+yMHsFfO7OQSQJebSSyAyE1vy5VYzblsqgfs7Zreb3BO/awzr0GZXjR+g/q6ivxhK
++2pIkdfuBBkConNzoPqSC1f/F4qZuCi1e/VM5LmincIUEnWUR/PXpgXOwu/KoyzX
+X8VC/Vwk73vGaeBN3avCMVzNUmyYXELzcimcaa70ISKReUJvoYqHEDyVcMk9Yzjn
+VosDTfun0kUcfs2nd0ZySyygn80JHsZURIzEAnliz56lE8Fq5i2MO9o0ErRwQmFw
+dGlzdGUgTWF0aHVzIChDbG91ZEJlZXMgYWxpYXMgZm9yIEJhcHRpc3RlIDxiYXRt
+YXQ+IE1hdGh1cycgYWNjb3VudCBmb3IgaW5mcmEgYWNjZXNzKSA8Ym1hdGh1c0Bj
+bG91ZGJlZXMuY29tPokBOAQTAQIAIgUCV81mXwIbAwYLCQgHAwIGFQgCCQoLBBYC
+AwECHgECF4AACgkQ/V3qB/y2kKjQQQf+K6NNaERzm+5dkPOdmrVQQPAXrUxGW6b5
+Bsx12mU4qJKxQsq9tKsw9kdkvlP7rVhJATBk4J3ZYGWSqQajnVcAxznlWZVksWqo
+rCtYAH2+rhlUBo7/mvDnCW+z0vfEwBS4vQM3Oo83CyOecSnn98wp+W1O+TdCZVAf
+k8UOrODdc55VpXoQTw4PZ2uGr/56EFNYNXia6O7H0FuyDM6g5ilFd5Wxpp7qS7D7
+zJkWciSGmOwcw4NeeAMAu0bv8X9vmom30EEoFa6o3GHUJz0/DsbaoAOxcVMIymY+
+SzQQ+XyaHpTeRdpWB2qQo6BHSktm+vxp54811qSwyqPp0uKjHmVFLbQnQmFwdGlz
+dGUgTWF0aHVzIDxiYXB0aXN0ZUBjb2RlaGF1cy5vcmc+iQE4BBMBAgAiBQJRQi8K
+AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRD9XeoH/LaQqLyjB/9diBWw
+NMYG6UB3ijZYyUo0P3F49JcboW8U8vtGkDjZU8bSHkDQX/1mstMSTPoO63TrszRh
+UCn7lMxHfDaYVhbr6N622Jc10WhGiJICPGSz4azHdQA4e2tC2l2BCMnq7mvJ0bVx
+uqVb3VE5P2R884g3K8Jq3O3tjWTten5Z63UvqPcPmpN2C8WoI4EDWqxTAxyJs0GQ
+hNnfPDKycIpv7ESjprJ7c4oo/K0YUtlK5rF3eNorZSOrj6adsrdcf7IMvQxnI2Ro
+tFr49wqdvn3fTW7db+1qoXAvsHV7bHZPxc4OmOeCuqNOoh4J5ftROO8o0Gi/wC4B
+bniNzu7SndfMOTjXuQENBFFCLwoBCACaK5wadodZGLdBAAcRg9rwBzPy+F7ZXdwQ
+A1kHo0Z6xhQJP2/X3C/rEgKW59QhBLyEMBPELRtO5vTC5UYLu0pHK0XsOEacFVTW
+GQ+gLGp2UkScAJEgAQPYNNWrAz0MoAPQ//RW2Byph+WBVtgnP09nmq/WcXjv0tz7
+FrSFW/A0uADkcEdWGx6ItNiHRAZBgO4uzSY8GUw2YSEBjAilDwVs/Jftj5dlJlwI
+JzA0VzNIFunKwBTicMHSSHRNic+zlxMOs02a3XK3NBPv9a5DIffZuU9657rHmZM9
+zaS1PyHsMbpZsy+hFtxMFfVuViojg63ZC5eh9C/ghKCIbP0F+L9tABEBAAGJAR8E
+GAECAAkFAlFCLwoCGwwACgkQ/V3qB/y2kKgcqgf9EGoznHgOwfohcWsi6uIuLgsT
+ypd2f+zPAYpgySP8LK2+UZBnTzo6zxtWB0ZZAj8ICdciVOdcSYim/X29pRzygKYD
+JpHh7ZvvxeB9bxg7Gfd8Ml5Ycdf1x8L/Psi8kajbkMczrhClxhAR76Zqjpm6gvyi
+e+21f6qAnx9B+J5jQpN6p5uLg1Ac3dU+kY9MJLL8qy53yXxJHfcF+hMoAVZPajU2
+fzySiLttENnxXHIqJiYj/N53RJmcQdYLNjQNwfpq01DJy0k5nvXDGCZmgUB2T7w1
+sVIIF1w0sMxaEy8blxB+j25b3KhYYe9NiQvK+/gthDgWyhkHs2UALPQwIfd9ig==
+=YlII
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    461A804F2609FD89
+sub    8067ECAA8D58321C
+sub    750F9A735EECF640
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=QNgn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    461A804F2609FD89
+sub    8067ECAA8D58321C
+sub    750F9A735EECF640
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=QNgn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    461A804F2609FD89
+sub    8067ECAA8D58321C
+sub    750F9A735EECF640
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=QNgn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    CE8B1D1D2530EDC5
+sub    7ECBD740FF06AEB5
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=R7zg
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0DA8A5EC02D11EAD
+sub    71499A87DC1FF84B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBE3LMfMRBAD90h69D8yyPWaSoAyh2mOOOZ/XH0isuBpDZCWptemlMHgImqdQ
+2sXLXYT1bJKmSaMw+yKjp8J/NYk69EbmSK1C2nypLQtWhUmXXd3XVYw6hrG/dGvi
+gjkS5eq8L04f5CSuXO7r1eLTOch9iDl/ESaI5Nhq9A3mRQIhQalum+FjzwCgx0PK
+hoC4MVPVGXzOQPc5sG4jzAUD/0OX9c/yKQqjHUs38HTCgrjseM40iPhp8NfbWenP
+IwUMSWXE3lz0MMeKrGcEOcZOGWsjyepkLHXwj8DDOeGxhfh9bhFRJssdfzOCKBpf
+6S70A3fanzqOAvddxCqF/zOwDaieDmWvVntVpmZO9d+pgR/sZN0JgSIm7qGDdNqG
+Aq6eBACyywfwuVoY6lfNz70ZZqYjYuUkbKnKqpG0XmI+m5LYrUW7QuKJqaNdg+ZL
+vVgX/TdkWVSIoSRS5+eYm3fRD++cg3ZgoR6ZY4WEa7SRSp2zoidtQijWOzp8WeHs
+30rIaXBrb5wHR4GQ4FYsBGRuWkmIaferusllUmHCHFJI4ldvgbkCDQRNyzHzEAgA
+1rD70DvCcy91ShQKP2snZ4cLJnFwKArulDUcxoBZ0AG0qMbaE8jiiJTHIwgVrqsK
+aS1JENv6tVdUS8xHswu30zvd0obaj+4IGXlMVdc6052Y4SLAGNbGVw99Ah1OkQ7o
+v92gmYAYfqppOtRt1tylz7Jf+F6er0umdVBZm8fJ+QjzTw36AwERj2bjVbc6ogM7
+OsTyru5oZGOJ+oJU+M9/mh/Gq3AyrcfU8c6bL2pacXwylME4lxy4fBB7BsMogPXX
+iplZ2XRH7RmlZiAfLHv3StxVB1RrLXVcjdnqIO2guVYrK6mxH9WMG4LnOGvcnYTf
+GtWexEmNA5l8IOSgsK+InwADBQgA037clDFi3XWaZBVXst7IfkU6bKq9vhmphS4f
+uBx4wp7MBA62k0kGDmZWcbinZWnybypili9ihYSHlp3EYzCNTbUMWlbhc/ffYHuv
+rZsIT2DxMPb2iCnjPu5HMGegTM8iTTotW4xYmJUsEDIvgQUz0/UNsPHTX5XU09So
+cL3YOP5MxcEbgO0Fpjny3X76rc+ETAd9TmDJi7HOm24grKdOQXHQJr65j7nTc9M3
+zWnTxOP3fL9jcVnGTnLGRVoR7kedDpa5FsoFqtY8YMaFvNPVvI4+m+jozjNwTg2d
+GG6nU2dEC0qgDEeKMSJwF1wgO3Fe6mXHvxratgNrqfdY/rtEGYhJBBgRAgAJBQJN
+yzHzAhsMAAoJEA2opewC0R6tNKgAnigkHDCNu7Owm8x01E9+aL73JmDXAKCj7ROh
+7Wu1iZQbjeJfypM6CQ+fdw==
+=GCHG
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    21A24B3F8B0F594A
+uid    Karl Heinz Marbaise (Apache Software Foundation) <[email protected]>
+
+sub    D658968EFD5E9F85
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=klCb
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    21A24B3F8B0F594A
+uid    Karl Heinz Marbaise (Apache Software Foundation) <[email protected]>
+
+sub    D658968EFD5E9F85
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=klCb
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    02216ED811210DAA
+sub    8C40458A5F28CF7B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBGADx6IBDADoHin1LGQ8dhnlhfNCBZ3IyXS2NpR1VjmYtHSlh1hGsPcmHuwo
+1mLA6JzXF7NuK3Y52pbTr6vz9bAap8Ysjq/3UJeiDbf7FvmO5xAEVUhrpc7AEY7G
+Wygi+HqK5OaNhxUr7OmHY4N2/NxXiYGD2PNU3mXkOszpQJk3yVKgjmGnv0zbTpn2
+wwsXygc87nG/h2R4YQ80m9UknkPR63vRwPnsTwovG9CAb8RyHq+6P81vKE/U5GUJ
+TzV1BDY95niypsCYja2QR4Gi5TKlpsUjT4sT32l6/CqOhcpwO05pTv0fvoHDbDx6
+/gHivgyVUyPbQzUwYfMYoINePOaX37okHQE8n5QPPx6HmXfIhumKbXi6ppVPjPG6
+cB2Lq/F6UKHlttiwWgSIiLDC+UbFCVvc41Lrydbt/2eXoBGxWbU6DUSGnefKymP3
+c3IsgdzeP11tlfaxLVz60lomXMeyyXD41QzeuyzUNvoSgiqSE6BO9EqeCyk1/n+O
+Are5EFnyLBjChgkAEQEAAbkBjQRgA8eiAQwAuC4Z9laL4sRX8FTseTzd5/8AqBKk
+gtrZjW5onrse1hWpkjeB42qfhVrfUorkpGY9N0xo7jZT7PhXuOEB1WRcJPHA11Q4
+166WkHRDv7IwPGAQr6LsJAAlZYkV2d3BXoWoS4ATCH1jyXaxKT/jNGBazs+Nqprh
+ypL6X2xOIqKozehjTMfD1cFzFzoaZvD+G9qdk0w7qikUIla0Y3ADswtMLH32mszw
+9g0ddFSimmWQ8scVcaalt9k9ATX7zMJKmYaYi6fWsH/Le13DhJgQMjjh1BeUguIP
+r6pRoBZ/5xJxJ7OKIRk4pk6h7BImGMKTCONICf41i4kGsZMoRb2XvLDgSNs9gYKp
+N9+J7TYTeqofBxxQLH6cVplBPoNCkJun6scYJLWAepr4u0K5RTnU7y9iigiTTFeV
+xbSjuxIEzLk9gVKD1hsbtkLVmkxMljqJG5El3I7qu7eM2c1ufo22BFjHom1CmtWd
+oai56nxG5zv1WDsMRJukaXbDwbpSkb45rj09ABEBAAGJAbwEGAEIACYWIQSFaclc
+rcUIsJ/pDzACIW7YESENqgUCYAPHogIbDAUJA8JnAAAKCRACIW7YESENqpGYC/0Q
+NoVAXMkCa0Iei/kGdzZNLKpiG0nZIJGuml9T7eMyp0QQXzenOahCGhna4QQvSBER
+UZb9HzP/0xY93C8FEXv7Ns972XdeOvYjpOLG6euRwWLD//c5Ah7siSgUJ7CFPBHj
+r9mnZXzYjhvXT0eJlb96j0rBuSblG/NXu1oEJPySqP7vkK2ZZsHNoGfSoGlGtush
+YtUP568KMzz4LsnOfSLnkOc9Hh0qydipY+ocfQQhh7tLUzFsMbG80yWw4/2JVicT
+nTosdl4J9WyI3Xuqa423XEAC25dS0aQNeDa4lpfmOOyj5ViJISdutlVC3zmtkpXE
+xUXqb+AcsNDOuulUhVjw7KpKX7xUXJM+LSg57lfyGHiLejDHvPAXBSfzFxT9ZDxO
+92MhvR7JqP1Z0SvZ/yZ1RAidKaNJs3o1Dk/WbuxnRYjyf4URhfUVeH8tykNDIMJr
+gY4uKjJu0S9RuzG1PVw85w5f6UDZlJ01gGvtT81JFrizhvS9t0HoPbDcDhG5iVE=
+=Lmqo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    02216ED811210DAA
+sub    8C40458A5F28CF7B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBGADx6IBDADoHin1LGQ8dhnlhfNCBZ3IyXS2NpR1VjmYtHSlh1hGsPcmHuwo
+1mLA6JzXF7NuK3Y52pbTr6vz9bAap8Ysjq/3UJeiDbf7FvmO5xAEVUhrpc7AEY7G
+Wygi+HqK5OaNhxUr7OmHY4N2/NxXiYGD2PNU3mXkOszpQJk3yVKgjmGnv0zbTpn2
+wwsXygc87nG/h2R4YQ80m9UknkPR63vRwPnsTwovG9CAb8RyHq+6P81vKE/U5GUJ
+TzV1BDY95niypsCYja2QR4Gi5TKlpsUjT4sT32l6/CqOhcpwO05pTv0fvoHDbDx6
+/gHivgyVUyPbQzUwYfMYoINePOaX37okHQE8n5QPPx6HmXfIhumKbXi6ppVPjPG6
+cB2Lq/F6UKHlttiwWgSIiLDC+UbFCVvc41Lrydbt/2eXoBGxWbU6DUSGnefKymP3
+c3IsgdzeP11tlfaxLVz60lomXMeyyXD41QzeuyzUNvoSgiqSE6BO9EqeCyk1/n+O
+Are5EFnyLBjChgkAEQEAAbkBjQRgA8eiAQwAuC4Z9laL4sRX8FTseTzd5/8AqBKk
+gtrZjW5onrse1hWpkjeB42qfhVrfUorkpGY9N0xo7jZT7PhXuOEB1WRcJPHA11Q4
+166WkHRDv7IwPGAQr6LsJAAlZYkV2d3BXoWoS4ATCH1jyXaxKT/jNGBazs+Nqprh
+ypL6X2xOIqKozehjTMfD1cFzFzoaZvD+G9qdk0w7qikUIla0Y3ADswtMLH32mszw
+9g0ddFSimmWQ8scVcaalt9k9ATX7zMJKmYaYi6fWsH/Le13DhJgQMjjh1BeUguIP
+r6pRoBZ/5xJxJ7OKIRk4pk6h7BImGMKTCONICf41i4kGsZMoRb2XvLDgSNs9gYKp
+N9+J7TYTeqofBxxQLH6cVplBPoNCkJun6scYJLWAepr4u0K5RTnU7y9iigiTTFeV
+xbSjuxIEzLk9gVKD1hsbtkLVmkxMljqJG5El3I7qu7eM2c1ufo22BFjHom1CmtWd
+oai56nxG5zv1WDsMRJukaXbDwbpSkb45rj09ABEBAAGJAbwEGAEIACYWIQSFaclc
+rcUIsJ/pDzACIW7YESENqgUCYAPHogIbDAUJA8JnAAAKCRACIW7YESENqpGYC/0Q
+NoVAXMkCa0Iei/kGdzZNLKpiG0nZIJGuml9T7eMyp0QQXzenOahCGhna4QQvSBER
+UZb9HzP/0xY93C8FEXv7Ns972XdeOvYjpOLG6euRwWLD//c5Ah7siSgUJ7CFPBHj
+r9mnZXzYjhvXT0eJlb96j0rBuSblG/NXu1oEJPySqP7vkK2ZZsHNoGfSoGlGtush
+YtUP568KMzz4LsnOfSLnkOc9Hh0qydipY+ocfQQhh7tLUzFsMbG80yWw4/2JVicT
+nTosdl4J9WyI3Xuqa423XEAC25dS0aQNeDa4lpfmOOyj5ViJISdutlVC3zmtkpXE
+xUXqb+AcsNDOuulUhVjw7KpKX7xUXJM+LSg57lfyGHiLejDHvPAXBSfzFxT9ZDxO
+92MhvR7JqP1Z0SvZ/yZ1RAidKaNJs3o1Dk/WbuxnRYjyf4URhfUVeH8tykNDIMJr
+gY4uKjJu0S9RuzG1PVw85w5f6UDZlJ01gGvtT81JFrizhvS9t0HoPbDcDhG5iVE=
+=Lmqo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    10066A9707090CF9
+sub    2B9F5DBAEAB53FE8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFGKp5ABCADTyMhDq+7Kcv2wXOpOmZgp++JNO1erNUjVqFX7n9bT77DciEML
+LNxWVF1tkNqgkn0ughZTXK5EGdjUfZaJaDDfG4BIsox/ng4nDvIp4CtXqHbWqrlc
+SPsMl82uABh7ZJgsZM4Z7c8KirxYL42MiWu6hhRqfJZigWUd+ceKEDuFcNHcEA6h
+98LWFCZ7KHjKhZpUbMBurd5f+N2mn06YnVZrHVzX+q6REWGToF3p+mrBwstrGaiU
+j78gMgZnI2tiJ99HqmocjLXbwXxdvFmLkniBHAQ91D9fHfYL3odTEkjZ/Wi7DSZt
+PAbEhbBIKpFKnbazyMB8ACeF+m7jQ/Nq1+g7ABEBAAG5AQ0EUYqnkAEIAOMb65Q/
+m/7+A8XBVNXgoyGDksgTDSIfvePi4saGdSJOcQWc2HbEHFhqcOqr50h0aOEBN+7W
+B7X8ZMqqeCub1BlXLAs9gWhw5QK4mAKCtaARpmWj4sr22JscpMi4uutgcsfakRae
+Tmd1J7efjcDNL0/EsQKQSGht1AakJN8zfyb6IBuuAqj3xegwFCu3MRanRyY8DP4C
+YXfIyLBPLWfDVBViK0HOjEMEO7tdvsZ8h6ptLNqAYQQYcHFi75lKa626RVeEbxK3
+dptWfA7vQ59PlnsMhUZkiDDPzhnIatpfdBgA8EpBJ2Lrq7hE0nZI4/0rn/wxIPT9
+Ibl9JWeSfoT7Vc8AEQEAAYkBJQQYAQIADwUCUYqnkAIbDAUJBaOagAAKCRAQBmqX
+BwkM+aaFB/9TyOSAJtb7qonJ8Q5Un4JLIhfTIaBj3cMHzP0ZbotpskDqnvRhUe9f
+OM0KG+OibqaW8hKT3ZQVVIJeSVUCDYyrWX93KPV/tiL5F+5WWN+/L6Uvp6598oiA
+ZvYBNNA5Gzn8kh4b5d68Qyr9W/2TAWm+jVYywlguNHsysLLTvPVG5OGK48/dYSeO
+2PyCy7hpxV0z+xDinDDiVjwXc+vHoTg8ZDILQG83ZsICO7dO5FACCpFuKu2mjDvo
+bcV4ajxKHNvnnNwFUxuGNogQOiMaeH62T/WBCdeyE8X0A+UsH6WVXmXkCSDxRD96
+UdK1vJJR/sRkoSFvf8E1KmFZR351/wZQiQElBBgBAgAPAhsMBQJX8oreBQkZM+ZJ
+AAoJEBAGapcHCQz5ax8IAIMnwmPs5nvuo6A8mSEmKXzW2M9K4CimmR2HhLtFoo6n
+HRcrL05I/XUq4YxqQLMmZeQ+N3lk5RVfZwJDIY3NzR/R0dGiRP4z6F1sz7qRPYxL
+faFA8anPzrfW8tNtD9QeXhG9k2H4WVYdPwQe7zKmyf42XrJSX8bpgxAoRdGR6atr
+VZFf4Dwgua+SdIrSpeiqXCqPVSh6xoQ6svNXwnee94zY8/R8I+6gqI7E0XaZY8ub
+q4Ep950wDEkOIBB3HsTgUauXd9vdkFMnO20JWZRujDcE6U4GJsG6OsgllB2e0m9V
+OL8rBTxpelg6gJCVVXLOLUbuZ9UUebjIiAABCA6V/9A=
+=HrWq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    10066A9707090CF9
+sub    2B9F5DBAEAB53FE8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFGKp5ABCADTyMhDq+7Kcv2wXOpOmZgp++JNO1erNUjVqFX7n9bT77DciEML
+LNxWVF1tkNqgkn0ughZTXK5EGdjUfZaJaDDfG4BIsox/ng4nDvIp4CtXqHbWqrlc
+SPsMl82uABh7ZJgsZM4Z7c8KirxYL42MiWu6hhRqfJZigWUd+ceKEDuFcNHcEA6h
+98LWFCZ7KHjKhZpUbMBurd5f+N2mn06YnVZrHVzX+q6REWGToF3p+mrBwstrGaiU
+j78gMgZnI2tiJ99HqmocjLXbwXxdvFmLkniBHAQ91D9fHfYL3odTEkjZ/Wi7DSZt
+PAbEhbBIKpFKnbazyMB8ACeF+m7jQ/Nq1+g7ABEBAAG5AQ0EUYqnkAEIAOMb65Q/
+m/7+A8XBVNXgoyGDksgTDSIfvePi4saGdSJOcQWc2HbEHFhqcOqr50h0aOEBN+7W
+B7X8ZMqqeCub1BlXLAs9gWhw5QK4mAKCtaARpmWj4sr22JscpMi4uutgcsfakRae
+Tmd1J7efjcDNL0/EsQKQSGht1AakJN8zfyb6IBuuAqj3xegwFCu3MRanRyY8DP4C
+YXfIyLBPLWfDVBViK0HOjEMEO7tdvsZ8h6ptLNqAYQQYcHFi75lKa626RVeEbxK3
+dptWfA7vQ59PlnsMhUZkiDDPzhnIatpfdBgA8EpBJ2Lrq7hE0nZI4/0rn/wxIPT9
+Ibl9JWeSfoT7Vc8AEQEAAYkBJQQYAQIADwUCUYqnkAIbDAUJBaOagAAKCRAQBmqX
+BwkM+aaFB/9TyOSAJtb7qonJ8Q5Un4JLIhfTIaBj3cMHzP0ZbotpskDqnvRhUe9f
+OM0KG+OibqaW8hKT3ZQVVIJeSVUCDYyrWX93KPV/tiL5F+5WWN+/L6Uvp6598oiA
+ZvYBNNA5Gzn8kh4b5d68Qyr9W/2TAWm+jVYywlguNHsysLLTvPVG5OGK48/dYSeO
+2PyCy7hpxV0z+xDinDDiVjwXc+vHoTg8ZDILQG83ZsICO7dO5FACCpFuKu2mjDvo
+bcV4ajxKHNvnnNwFUxuGNogQOiMaeH62T/WBCdeyE8X0A+UsH6WVXmXkCSDxRD96
+UdK1vJJR/sRkoSFvf8E1KmFZR351/wZQiQElBBgBAgAPAhsMBQJX8oreBQkZM+ZJ
+AAoJEBAGapcHCQz5ax8IAIMnwmPs5nvuo6A8mSEmKXzW2M9K4CimmR2HhLtFoo6n
+HRcrL05I/XUq4YxqQLMmZeQ+N3lk5RVfZwJDIY3NzR/R0dGiRP4z6F1sz7qRPYxL
+faFA8anPzrfW8tNtD9QeXhG9k2H4WVYdPwQe7zKmyf42XrJSX8bpgxAoRdGR6atr
+VZFf4Dwgua+SdIrSpeiqXCqPVSh6xoQ6svNXwnee94zY8/R8I+6gqI7E0XaZY8ub
+q4Ep950wDEkOIBB3HsTgUauXd9vdkFMnO20JWZRujDcE6U4GJsG6OsgllB2e0m9V
+OL8rBTxpelg6gJCVVXLOLUbuZ9UUebjIiAABCA6V/9A=
+=HrWq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D9C565AA72BA2FDD
+uid    grpc-java-team-sonatype <[email protected]>
+
+sub    9121AD263441EEDD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=t7l/
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    CFAE163B64AC9189
+uid    JetBrains Compose Team <[email protected]>
+
+sub    57CE36BB68F1BC57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mDMEYYx3eRYJKwYBBAHaRw8BAQdAV7zh1T+xL7mD2O63rTIvRfQ9kwL2Gvq/Q6PD
+9apCe2K0LkpldEJyYWlucyBDb21wb3NlIFRlYW0gPGNvbXBvc2VAamV0YnJhaW5z
+LmNvbT6ImgQTFgoAQhYhBCByOmOZvAYBVCg7N8+uFjtkrJGJBQJhjHd5AhsDBQkD
+wmcABQsJCAcCAyICAQYVCgkICwIEFgIDAQIeBwIXgAAKCRDPrhY7ZKyRiRslAQCE
+XiOkwreTSEDg7UXsRd1IruaQEUkrAFsk+1/FkqqvcwEAiAx2FgUTgDV8RoflRcaB
+kqPfkSvkvUBuJBQwqjGuhwa4OARhjHd5EgorBgEEAZdVAQUBAQdA/AOwflH/rum1
+g1gvFPBcqhvFOcN80VUb7OqoENSzUD4DAQgHiH4EGBYKACYWIQQgcjpjmbwGAVQo
+OzfPrhY7ZKyRiQUCYYx3eQIbDAUJA8JnAAAKCRDPrhY7ZKyRiSq0AQCEwGRGd5MO
+TT2kKJf9CphX0LOsqVBBSNvzoloV04wzywD+P4TmIz/CsigszDQy8yl1/rGvszo7
+gaUwnfnqN61JHgA=
+=DQGj
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    CFAE163B64AC9189
+uid    JetBrains Compose Team <[email protected]>
+
+sub    57CE36BB68F1BC57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mDMEYYx3eRYJKwYBBAHaRw8BAQdAV7zh1T+xL7mD2O63rTIvRfQ9kwL2Gvq/Q6PD
+9apCe2K0LkpldEJyYWlucyBDb21wb3NlIFRlYW0gPGNvbXBvc2VAamV0YnJhaW5z
+LmNvbT6ImgQTFgoAQhYhBCByOmOZvAYBVCg7N8+uFjtkrJGJBQJhjHd5AhsDBQkD
+wmcABQsJCAcCAyICAQYVCgkICwIEFgIDAQIeBwIXgAAKCRDPrhY7ZKyRiRslAQCE
+XiOkwreTSEDg7UXsRd1IruaQEUkrAFsk+1/FkqqvcwEAiAx2FgUTgDV8RoflRcaB
+kqPfkSvkvUBuJBQwqjGuhwa4OARhjHd5EgorBgEEAZdVAQUBAQdA/AOwflH/rum1
+g1gvFPBcqhvFOcN80VUb7OqoENSzUD4DAQgHiH4EGBYKACYWIQQgcjpjmbwGAVQo
+OzfPrhY7ZKyRiQUCYYx3eQIbDAUJA8JnAAAKCRDPrhY7ZKyRiSq0AQCEwGRGd5MO
+TT2kKJf9CphX0LOsqVBBSNvzoloV04wzywD+P4TmIz/CsigszDQy8yl1/rGvszo7
+gaUwnfnqN61JHgA=
+=DQGj
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    F800DD0933ECF7F7
+sub    592C39141EB02A78
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQMuBEvQhhQRCADQ2MH2FpQD7pbCTDJ4uvPSeaOz0IUhkX9bK4sKvIISx8MbHhR4
+k4sXi+vVkLngWCMUV4nB4WcCibk2S184SzL0TstTDrudxe4eJFVbmZw0GrgASugQ
+aD+8daVhMgQZEjvEB7kjaYzMyljzVRE/o30AaizHPMVytZQpIL7GTsaBcGtxLkyq
+JG+SF+fN3WAKiMyKCUTaji1owY5SyZIbPBBHqcIQVdtCFRPXhLDNnGHUz/ubI4Fn
+U5sN9gEe7raXQfvZzwS6fW2SaxhxMXDNVDEipY7okuRKQ0wPWqcanh9dri8qoTfI
+7MOqfWWKL3NF1hnjuutyGTTKCllyTWEW4MfjAQCJBTUh43abqyHej9Dzcc2lSgLn
+xeN5iM48tYZRv+aYxQf/b9rWigbReKL7iYmCTqd+hLfh0YDmaJbZ8ZZM4p/YZ5tL
+NdkNJR5TiWwH9ub0BvXYOtYUwclOaaD85CKNN8IU+A/YcrWP2O8fBQw5lqARuGx+
+TjG7c+WRVn+fLrTzrzbUYh+/Jg5UYCbDYh6H2kLKnPVQPzSjDScJNtevFnX+IRjT
+7woB/WHlrfvowZGO1kclypZZS6nDiPYhEk1isEU+nD7OvvM1fQN1rdl0QhkLUh2w
+qKiM3xvY42LGicnJcxyMSODkYlG6J6OE2sFDBJ1axa90+S8Jze1fBlbQVb7OF6ma
+31mhOedb6xiqJ17/5Kx9gPEUpVMpkrDUVToIv18c6wf+J2TJ1sdMPqUsiuKHDQq1
+elTxtfq5ELQoNlnuK+mRrsSMfa1I6jE7QbZkCcoTNnD5ikOVmkHJFQlEZsmaKCrD
+oUpEyELdzFy1ghfGDPbvv1a5AoGVsR+sj39XNckBgZS+25vZupBxWvTd8Fj/KY5l
+a1aQlPUyMgqmo7rdE3WEzv7v11xBy6wQMAoGu6lp9tnaAE7sPEy/UHuYSexCO3Ar
+83sZ9o9ZQa+z33QU5Z0guNz+efCkFfG4nqjHjZ8ZY5VvWlw0W2gxNqzNCeQR7m14
+C4J2TNNn/F2nGAKEpKEgp8IjpEXYZ6kF9xoSkJ07bjujvf5vtvAm10h+ZEumKSiS
+mbkCDQRL0IYUEAgA7Ci1jY5JdrLs7pKjhbqP1lkZKDRn+0fDgix9y2JP2O0lJ6Am
+SAVUE6Mi+izqV97q3vMmOkIuDFLoBP79/YOaDlMWAj9QelNWwz30yT6LB5Wgw0c/
+Tpi5lQD5K75L84u2vAFjoOwvnLx3cKjC7TG2h7zxt9EHEtLFAFP2JBtsMvcmpFPP
+Ucpv0+/RFLhRV6JPxEUKiVbz52pgBLSa83vtZI4d6CDu/W3QXvCw7uYoTWx7e0+K
+rrZj3LE7KUzEa/Vazsn6Nwhi7VL0irNOZJGALdhrxLA8iGnPYDys78vPBWB3k4VQ
+G7rgvdVXiAldMNtoy7sNuhtI8Cicgl0JG/6flwADBQf+O8kWSrda5ezDK7vWAhBh
+r3tEMIE08eL/HPErE3DOzud8oyV8B7Z89ZOjSqzn/6EQdnEGnVRr/isOJcmgAXQQ
+RpJfFQ4dnpEeestJ5y5hzrtbMvfZ/Wms3WFgjgfYl5+TAbSF3Gz9VNn5AmaeA18i
+d8qzNVQ/e8J9zXfLV62qRLzbAS74K6rzGpYaZEWFAid1KLTu0S+I/ZuvQfZ83jyq
+oenwS0iYawM824w5oCDN/+8cDzLcHipN+B6g6S+X9m8s5E3RZGVKqUjd+fTRg0LY
+JkkasJwQa+20AadpCE0RZtR82jrbyLfNY2FFJT3TKYnaVhYcjpPBqffevhwSRIEs
+KYhnBBgRCAAPBQJL0IYUAhsMBQkDwmcAAAoJEPgA3Qkz7Pf3m+4A/RghXcZwWrZB
+/vvvAfhkYQeQJjPmYluGNebJ4wPi5ZI8AQCBjv2b6yDTWPenmPNeSB88HWjSL8/A
+mimEzF5VTg7GrQ==
+=Q4rB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    F800DD0933ECF7F7
+sub    592C39141EB02A78
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQMuBEvQhhQRCADQ2MH2FpQD7pbCTDJ4uvPSeaOz0IUhkX9bK4sKvIISx8MbHhR4
+k4sXi+vVkLngWCMUV4nB4WcCibk2S184SzL0TstTDrudxe4eJFVbmZw0GrgASugQ
+aD+8daVhMgQZEjvEB7kjaYzMyljzVRE/o30AaizHPMVytZQpIL7GTsaBcGtxLkyq
+JG+SF+fN3WAKiMyKCUTaji1owY5SyZIbPBBHqcIQVdtCFRPXhLDNnGHUz/ubI4Fn
+U5sN9gEe7raXQfvZzwS6fW2SaxhxMXDNVDEipY7okuRKQ0wPWqcanh9dri8qoTfI
+7MOqfWWKL3NF1hnjuutyGTTKCllyTWEW4MfjAQCJBTUh43abqyHej9Dzcc2lSgLn
+xeN5iM48tYZRv+aYxQf/b9rWigbReKL7iYmCTqd+hLfh0YDmaJbZ8ZZM4p/YZ5tL
+NdkNJR5TiWwH9ub0BvXYOtYUwclOaaD85CKNN8IU+A/YcrWP2O8fBQw5lqARuGx+
+TjG7c+WRVn+fLrTzrzbUYh+/Jg5UYCbDYh6H2kLKnPVQPzSjDScJNtevFnX+IRjT
+7woB/WHlrfvowZGO1kclypZZS6nDiPYhEk1isEU+nD7OvvM1fQN1rdl0QhkLUh2w
+qKiM3xvY42LGicnJcxyMSODkYlG6J6OE2sFDBJ1axa90+S8Jze1fBlbQVb7OF6ma
+31mhOedb6xiqJ17/5Kx9gPEUpVMpkrDUVToIv18c6wf+J2TJ1sdMPqUsiuKHDQq1
+elTxtfq5ELQoNlnuK+mRrsSMfa1I6jE7QbZkCcoTNnD5ikOVmkHJFQlEZsmaKCrD
+oUpEyELdzFy1ghfGDPbvv1a5AoGVsR+sj39XNckBgZS+25vZupBxWvTd8Fj/KY5l
+a1aQlPUyMgqmo7rdE3WEzv7v11xBy6wQMAoGu6lp9tnaAE7sPEy/UHuYSexCO3Ar
+83sZ9o9ZQa+z33QU5Z0guNz+efCkFfG4nqjHjZ8ZY5VvWlw0W2gxNqzNCeQR7m14
+C4J2TNNn/F2nGAKEpKEgp8IjpEXYZ6kF9xoSkJ07bjujvf5vtvAm10h+ZEumKSiS
+mbkCDQRL0IYUEAgA7Ci1jY5JdrLs7pKjhbqP1lkZKDRn+0fDgix9y2JP2O0lJ6Am
+SAVUE6Mi+izqV97q3vMmOkIuDFLoBP79/YOaDlMWAj9QelNWwz30yT6LB5Wgw0c/
+Tpi5lQD5K75L84u2vAFjoOwvnLx3cKjC7TG2h7zxt9EHEtLFAFP2JBtsMvcmpFPP
+Ucpv0+/RFLhRV6JPxEUKiVbz52pgBLSa83vtZI4d6CDu/W3QXvCw7uYoTWx7e0+K
+rrZj3LE7KUzEa/Vazsn6Nwhi7VL0irNOZJGALdhrxLA8iGnPYDys78vPBWB3k4VQ
+G7rgvdVXiAldMNtoy7sNuhtI8Cicgl0JG/6flwADBQf+O8kWSrda5ezDK7vWAhBh
+r3tEMIE08eL/HPErE3DOzud8oyV8B7Z89ZOjSqzn/6EQdnEGnVRr/isOJcmgAXQQ
+RpJfFQ4dnpEeestJ5y5hzrtbMvfZ/Wms3WFgjgfYl5+TAbSF3Gz9VNn5AmaeA18i
+d8qzNVQ/e8J9zXfLV62qRLzbAS74K6rzGpYaZEWFAid1KLTu0S+I/ZuvQfZ83jyq
+oenwS0iYawM824w5oCDN/+8cDzLcHipN+B6g6S+X9m8s5E3RZGVKqUjd+fTRg0LY
+JkkasJwQa+20AadpCE0RZtR82jrbyLfNY2FFJT3TKYnaVhYcjpPBqffevhwSRIEs
+KYhnBBgRCAAPBQJL0IYUAhsMBQkDwmcAAAoJEPgA3Qkz7Pf3m+4A/RghXcZwWrZB
+/vvvAfhkYQeQJjPmYluGNebJ4wPi5ZI8AQCBjv2b6yDTWPenmPNeSB88HWjSL8/A
+mimEzF5VTg7GrQ==
+=Q4rB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    09A79E1E15A04694
+uid    Torsten Curdt (Code Signing Key) <[email protected]>
+
+sub    5FB8CE6F93DDEB23
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+OGftXcgLz7E4WnOPNLnr
+=++aH
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    09A79E1E15A04694
+uid    Torsten Curdt (Code Signing Key) <[email protected]>
+
+sub    5FB8CE6F93DDEB23
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+OGftXcgLz7E4WnOPNLnr
+=++aH
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1188B69F6D6259CA
+uid    Chris Banes <[email protected]>
+
+sub    0888B86856F9D71A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF2hcBkBCAC2H5WcFoeByKBUAjRDjmP+5P6FRsZjLe6c1wy7G1ha6/EQUVK4
+gZUZYE9W7l/4QKHvAu4PvFWdD+5FXGZuB/2kw348CtabAlJTehm1QlPt5//ODkxB
+fWPPz3uHBo5PQJZuLpStQn+aEkTTHK6Sk5033e6fa7mV5X/c8pTmTzkunG58NFbj
+5VSVbks4pbafKoMY7rSN0/I2hEApCjB9tx/7DJuQ9gbaGhmabnhBTnwHXEV1/hIF
+369lfiqeoeqDMOKj99C6KFD/NPRrRLfoPRpqL3LPsPp7P+TzyZN2q89Xqn2ysyI9
+jDtrlssEXLskU5kA8fVa179V/QR6QtrJ29m/ABEBAAG0HENocmlzIEJhbmVzIDxj
+aHJpc0BiYW5lcy5tZT6JAVQEEwEIAD4WIQRkubCfFkqgv4h0LrYRiLafbWJZygUC
+XaFwGQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRARiLafbWJZ
+ygNIB/wPXRnQJ5Pj+G/S0sbcDjTFegfN5TzXRRu0wXyogHPCt5ItE+8DURp7coq1
+eaocMZQ1186QLow/gInpji5l2pyv8BjC+H0GrXrT00S4wWcmd4ink+cNIwCtO8Dk
+Bi25t9RxA12zKqXn62W8sATRl4DlL17ASw8k1bYDGWWJAM8GJG2yucaFN7RohO7q
+5QmcjsXmuzfZtcKrlVBVNkYoGQKfjgr5fPjG1p5aOKELYt33u16stDGOuvXyJL2h
+4FhqMJL9UvFj7uOdMQLK10QPb3tFXELchvBWCkD/GVHtH1hwFumLkLbIKaj43Sq8
+Kap/NfRkl5GXw5e8UQDQevfTXdJduQENBF2hcBkBCAC2kr/FJuCwW8jzPDyH3EsJ
+ebKgUGpdZ8O+OtbvIBgIt7opJ+tkOyBjt0kUbiXEeoZGOQ8qtaj8BD5nAYytDZcd
+TU7ZOE8A02bMXsTVeNKkPgbmYQm9DZokAUQWO6NxohWvJqnDXkzZyMb6jGCJyGHL
+x6bN6++0DWPD2c53wzaSZLg/776BZw453HWkHfiomtoKgBR0DMOg51daAsj8d/Aq
+itdK8Nwz7cmKP7FaOu5lSyWb6F8dueQ2yjQEykq4YrgiLCva/pSL2Pc16CNnCRbD
+QNUEog5Ldco1tbrPPfizLeXVQmp6tG34aa1OCd2WKs1EtbFQHpFWNo0cP7LInV/r
+ABEBAAGJATwEGAEIACYWIQRkubCfFkqgv4h0LrYRiLafbWJZygUCXaFwGQIbDAUJ
+A8JnAAAKCRARiLafbWJZyoPeB/9hrGRr1ivPnQOMtAJgrT+Aev1gFKJxgTJlB9QM
+fBmjyiELgnjwW0COb9nRgalDk404f6nKcH0x0jElhUU79h2Qz/NoGP7QByaymdeP
+j69SQeDb3TyI+tHShX8r3gt7fEyeJFYyr7w8xmO6B7GdTpltTcrbG3uk2o+e1GPL
++u86S0QhG2RyBKOIWLXoRCJQlouzNqiZl7Viv8FN28NAvCi+Crp/evPtNNOYjnUP
+yIoOKCOCv1Fth5H0DNQMLsCZbHPLl1Lx+AN5JFR0xp774uGkzLQ1jyqXTbv3rn1s
+LjK0uhsXbr+8I7TfsExnrL9DmAn8R0nE4uPV2wW1NzwavqcU
+=yIZi
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1188B69F6D6259CA
+uid    Chris Banes <[email protected]>
+
+sub    0888B86856F9D71A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF2hcBkBCAC2H5WcFoeByKBUAjRDjmP+5P6FRsZjLe6c1wy7G1ha6/EQUVK4
+gZUZYE9W7l/4QKHvAu4PvFWdD+5FXGZuB/2kw348CtabAlJTehm1QlPt5//ODkxB
+fWPPz3uHBo5PQJZuLpStQn+aEkTTHK6Sk5033e6fa7mV5X/c8pTmTzkunG58NFbj
+5VSVbks4pbafKoMY7rSN0/I2hEApCjB9tx/7DJuQ9gbaGhmabnhBTnwHXEV1/hIF
+369lfiqeoeqDMOKj99C6KFD/NPRrRLfoPRpqL3LPsPp7P+TzyZN2q89Xqn2ysyI9
+jDtrlssEXLskU5kA8fVa179V/QR6QtrJ29m/ABEBAAG0HENocmlzIEJhbmVzIDxj
+aHJpc0BiYW5lcy5tZT6JAVQEEwEIAD4WIQRkubCfFkqgv4h0LrYRiLafbWJZygUC
+XaFwGQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRARiLafbWJZ
+ygNIB/wPXRnQJ5Pj+G/S0sbcDjTFegfN5TzXRRu0wXyogHPCt5ItE+8DURp7coq1
+eaocMZQ1186QLow/gInpji5l2pyv8BjC+H0GrXrT00S4wWcmd4ink+cNIwCtO8Dk
+Bi25t9RxA12zKqXn62W8sATRl4DlL17ASw8k1bYDGWWJAM8GJG2yucaFN7RohO7q
+5QmcjsXmuzfZtcKrlVBVNkYoGQKfjgr5fPjG1p5aOKELYt33u16stDGOuvXyJL2h
+4FhqMJL9UvFj7uOdMQLK10QPb3tFXELchvBWCkD/GVHtH1hwFumLkLbIKaj43Sq8
+Kap/NfRkl5GXw5e8UQDQevfTXdJduQENBF2hcBkBCAC2kr/FJuCwW8jzPDyH3EsJ
+ebKgUGpdZ8O+OtbvIBgIt7opJ+tkOyBjt0kUbiXEeoZGOQ8qtaj8BD5nAYytDZcd
+TU7ZOE8A02bMXsTVeNKkPgbmYQm9DZokAUQWO6NxohWvJqnDXkzZyMb6jGCJyGHL
+x6bN6++0DWPD2c53wzaSZLg/776BZw453HWkHfiomtoKgBR0DMOg51daAsj8d/Aq
+itdK8Nwz7cmKP7FaOu5lSyWb6F8dueQ2yjQEykq4YrgiLCva/pSL2Pc16CNnCRbD
+QNUEog5Ldco1tbrPPfizLeXVQmp6tG34aa1OCd2WKs1EtbFQHpFWNo0cP7LInV/r
+ABEBAAGJATwEGAEIACYWIQRkubCfFkqgv4h0LrYRiLafbWJZygUCXaFwGQIbDAUJ
+A8JnAAAKCRARiLafbWJZyoPeB/9hrGRr1ivPnQOMtAJgrT+Aev1gFKJxgTJlB9QM
+fBmjyiELgnjwW0COb9nRgalDk404f6nKcH0x0jElhUU79h2Qz/NoGP7QByaymdeP
+j69SQeDb3TyI+tHShX8r3gt7fEyeJFYyr7w8xmO6B7GdTpltTcrbG3uk2o+e1GPL
++u86S0QhG2RyBKOIWLXoRCJQlouzNqiZl7Viv8FN28NAvCi+Crp/evPtNNOYjnUP
+yIoOKCOCv1Fth5H0DNQMLsCZbHPLl1Lx+AN5JFR0xp774uGkzLQ1jyqXTbv3rn1s
+LjK0uhsXbr+8I7TfsExnrL9DmAn8R0nE4uPV2wW1NzwavqcU
+=yIZi
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    40A3C4432BD7308C
+uid    Michael Schierl (Maven Project Release Key) <[email protected]>
+
+sub    C0B9C2CC3DD97C16
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE5zrtcBCADFfU0ugIGUCM44fqPJKrsB3TaDu5EpauvFfYqUfyookzMHSKtB
+4YqBSKzBEiZ1rFB/KCn7XJTh5epoCau4DsG4U0XZjsx+esDR4ZtL42LEzeMTuluV
+9eybw5EvW9GnvUrSOq4U1xFdQgCmBcRBPpLrP4hWUXgNlRTEpgHemnDmZIV7Jcyx
+KZYQFoddPbUbIOutoMecl5flaa5uHe2kHp+R+PJ8DlQIKa7qsxsAwZhuamfApX8M
+NYQmY/M473IVH3ByD8bQ7uc9HM/0q3f32KeEVHEYTKLs4/wTY5mZTDxndQeMpjF+
+8+LHbr4n0zDJERJnrOzgOoCW/bFa8YQv4ErhABEBAAG0TE1pY2hhZWwgU2NoaWVy
+bCAoTWF2ZW4gUHJvamVjdCBSZWxlYXNlIEtleSkgPHNjaGllcmxtQHVzZXJzLnNv
+dXJjZWZvcmdlLm5ldD6JATkEEwECACMFAk5zrtcCGwMHCwkIBwMCAQYVCAIJCgsE
+FgIDAQIeAQIXgAAKCRBAo8RDK9cwjMK/B/9v2bS/aa9jnbLRxrxqJSNN9aqyDkXm
+fNpbK24JJm551XZsNhCXRvSAG/LR5bmVIjGPEZye3rQs2bG9NBuHy3JyYZKYJwvT
+4ucsfSfgfTRVH0ALcIDaS9cSCz9GI1FU/asC7dIqPDItl6h8eqLh42SqVVRjs3jI
+ySFKsnh3Q0TWp36egAevzXj1ldCWTCh7bm8QEkCs25q2JTA7/ELS3Ty5wPE2RqkL
+OaA62Yg0GG5Fh7sQGh+P4R1ea0w8YglU0UM55i5iex55zEAE5bMakYC2KXUolFT4
+1Yo5gmKEvZvITtrvLtlz01cdN3IsAjuBrogw43I85Hh+rsWdjv83ENSUiQEcBBAB
+AgAGBQJOc670AAoJEJ2HdZ9YtIzdeggH+wXz959yKKZJ34NEDzExaMogwEnsCPYX
+SrGUnJ8SeYsjsa6qgmjtF+Mzhhfy/yiiOfv6xcW/HfpppeXc+z94xiRDjtKBoQ17
+TMFqukU6rHFZsYW1m7WTgXbAb8HSxSbM14lfk977nQNKmQP+z8ZBTCJxpyiPPLid
+G7fmGeOQa75GERJKA29JK6UsRUhGNSkbveqwj4+BFJpPgvuPpArcPoylN+m1Iwyp
+bBtG78xasZZIKf9vQKrhb28Mqn/cgEAGZAsvj2fC3laUmPlIdGMUtWnYNZvrLUzL
+wu0rtIFiXvWwMuib/QVzDZE+lnNSM1ymiFUwuGEjIFsTQy8oRcFSWAe5AQ0ETnOu
+1wEIAKOf1gsFUdUylLyP6hzc4RAgoFr2eHDoa3w49fdcBflq84QSIjGkrcLggLvA
+P4eqJnaUhJh+8a4CBRg4FrW1bs/nhdC9rbzFSXkbr3oG0RafTcTtGuP2JzoVXifY
+5OfNnia2fHIptex2hJofoh83yCiU36MaFgQNlorK7/c+K733aEk4KBzMfAU3JiKr
+KsSTE92Vd1yh4pQ9gMANAPzPqMfcg9XiIKos8d1XDQtndQSWccBNs5EZWMct++XP
+YOdZI4bwsmj+ayuJPbJOYG1T0HEA9x0vBwSCfGEoyq6+ZqlCrxcAiuEqpYMUlPz3
+ZONUfC/C29Zb/0Q4AuZQPug2fvkAEQEAAYkBHwQYAQIACQUCTnOu1wIbDAAKCRBA
+o8RDK9cwjNsdCAC12L1h5yiApA8v1nJ2YEGtCHciX9B4J9iGnOHeU6XTquPmCgzA
+Nd65yLaeA90E//CikAtlHUgiz7+fGyrGbXUDzS9yu97YP6L8Gfha8UylBr0Hm1bI
+FuNjG2C+SUU9DPfdeqd+Bh0ygYwnB6DCufrbB9R0ElvqUDttyiJq9m1k9gCSELKM
+LjV/1F1F1XA+2k8PjcZKDgAXrLUpu/boCcr+8ozuTBTyxcL21w1nW7VignaRRt9D
+fvHlsli+5W/+LpSuq4XcaAgcX8rikT9YEsJoUOXnXPP7mF30ChAY5F7mJ9BTe9RZ
+ZmnjA2cUdtHLvchd4fiFbu191pbeIk/BSf10
+=kJKi
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47586A1B75EF0DE5
+uid    Benoit Quenaudon <[email protected]>
+
+sub    D74B959DFA1D84F2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFkW7RoBCAC7NMtr/e27nrUuIcEZEJBZS3TbZYId80UNQXgYmqPhy/sfCyMc
+87eKzOalauwLbr5+VGuKqhvKrihV1WCt2+FUjOtnCf1GutpAUH9plfSs8IpRog0h
+i9IpApPeR0Q37fHhc/fSLDxoHIylML0058K2X9js/VNg9xospjvRBi0vXmNaMWuo
+qMQXXVJrDDtDlxljx78Fk7b/qiFuqBgIPM3U5OPyaQ9Qks8wactSYo9pcqIZx9BF
+/XR//WvPwQ5MEAPCkwXnNIlrePDGMule7QRRmDvNkcD8V2xSOM+fhVd3UpuCpMEG
+h3MpiaFq9TF9O1Fv22Cs4eM3mnYOEHjAGyNzABEBAAG0JUJlbm9pdCBRdWVuYXVk
+b24gPG9sZGVyaW5nQGdtYWlsLmNvbT6JATcEEwEKACEFAlkW7RoCGwMFCwkIBwMF
+FQoJCAsFFgIDAQACHgECF4AACgkQR1hqG3XvDeU8FAf+KJqG/lNX1xzASjIYxXPj
+W++DVsvysQaSAr5OebRsD/KLeEM68ps65AfpMgxIAs094NEhA99wIXclf4vjZJ3W
+5z2VS2+IwhnDNYD9Pe0xt3H8zfbL3no0LyPS+pAsavtgJ0gqRG/kNDDoM/RmI2S4
+yZgaku6kQ4hCKKubdrPBV+LqCSBvEn6kTvHMvIYQrtDgvm/X9hTR/42zaAK9UaD1
+RiLF2k2nbQeJlDu8ZSvuA3IOGTb6ALUA66KkmiDqMG43vZs+ZTAKnreWKsPKlQr0
+eAAN/dcFVg35+bjf02561Zi73NcgMS7M6VgBExBoGYDW4299vnu8K3FqOHDQs3f4
+8rkBDQRZFu0aAQgA1+Ve/M0qe9PJ3RECh7T23GIGQSQ2qz877YKt0ZszRRqO3zyn
++odZTlDV7dNfWuC4vZfzY7tMs+4VpYiiFBGnEmZkgCc0upK5IuHrS9HwuD3VcOw6
+e9SpmOgYkJYKmjtNCNz7BIoYCIu+PYzaueP12DXCIod7bij8+smRaon0IkDj4SqH
+ALxnb75+L9MQKaxTfkOybDWLfhz9oxfUtO2StLHlGVk8Q6GVAhKJIp6bZGDA/S3m
+Hx/AZHnVsL8o98oYRIuwLFPxeAYauY6cgwoD/9FYpkQSlxbsLsje8HRT1nvzWKhP
+4NwZFDkmEWsKOiIYgV9lQWompcLpqLFfmp0pPwARAQABiQEfBBgBCgAJBQJZFu0a
+AhsMAAoJEEdYaht17w3l3ZoH/RYBt2aiAhrbjQteyA5CpNZ6V8jRrudzEHB/boJH
+FnBUGNhzDDeu9FoJGrR8r4AvLyJgqiiATN3/erKEiZI/cP8wBfzjoMBM9MiYLgRg
+NawvoLd03oEUq856SbCwW096GE6m/eLcT3735+aIchMAHSagHP9cIuWr+t3+W0z5
+MURVOe71bf2TSySXhbdp4E05XjRgAwdQciW0n8SCKgRppO/CuIWiUyvt5JCCrfxY
+gEOMg5/wEGRSuNS7YtYB92CBgLPQ7SmpNSMUY3Hvvg+AblS7sxPDDvvY7whHK2U4
+6LJQx7BqPFqTmGPfFbSt2843qryNpjbAIzMpm0WC40LvvLU=
+=5a7q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47586A1B75EF0DE5
+uid    Benoit Quenaudon <[email protected]>
+
+sub    D74B959DFA1D84F2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFkW7RoBCAC7NMtr/e27nrUuIcEZEJBZS3TbZYId80UNQXgYmqPhy/sfCyMc
+87eKzOalauwLbr5+VGuKqhvKrihV1WCt2+FUjOtnCf1GutpAUH9plfSs8IpRog0h
+i9IpApPeR0Q37fHhc/fSLDxoHIylML0058K2X9js/VNg9xospjvRBi0vXmNaMWuo
+qMQXXVJrDDtDlxljx78Fk7b/qiFuqBgIPM3U5OPyaQ9Qks8wactSYo9pcqIZx9BF
+/XR//WvPwQ5MEAPCkwXnNIlrePDGMule7QRRmDvNkcD8V2xSOM+fhVd3UpuCpMEG
+h3MpiaFq9TF9O1Fv22Cs4eM3mnYOEHjAGyNzABEBAAG0JUJlbm9pdCBRdWVuYXVk
+b24gPG9sZGVyaW5nQGdtYWlsLmNvbT6JATcEEwEKACEFAlkW7RoCGwMFCwkIBwMF
+FQoJCAsFFgIDAQACHgECF4AACgkQR1hqG3XvDeU8FAf+KJqG/lNX1xzASjIYxXPj
+W++DVsvysQaSAr5OebRsD/KLeEM68ps65AfpMgxIAs094NEhA99wIXclf4vjZJ3W
+5z2VS2+IwhnDNYD9Pe0xt3H8zfbL3no0LyPS+pAsavtgJ0gqRG/kNDDoM/RmI2S4
+yZgaku6kQ4hCKKubdrPBV+LqCSBvEn6kTvHMvIYQrtDgvm/X9hTR/42zaAK9UaD1
+RiLF2k2nbQeJlDu8ZSvuA3IOGTb6ALUA66KkmiDqMG43vZs+ZTAKnreWKsPKlQr0
+eAAN/dcFVg35+bjf02561Zi73NcgMS7M6VgBExBoGYDW4299vnu8K3FqOHDQs3f4
+8rkBDQRZFu0aAQgA1+Ve/M0qe9PJ3RECh7T23GIGQSQ2qz877YKt0ZszRRqO3zyn
++odZTlDV7dNfWuC4vZfzY7tMs+4VpYiiFBGnEmZkgCc0upK5IuHrS9HwuD3VcOw6
+e9SpmOgYkJYKmjtNCNz7BIoYCIu+PYzaueP12DXCIod7bij8+smRaon0IkDj4SqH
+ALxnb75+L9MQKaxTfkOybDWLfhz9oxfUtO2StLHlGVk8Q6GVAhKJIp6bZGDA/S3m
+Hx/AZHnVsL8o98oYRIuwLFPxeAYauY6cgwoD/9FYpkQSlxbsLsje8HRT1nvzWKhP
+4NwZFDkmEWsKOiIYgV9lQWompcLpqLFfmp0pPwARAQABiQEfBBgBCgAJBQJZFu0a
+AhsMAAoJEEdYaht17w3l3ZoH/RYBt2aiAhrbjQteyA5CpNZ6V8jRrudzEHB/boJH
+FnBUGNhzDDeu9FoJGrR8r4AvLyJgqiiATN3/erKEiZI/cP8wBfzjoMBM9MiYLgRg
+NawvoLd03oEUq856SbCwW096GE6m/eLcT3735+aIchMAHSagHP9cIuWr+t3+W0z5
+MURVOe71bf2TSySXhbdp4E05XjRgAwdQciW0n8SCKgRppO/CuIWiUyvt5JCCrfxY
+gEOMg5/wEGRSuNS7YtYB92CBgLPQ7SmpNSMUY3Hvvg+AblS7sxPDDvvY7whHK2U4
+6LJQx7BqPFqTmGPfFbSt2843qryNpjbAIzMpm0WC40LvvLU=
+=5a7q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5F69AD087600B22C
+uid    Eric Bruneton <[email protected]>
+
+sub    0440006D577EAE4B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE7JURcBCADO+9Dc4/JnB+wX+fq+Fr2zUGSPOT6/qjE5kXL4FEbJKsqDSAKG
+VnbtRrsIUdmNIFQmz71bBDFhRBbrSrkz927k8eUPhYtxE2NmmWSuKgrjF4qviPQv
+m/7SqGx378m/qw4EvpgGUB8EYif98LYdWp5vsU/zx0Ps9auqvetAzJaL9489oE0F
+q8FVhve6BMfUUV7zOTCmJnf438YO68upjU0PVBdfFE6Qx4cgCeWbQGy2cooW5azN
+iIenhuYU1qikmxMHq2xZzN4uSTWLGDpimPyz+Y1aTSYJ/bgn9gPStbI9sojWo9SS
+5gvNK3XqJzMwxwFow86UcIE0vPD2T6ZlBAXRABEBAAG0IUVyaWMgQnJ1bmV0b24g
+PGVicnVuZXRvbkBmcmVlLmZyPokBOAQTAQIAIgUCTslRFwIbAwYLCQgHAwIGFQgC
+CQoLBBYCAwECHgECF4AACgkQX2mtCHYAsiwWdQf/ZDnKejrNUOREfAZQYoAmf29G
+zPnQ2XVb6ZxoD2kg+b7SyzVL1lnpXw961Ayme9trxztb9KJcxJ6a+oSVIHWoiINS
+zx1g+lXCsBRH3Lb5iJTAr2u8+Gyva9+PB60CBmmcsuOjuLBx21N0/E4KpBiwEoWw
+5z8HGNVsa4jtRxB+RoQGiilBUIelsI17e3hQWgScIGJdLW5xErlC3WfgtUOL6q4J
+mSk/A1R2jmWKOO+WBvGbnOr7mKZd+/h4ohzVVwyC1WrFeFJgEZK7bXPA77Iv/4u+
+al7RuVztBKjrXD0yPwknuxMgyN+Y5f/pqqKncNl0lOtiWayKSxdatBLmGifAgbkB
+DQROyVEXAQgA2uNV77VI+ARj1d97b5cY3/er0Mcc8/Q9ctMY+5YpSYDOQF100QBd
+OQ8q3IJsfhZeF/iMFlHIUikuSgatb/Ih4lk1+irnERPuV2MNoAw3Fvn3/vwl/Jy0
+ZsQCBSXO54U42TcOXSwNLkYOJaomDiiuo61Rxj7jqijpnydwoFvEi84v6q/Uota3
+MijGMbzU9QyTX8J9OKMeCSUq0uVuk4ezebjv/bwA/ax/qQRIrEHDOOB1LJ5JyLac
+K4+h5J8tMkEmWxEQv7MNokRLgbaePqv+tdf1gee4f2fSE3EXKFxjTO2wjLPXCrHS
+SI5gecsilQn7ZNxH9g2YUJipn9yj3ywMxQARAQABiQEfBBgBAgAJBQJOyVEXAhsM
+AAoJEF9prQh2ALIsrWwH/3s8uN8/gDnbcbTX+7N/ZfQBXJZ+H9GGikmYRJE1xoOe
+Et9MOqZyGDTZfGM/qNKeDGfar7pcRQlMK/A4Nts5E6d1OX8fBkUBtYanyyjNLlT3
+yDjO6VaV0SCsgAzNjUZqc4lxS9atN6md5m6lWLAdHghrXuV6LsiKOS+96htchoCv
+Tvm7mcPI7w146yJRSyCC5+PybG3ult5Y6QASkwI3ZWB0u0PKUoqglwWngplu+0Fi
+b2rxQvL32is4YrYaZ+XwoR6u/Bgv0ZvZiypk17Uk17rDb/JfeLqDn7oW6Hlgi9KO
+LbRRIg7vwZVo2Ixco7aGxZp5c4zSfaPvn241v813ZcA=
+=A2GR
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7A8860944FAD5F62
+uid    Sebastian Bazley (ASF CODE SIGNING KEY) <[email protected]>
+
+sub    C189C86B813330C4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Q+g9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7A8860944FAD5F62
+uid    Sebastian Bazley (ASF CODE SIGNING KEY) <[email protected]>
+
+sub    C189C86B813330C4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Q+g9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B341DDB020FCB6AB
+sub    315693699F8D102F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEowbDsRBAD2jx/Q2jNuCkgiS3fzIj6EzDP+2kipIKH2LEnpnTiBlds2PFYM
+xYibVab/grgQODxTdDnAKifbJA/4h1/T7ba+OV+xIUoSI5MbgaF3USidiDHPX0pY
+qvG+k3hKECLysQ2zoZpcC8c2ePiZQSVC2i5BRqgs0xZPz3kiT5U9WPozTwCgtasB
+TgHhkOGhZ0SOUuQ4dL54R9cEAIaDjdPcI7LxyOMvvGTuW/SaS9JyP21Kch+Vf6I4
+vKWWqXEaF0So8S088zHnBrcBKhu9D1sKIHS64EoYCrznfMUtoENPe4sf5QuJmZ9D
++fBuFcudQIpkx8L73q+E3fmCK0uX+anqipJtS8mgpMeabKda4KkjDsZkiaNl7OBI
+0H09BACofK1HTNHNke2N0wXN1GyG7IAqprKl4lBbu5aRXvfKQ2tDj8s5webNQ+Se
+Om/Yg0Bi+CiONLgUjiwYe1wNls8zkk3LwYFeKIJ1AjAY3auBRWOI0/IFFzwTkV8J
+YPHa3Dl/kmYp8NMMwA5bgrblggM0Qhnp+k//xpb0FYbmwHMwUrkCDQRKMGw7EAgA
+5MMlt89bomqE0TSq63JnPaSeEKsAx6A1KaXaSg0LEI7fMebSQcAdVdAFBo4HaR+j
+NNGv5JGTvAObLrqxnn5mU/+qhdTw4WCf17R4ETEKc3iFN3xrpxz2Vew8ZWpw3PcE
+gCe27ZN02J6BgtEqhT9v9f0EkAgRHIkcaFCnxme1yPOFN+O0/n1A+59Ar8rmwcHG
+opSoZlGDEdEdqElx/shQjqq6Lx3bWYXS+fGzSAip+EAX/dh8S9mZuS6VCWjLx0St
+a1tuouq9PdOz5/4W/z4dF36XbZd1UZHkw7DSAUXYXfwfHPmrBOrLx8L+3nLjNnF4
+SSBd14AfOhnBcTQtvLuVMwADBQf8DC9ZhtJqHB/aXsQSrJtmoHbUHuOB3Hd8486U
+bZR+BPnnXQndt3Lm2zaSY3plWM2njxL42kuPVrhddLu4fWmWGhn/djFhUehZ7hsr
+Qw735eMPhWZQpFnXQBRX98ElZ4VVspszSBhybwlH39iCQBOv/IuR/tykWIxjPY7R
+H41EWcSOjJ1LJM2yrk/R+FidUyetedcwUApuDZHnH330Tl/1e+MYpmMzgdUGpU9v
+xZJHD9uzEbIxyTd2ky2y3R+n/6EkRt3AU9eI0IY1BqUh0wAuGv/Mq2aSDXXNYJ/p
+znXSQBjmy2tvJlqXn+wI1/ujRMHTTFUBySuMyZkC0PwUAAnWMYhJBBgRAgAJBQJK
+MGw7AhsMAAoJELNB3bAg/Larfc0AnAmQbEg9XnLr/t0iUS7+V7FcL5KpAJ9k3LS5
+JI97g3GZQ2CHkQwJ3+WcPw==
+=OasT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6525FD70CC303655
+uid    Stephane Nicoll <[email protected]>
+
+sub    DCF4B49B4D5845D2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+LwCg0goAeKquoZuBm9KXUWlDeLuHu6Q=
+=WF0r
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6525FD70CC303655
+uid    Stephane Nicoll <[email protected]>
+
+sub    DCF4B49B4D5845D2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+LwCg0goAeKquoZuBm9KXUWlDeLuHu6Q=
+=WF0r
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C51E6CBC7FF46F0B
+sub    4006CBA6D352F1FC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFbgSbABCADGGENSy3oWLjW7zfYMSsR0pm3l3eMA7ptyU5C0U/MoIYjbXwyX
+XtlGwKnNgngATh1SMpX4WDbD8tn6vdeP4uHQsDb40t0XN7/HISFcLhV5pCgz2wNR
+t1dZbreV/EaZn3f84Vnm9s6TU7RHuPP9qBne1YLbB+LKKZUfQGavqGR+n322DhrR
+NqLdC3zFNtSmCVXS6GZ17IV/B+6CiNdbmPVk0o7zZexqZCNMXxv1IFzHV1/Y8Htu
+WQBfZ0zWwrX85ZKysU7UDdoyUw2aa8/+YpZmKwo32N8GpqA6azBeUjjVXGuqktMy
+l6IcHbLlgymkkjK7TyAKltuhvp6AlBTzp9i/ABEBAAG5AQ0EVuBJsAEIALE90/PK
+unEOu2B+QGGV9e0jJMlW+rs3BV6NI9ZaRw0Uvy0xN+jqhMsyCzB8P1joTZKUsmK9
+ptaPlMuKrTaQ/0GYPi6cP5EamphyvjK8ljLhhQuiAxt7zwv78vX7CGqRUEcAszsK
+8FPBAXERsSit661rjp4Ai71cyQg8YOXDjhissHWmneF8TJ3yItocj4KxDKLxoY+h
+F64epbkjIkpfrZ34iX8zdZMRCNJlh+oTHe/xulYLQDbgkgQa+Y6gnKmUZi0QGU01
+k6eWw/U3yOC69++ehiYcZYS0dWpPE/H51Rizn7QipFeFfTsia9jkGjzMyKHGju66
+URQ8okd4E6ev3N8AEQEAAYkBHwQYAQIACQUCVuBJsAIbDAAKCRDFHmy8f/RvC1c0
+CACy49b4H6ZzY71Ao9JHRRpQZ2VSVk+6xPblr1DOoytDC/zhVKekerE7OBEul0UO
+qzUyLNwkDiHy+5PRi6ZquZr85PlaVV5j6DkuZ/0lcL3ofsvtQi1Dwd1q/9RzedSU
+jjY3OimPWDkDBIGyBXohxx1BxRIAvlRnk9agapfbAdwtv6cjYxW0TDcPx4XW839n
+MN3CMEWtlI1GhKGYi5nsUw73ctpSq9dm3ov85ykFOqB/juvTcPoiOwPE+6o0OCTZ
+o60VwPUfv7uoXtkrLVJ0B06mfKiUgZvaqppYDi9IrhcHarOz8MD2OrUS3z4riTsL
+VEPwY+Xd06QyemMynHqpcDpm
+=1WLL
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C51E6CBC7FF46F0B
+sub    4006CBA6D352F1FC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFbgSbABCADGGENSy3oWLjW7zfYMSsR0pm3l3eMA7ptyU5C0U/MoIYjbXwyX
+XtlGwKnNgngATh1SMpX4WDbD8tn6vdeP4uHQsDb40t0XN7/HISFcLhV5pCgz2wNR
+t1dZbreV/EaZn3f84Vnm9s6TU7RHuPP9qBne1YLbB+LKKZUfQGavqGR+n322DhrR
+NqLdC3zFNtSmCVXS6GZ17IV/B+6CiNdbmPVk0o7zZexqZCNMXxv1IFzHV1/Y8Htu
+WQBfZ0zWwrX85ZKysU7UDdoyUw2aa8/+YpZmKwo32N8GpqA6azBeUjjVXGuqktMy
+l6IcHbLlgymkkjK7TyAKltuhvp6AlBTzp9i/ABEBAAG5AQ0EVuBJsAEIALE90/PK
+unEOu2B+QGGV9e0jJMlW+rs3BV6NI9ZaRw0Uvy0xN+jqhMsyCzB8P1joTZKUsmK9
+ptaPlMuKrTaQ/0GYPi6cP5EamphyvjK8ljLhhQuiAxt7zwv78vX7CGqRUEcAszsK
+8FPBAXERsSit661rjp4Ai71cyQg8YOXDjhissHWmneF8TJ3yItocj4KxDKLxoY+h
+F64epbkjIkpfrZ34iX8zdZMRCNJlh+oTHe/xulYLQDbgkgQa+Y6gnKmUZi0QGU01
+k6eWw/U3yOC69++ehiYcZYS0dWpPE/H51Rizn7QipFeFfTsia9jkGjzMyKHGju66
+URQ8okd4E6ev3N8AEQEAAYkBHwQYAQIACQUCVuBJsAIbDAAKCRDFHmy8f/RvC1c0
+CACy49b4H6ZzY71Ao9JHRRpQZ2VSVk+6xPblr1DOoytDC/zhVKekerE7OBEul0UO
+qzUyLNwkDiHy+5PRi6ZquZr85PlaVV5j6DkuZ/0lcL3ofsvtQi1Dwd1q/9RzedSU
+jjY3OimPWDkDBIGyBXohxx1BxRIAvlRnk9agapfbAdwtv6cjYxW0TDcPx4XW839n
+MN3CMEWtlI1GhKGYi5nsUw73ctpSq9dm3ov85ykFOqB/juvTcPoiOwPE+6o0OCTZ
+o60VwPUfv7uoXtkrLVJ0B06mfKiUgZvaqppYDi9IrhcHarOz8MD2OrUS3z4riTsL
+VEPwY+Xd06QyemMynHqpcDpm
+=1WLL
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C4C8CB73B1435348
+sub    EA2A558279B36E6B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+4q5nL0cFWrpYBtEUxDwWSI3K
+=qAlt
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5E2F2B3D474EFE6B
+uid    Sebastiano Vigna <[email protected]>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFijpzMBCACxAT3jijwXbI6b7LIF/k8oSGyM8ZNJpb6AQvPqKIqCzxNFXzow
+EBCasKMhIWgGy+293Tpt/DY4btJie4u+igMBS86iXrF8CUnOLPgTlAIyil/oREGJ
+1GFkHsf0Yj88zCo9H9GNiUZRNSHdf55gsgjzzFVdZ6x0MoN7Yopbvl71bcTSbe25
+AZM6K4gIf5TTo66smG9FgwDkMxc61ixRty44gkfWapzdob5d0cli0Ze0mu+2PHJ0
+Fdt2sUX/4M0Bpxk7eaGVecyb9sm6KkRaGziJ+XVByZ0UMdrEEJscLaX/UpfK+Wek
+aPQjDdyYLW90PJofKFPt4h2DBQyf9DSZ8NfJABEBAAG0JFNlYmFzdGlhbm8gVmln
+bmEgPHZpZ25hQGRpLnVuaW1pLml0PokBOAQTAQIAIgUCWKOnMwIbAwYLCQgHAwIG
+FQgCCQoLBBYCAwECHgECF4AACgkQXi8rPUdO/msQeAf/Z7IJc8pXwUzm2w1G877N
+KHGNivS5WLfuQk+bCZalLVA25aigwP/YVcF7xdQoS7aBSNG+CJzrLCyyUZaixwrQ
+sV+B5E+LsJWgb7xSvnRoCETYGeFQJdAshlu350GTVmCfy3xil4FFyAENl5r3nB98
+tJ4HgYh+NwUH9GUTBZV7SpnV7I2MYOv7mvixqioN8o51SX8AqbT3LgDko3XegtDD
+Sb3JMtTACZ/7SltVNoGvLzCOSgnj0HkU77MZQ5q3rQCPauz8Arp2vJCwOvkYXPde
+O4t8s5dGRTH88sYI81CWQT+X4w1q20CvWxUd3j3ZJthyunX5MH11nbYdXbAnGPIi
+gg==
+=UN0W
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    E3822B59020A349D
+sub    9351716690874F25
+sub    60EB70DDAAC2EC21
+sub    3D5839A2262CBBFB
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBF/RX/MBDADSqelDQKobURExWUKALq86yTPMxMasxmDlccKFpk5xjWrryL7z
+qg4Fnb7IK5fKDtcnTANtOv2hlIli1h131+SmjJdD3qhfly7QoszOpr5izDS+FOCj
+xUibkhupBvnRGtY2TetYRffoIzsGHA7npx/ydYsZiwV8QWqqfsoNm/gsvfizT+U+
+h7ujVQYO3r+GP4Apx1QF8Y0c8pqs981ma00Sa2yvTu3HhHYFaxPhHIyi+rmzFg3l
+o7ysbTp+qbJrNJAYk86Gx7PV91IJPyvxbOMSakoc54C6/zYDTtAnCg7NMy1i9MPk
+yk4AKewZQEDJuEYtJA2R5afYjzciGN/ChuvKy02t3LxVCTaY1EP+Fo1g3/2XocF5
+Vio8bj1R1fcwnC2FwZN2quN1HRxNacFJ4HHGn6dCDx35HNa0P3KWcEW0g2bKy5Dt
+DjHYG6oD7vcdjztXdiQxle6qYJTJyZ8tXSVwyUdHWXQ8rUqAuowGB2vQ63Qy00Vl
+IkDanr6teGpd7P0AEQEAAbkBjQRf0WFpAQwAvOX8TNMbEwy74JXe3QzREJwmx6T2
+pNeJPLlnOYITG2N75vJGr3cRwAJ+eye8nQM2MN9h2uTqoo7mMtl4zXAaORHj225m
++qsdGUFV9+a6/rO3glwPQYCJHCSNVcL/Gsrr2iRSUOnyisBc1IV1/50znKN1q5Fv
+OSC2UBAQ7QGUrR6LNH/x/JmTOKZqOmza8gjhk222LIKYyBo4a2rYbPXKMIvlEPE1
+pcK5cH1GnkSrOnTWlnMId0Yg384xOqLf0FF22/crmN3tKWnGRwYsiJ/8gCSSPvdz
+oeymAZ4Qvxj/eQlkKUxSQA9hNctSrn/xIs3cbjb/CDTxAqk8r8JHR1g/S6aI8sG5
+fUeF5BZkTvsDIIzatm0gQPwZAE/yAKBW/Uh7zjBCzuan8fflcXhjwd7buB5q1Qma
+G4VXpUMRSyAbDOYaoDTnVJHX53DQRGzbydryvCFCDkWN1Qc015osGm4XD0Rx3c4K
+M5yYiQW6YjpuibI+NWSWSRVeZ07H7vyIbt/bABEBAAGJAbwEGAEKACYWIQS8kAzS
+/JqdkG7LpIvjgitZAgo0nQUCX9FhaQIbIAUJA8JnAAAKCRDjgitZAgo0nWDBC/0X
+gPo/WkB7doUDCzjFMdxlqBhSU7Jo7Nn1rC8TU8Xquu3Zrqso/ga0Gt2fQuE6uvaL
+Rvrdbt2rSA9Pnp/1w6zGTKWMB4lQChtUrVa4T7MQxsKkrnH5PhXBggc75Y2hRGGU
+K33i3xAZk4QK5JHm3rfOqK+GIc4SHxV4Ou9940w3SByOkIUzNHRSYrhpj7NAXpjq
+qb5qcDJDmWnlBge1XDVaJY4w7kJztOUz6s7kCDCn64T1O+T0N/LhvIi3m8enJ9/S
+5qFdO56zotFMA9BFTOV0NXdPDfhkv6+F/47lYwBMCj2+sV+Z/zNRf+sJmeyHIsHQ
+QJMM9kiw02w8vdAR0DrfpMLq2B1eiQZ5FQIxA9ncw1dLXLUg4bAtPsbmXFvnXoae
+0KpqPlNUH7s9u503WH2a1HE7GhWL3LhT4r9isgW8GVozuvw4IzQcbOMsBHH40I8g
+9s2RvktFBoLuJjZEbrYQV72Rx/4Y+SMSO5UvaWZB2hyjnNuFUlXDeEwOqVCgfBK5
+AY0EX9FgagEMAMXU3etJiP9HbJB3DE9hRisbaHYiXbvZSKIU9B3zrB+qgadHOC2B
+TbSBkutFNYreQ5ttsymNXn4mPANMYqbM9rKGfz31z0Jg7UjLn5eDmAtgyTpd7bI0
+CMfx2fOGS91QfHb4ojCCjFMYSDdlQYbNY5UzcLdS7dBX5J7gMesoQXENpvtMR/tS
+3o7nCyai2HU5w6hYQzDKPTJLc1ZfYOzRLEHstYH2z0yiJadVJHzngKBtIHOIlgas
+Ykx3OznEiPACl2rnGNq7SoSg74Az9xF/k7WT6KRJ5LiCH1mGgQQzy5lZnt72tpAA
+Aup5I447tz101GEox68pjWKFBeV5PL/62ftSTA0JwhGHPFxZazdmFHYLw9TQBBcH
+TE7WHYOgwJNfz7+pkIRDyF6NH5RE1CQQSTtWWNPFQHrQRx64nhzWeIUZDwD4VgXK
+7Y+eZfgpULElRzlGH8gocErzL5R3h+aLk423kBB1FL3rvnsTVVzThMoM+mEyj9r6
+azP/VWZuNXN5ZwARAQABiQG8BBgBCgAmFiEEvJAM0vyanZBuy6SL44IrWQIKNJ0F
+Al/RYGoCGwwFCQPCZwAACgkQ44IrWQIKNJ378QwAwfS77614YnTacy5a4EEnVZJy
+wUun8sOhRS8fXdceKvSWrooaKlU3eH3QbnYJ1EcF4vBSXCMkjNsxJsOA+wdQ9tp9
+qGFyAf5mSQHcNeZBsqbOgDNoqGb8NTx1Wt8oUxPauoqSF6rthjSzZFje0ax4qMUe
+Ba8CZdKl9L3vQHU3kxmptFhcdCmdysowODQ7TMTpDjZgmmq5g0cLDkiQLwQnJWEk
+DU9oRFG9uwXlFhFOnNp577Td89Au5i2LLRTl5L9Bh+x9srDH3aoUUTbg+QlSRZqY
+Zv29gED2ryG4szfg5JSBVulif4NWqjLHmKHEY8/JNrht6D+LQwA+6+3ftZZoVYbS
+i+9FDwNUncAKdI6rxs2lkB5y2PZ5cQ4Yt4nDErHFFokandxK1s9Lz7cb3sNJtXV2
+ylykDNbChMjR51kQDigxqiQhj5HU4UGVnoumXOU9OT8QuWjt9GY2STLnUzah3h2H
+la8r9MJSXxEFNL4AZXRA9nL5snQLVLt9g20dvWx0uQGNBF/RYJUBDADMPdnbVSrd
+KOMZVwuiqth7m2wT6c0WnP3G31ANtrUI8yqG+0kGGiqNepA3AfyXiEc/17/6qGyo
+d9tGqTNkRTjCw0cDfXE3fX0hRoErxFJAky76McyBrlhrUOalFqfyDB9tvsl85kGX
+MBYqDNgwb1OgRPOoepvw/l+j9x1qwZUE3b+VbftNvsYMXr9DmOtt4C1KXbdfHt7R
+44f7vIJpvRdq8SlVx9xg3PoG5GElhXEsUkwE+8WRcBMvuBX9Sft00JC5MDypRYKI
+LjkJN1xLJm3tRwYN3RC9TMdZl1YMfIjkHKBMyjhdBh9yhVCme1YtnhM1ix2Cf8cc
++5yixBJbrPcEIuuUUzjAzj3G3ExQBT2/Hbp6nOzJwE7lOW8vrbjFagk7/G5Jhf3D
+jb9cGr+vKE3AmIXwAzQm0I0vFyYBxHJL0ZdQi7VKbaoNO1U0MWYVEXul9KLFGbK1
++/bs61Qv8B4I0IBcTIcH1XViR9Vum+Hu+txQyIGENUZsDd9Rnh3Pq5EAEQEAAYkD
+cgQYAQoAJhYhBLyQDNL8mp2Qbsuki+OCK1kCCjSdBQJf0WCVAhsCBQkDwmcAAcAJ
+EOOCK1kCCjSdwPQgBBkBCgAdFiEE59x1/CT7PI3+gIatPVg5oiYsu/sFAl/RYJUA
+CgkQPVg5oiYsu/ukdQwAwTPG/NBz9hzVHLOsI80VAwi8ZXdXYqWpHVR9JSVyfopt
+A669kJc0hjb85wyy+HX/7TpC4Z9MJXAHHkkShKomhT2ciz+N+9qAaLdP5JWdaTVK
+BzBHgIlFRBQzgdt5uRwqIvz4o+RTFQbMaHVud4cnq1pnqhCn9xkNKeE0D4Vw4ZPp
+eLG6DMjZQUm26ZGEBx3mX7IVJwDC3Resry+aNKVTTzhIPiaPZOVxOxWzP2HWLjt3
+YRn9aRYhSKn3UZqgQj9pW2WSEttxhGMrysZcBSPeC4qNLN1FY4rP2wfZNorPZEfi
+tc5KBf9ZfskZMjLJhaaWc+vI6eIcxcAfCe5K7h3XyF8LtcNs+cHHgsuP0HTkjS3X
+vKbZjMWBvryB+isq+F1dkzjkfFldZhqSVp1kQIbZnli2s0mZSxRiqzZVXPkdHaJx
+ZrhYcMS97aUFZAhgSdtLsj5TdWpWEiR6ZS9Iwb6ek62syk/siTt9wNpy1gwg1t72
+QPGaX+UufvHiROgz6OMPCq4L/1H/p4L1+i4k08Z86OcDq9tQ7FKcU6ExZfBljbw5
+EB9UsbdiUy+7CA2D9pu6Dpv2dO9H7H3/+m2Y4RPaMiL5qgax6Ksh7H9crsSfyi7f
+3omIwrZ0B8DEGlwAGIUR9H9a6SqeENgcAlAaNxkNjNnZo2W9e1EvdkaamxtHeQMb
+eLnTvVU41MpP1DaE4D49R/cVoZxEfpozEq6ZvzcIsbfvOOFhlln/SzSbrxHXWLMZ
+gvt8ukvCZtpiuG+MpMnXXoEYav42DSxogDB0b7/bX42eyFXZyz/tzpORcgBuKPIU
+aoWSLOEczSTqneFZw1laODg8ejHLOA3NhID/jrxYWenpP6TeWnf23aLXoVyc9voS
+aHf2gzLKG9Wg5SDz5THaxRUKvlY3kudA15AOQ1NkVvD10FCTDLB6WaA7hfhRslbM
+n6YyZj51SYQAH7LxDlQlco7Luvqiy4mnguLprBc1QREoTIQAM32yLptzBtggHQfl
+bMW74dKTLoW6+aNn4F9nqCJ88A==
+=2g4Z
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2383163BC40844FD
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+
+sub    EDB3D937B0C94C3E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBDwczzwRBADyR8BVt1SUMHxjSG1AAekABO0YQHJG/XwEHYk7zPH3aU14/ocf
+g6M8gxZXumM2f3oCCkmOpnW6uKxqTclQX44GyaMDETcAU5/bjWenWNj4INDlTjFS
+aWghWshotoGrfYsJFOctk4mBZKKW0+P9drC3pNGpfNYogwL7qYUdowyyRwCgwBTN
++ivnfWziygGHvdghntgOBHED/2lr7y3fJ7xGMGfg0UbHbVYgWKegKTUo2/Wxerzd
+H1laNxjZVl74NuHamkYTGuhoX8S3TBKwFskZbJcLSEfEqwulULUKnEkGxZYTkEZ5
+/3tXT6aHj0OSSz0C00qjInL1ETdU4MNXmDKs/wRUfvL73dTPrsbnOWQDCYlk+jZ/
+uDr8BACgHVEhJV0O0TAOYDsthK6NJP4otlms1I3Ya6KyDp5z/DGaOXFy3yLPbyw3
+QCzzCdwwIPDcALQk6FkQ+E2jEpJk6QkCWNcpPzZAmIwX5Kvttb36XCjKHkLjImlH
+TpdIMl33dYNstoQpN/fLB3COnRKC+c+nI+BwgdhMOxANJfJV3rQfUm9sYW5kIEt1
+aG4gPHJvbGFuZEBya3Vobi5pbmZvPohgBBMRAgAgBQJFXDsAAhsjBgsJCAcDAgQV
+AggDBBYCAwECHgECF4AACgkQI4MWO8QIRP1eLgCfT+Ovm52g5u5+h3WX8zDF/lFo
+ur0AoJe6gBMpHfe/0OkjY6+zM5wUfjt9iEYEEBECAAYFAkVfSOwACgkQiDzo8bG8
+unfDvgCeNjVQP0pFlc5a2T1XnYLZoTwJtz0AnAqxisgS6OBrHYe2GVBMWz5GRntp
+iEYEEBECAAYFAkYKNmIACgkQAej4Rm/xLDC73wCgp+uB+dxcZfJxfcXm5Ikcl36/
+ylAAoNe4NtX2ZO29Hp2CW8ytdExSQfMDiJwEEAECAAYFAkYKUDUACgkQo7JDfsbG
+CyiKZAP/fudAPRtwaUXvdaZlAF2SKmCQpw8KLkiwvC7mttM07fceOHECusZWJtOT
+SNmngkNXtDJ6KOi0I6ZHr2vLOBPCIH0jMA1e3bdVn5JP4bG3T+NZz8Z3vi6xTgB7
+3wj7ZrCqReA01Lppzy60OBOP/OgcA/RFzV3Si6N/6NlyicETTBOIRgQQEQIABgUC
+RisTwwAKCRAIeBZRg0fR2h0MAJ4wFEZ1FVSuSIw9cW4bd22mwvl3rgCgolZDn+8z
+54YAAIWltfmI/fBMLIeIRgQQEQIABgUCR7Fs4gAKCRDhW01sacYWxxJ6AJ94gyuD
+dSn5qBINVpW/dGrupov3VwCfc4g2ivb3jiY+WHxqd74b9heXSMu0G1JvbGFuZCBL
+dWhuIDxya0Bya3Vobi5pbmZvPohgBBMRAgAgBQJFXDrhAhsjBgsJCAcDAgQVAggD
+BBYCAwECHgECF4AACgkQI4MWO8QIRP0W+wCfedFdYYmLszCN/uCPbNBCRX2TSpYA
+ni08UFDBgGD/RV9ROjAD1lMF3MtEiEYEEBECAAYFAkVfSPEACgkQiDzo8bG8undZ
+3gCeM8TVV8cQ2sUVBstfKBPz7bP3ZV0AnAgqRCxNcl4N2463Twq37YbSKtMMiEYE
+EBECAAYFAkYKNmQACgkQAej4Rm/xLDDnGACeOKCL5ldfQzK8lV+AcrorBm/+YMEA
+oKD3ek7avLPgfVO14H0zsySnZz+jiJwEEAECAAYFAkYKUEAACgkQo7JDfsbGCyj0
+iAP+ME15RUR0laBRlwjNxGCAoGL4NKRxB0VHyvpxdvtvvMvKOiB3GMdr+HRi0WPd
+dzsyZCQSLJWJeOBb0QM+7RiJ26XC45mTd37B7YXdPw9AInBAts8R4G9CVGOeiOD5
+7/UNmTmZylYhoGjn1oG+dBNxQKazSzbV24m6sbg+nh2fUAWIRgQQEQIABgUCRisT
+wwAKCRAIeBZRg0fR2uJXAJsExAor4w+/2hqJ7bFcuWuFZSIwqQCeI+ARW3/fehdQ
+N4TFOmF1GyMzC82IRgQQEQIABgUCR7Fs4gAKCRDhW01sacYWx3aaAJ9U+282/csh
+O38qshgmqGGdghe4EQCfXGDeq4aZ5T/xbr51W7v0+C+6lIO0HVJvbGFuZCBLdWhu
+IDxya3VobkBwaC50dW0uZGU+iGQEExECABwCF4AFAkCAAWQHCwkIBwoDBAMVAwID
+FgIBAh4BABIHZUdQRwABAQkQI4MWO8QIRP3/ygCguzKzkNEInS9NJ5iL3l0dXSdi
+ZRgAnAgxhYIf4GuTlygzkp43G6IdqXUmiF8EExECABcFAj34pyYFCwcKAwQDFQMC
+AxYCAQIXgAASCRAjgxY7xAhE/QdlR1BHAAEBacUAn2YmoLBvbAfnRMZxyHRVB6eL
+XUHJAJ4ksnQnpwBLZt6fBdUL10pTn6OMxYhXBBMRAgAXBQI9+KcmBQsHCgMEAxUD
+AgMWAgECF4AACgkQI4MWO8QIRP1pxQCfZiagsG9sB+dExnHIdFUHp4tdQckAniSy
+dCenAEtm3p8F1QvXSlOfo4zFiEYEEBECAAYFAj3+8eIACgkQbxelr8HyTqRJ9QCf
+d5To6Jf+D4aWp9L+8PmZjs7MLzoAnRIopXzVt9H4pcgR3+ocqsTHwAwNiEYEEBEC
+AAYFAj3+94kACgkQgh8b4WEoxraPZQCgmuSblXHMp4hEmdv7yxC03kWQm9EAnRJo
+Ff4ox3zvsFjLrFhRvA0hlPoniEYEExECAAYFAj3/F7kACgkQa/m6DIbeOrctewCg
+uqkEjaufmB05gzdt4C2aREAA33MAnRkiEFNwtWEQChWETO2VUBdNW/tsiEYEEBEC
+AAYFAj3/T6cACgkQJhnUgw/SWV9K3ACdEVgs1Pi0JnCEdVt11H5lCYdbu5QAoMij
+Rugw6KhzCVHFlmtupgVEmPNHiEYEEBECAAYFAj4Az9AACgkQOYk/iYyUuL42jQCc
+Dewb/MBsG4zsqvnyn4rIjUnOzHIAnAxsbL51YvY37+ZEZhwaQYFOj++1iEYEEBEC
+AAYFAj4Az/gACgkQUlz1cr7NWzs7xQCgxlFAq7T03ZXmBoeDmhmcMWxGDDAAmwfc
+R7E4sNgzaTEeEXtSiRDnHFtMiEYEEBECAAYFAj4CGPwACgkQJpmyu0pQGyC3AwCg
+kw9Qmv8izc3cjrE/pEA4uN+VzOcAn3oKsTF0Sq+nTWZqoIJrCbs11MQfiEYEEBEC
+AAYFAj4CKSYACgkQTAqriu2jaAnjKACePwN9qSMuFvljnQXmCaPTzsH33iEAmgOi
+FnLyg5CK/91cNrAzVjVWQrZjiEYEEBECAAYFAj4DQVgACgkQ4VtNbGnGFsfIuQCg
+u1RvEKGZGPX+02TWFFj21C7lkpgAn2yI6JZ9PpKDbkCYy9XpMMder5GHiEYEExEC
+AAYFAkIMiZgACgkQb35XOFRiJB5k1ACffZzS9jOlvZq5JF8oXsPNFw1ZtqgAn0C5
+rEDcl1WLykhK6Jd/nvxUyijIiEYEEBECAAYFAkVXgpMACgkQE3GHdZhAp1/kSwCg
+/SbqwsZl/d2ivhixpbkw9R+vHiEAn3seWkrOSyMpwixYM59WlAnjqlLciEYEEBEC
+AAYFAkVfSPEACgkQiDzo8bG8uncKegCePGIb+c5cbTHbzev20ppJy+owjN8An0sL
+0G0NOcmcOS8le4fZJTqEqfH/iEYEEBECAAYFAkYKNmQACgkQAej4Rm/xLDAYZACg
+oO0sLhOtIUpy8EitufoAVhzs/40AoM4gzpyHcejx3Rp36pmzP6jKB1JuiJwEEAEC
+AAYFAkYKUEUACgkQo7JDfsbGCygSZAQAmA3uagEpciDboJ/05MiyR9lBxgJ8eIzG
+U/b+tdPRDphsqJBl/CXNDnjl1BF/DKUkeyw91EiefR4jjIAL5yxe2HjbXdd9N9xi
+eNd2Au2JHZTCRgIHg3ZwFGFxDHzhG8WAhOw+NBUZ4ZCg0VZQz/U1x4ceYt5o2ZYH
+tzwsE/NOlkGIRgQQEQIABgUCRisTwwAKCRAIeBZRg0fR2tQsAJ96mgLfUYv+6pEq
+p7k8yqm2D/ooNgCgwroahKwRNbHQKbvlJ6iNjI+SP360IVJvbGFuZCBLdWhuIDxy
+b2xhbmQua3VobkBnbXgubmV0PohkBBMRAgAcAheABQJAgAFkBwsJCAcKAwQDFQMC
+AxYCAQIeAQASB2VHUEcAAQEJECODFjvECET9/nsAnRoRp5GZJ57GBqmQxI/Y7kdk
+HgtkAKCMTYmCt9D1ADzSFiI0V7SPxLomLYhfBBMRAgAXBQI9+Kb1BQsHCgMEAxUD
+AgMWAgECF4AAEgkQI4MWO8QIRP0HZUdQRwABAWigAJ9DYiO1XGNPcfGbnHjlt2Wk
+m1EWrgCgpGemTUJbW3ulexv4LP2cNTEdnwaIVwQTEQIAFwUCPfim9QULBwoDBAMV
+AwIDFgIBAheAAAoJECODFjvECET9aKAAn0NiI7VcY09x8ZuceOW3ZaSbURauAKCk
+Z6ZNQltbe6V7G/gs/Zw1MR2fBohGBBARAgAGBQI9/vHiAAoJEG8Xpa/B8k6kOogA
+n1+SdDs3i/gDTyAPu/uRNbhcCtdjAKDT/X7Xx3v+RYSXcJhsAJV85+aXK4hGBBAR
+AgAGBQI9/veEAAoJEIIfG+FhKMa2js8AoKX5mEMU6cP9T66vT0fLOL8n2AtFAKCV
+eYhLsREx3hwogrsxuhS6MKHzxohGBBMRAgAGBQI9/xe5AAoJEGv5ugyG3jq32C4A
+njQCqLF84g2bHCejS99uYg4A5upbAKC03B0RS2tBJws20dwevanO0TixQohGBBAR
+AgAGBQI9/0+nAAoJECYZ1IMP0llfNR0An1gtNYtsYmweTKOWBhbyU892aflTAJ9l
+/pZSPM7aSiUPRqOic1/J95ssMYhGBBARAgAGBQI+AM/QAAoJEDmJP4mMlLi+/3YA
+n1JwKzMg71c4AZcOyKBv60OI3wnZAKDv8WDW6IioZJ4ii++asFkEiEkAuYhGBBAR
+AgAGBQI+AM/4AAoJEFJc9XK+zVs76YUAnjJ6wxIitLokoUyjPySs7GUeNZevAJ0e
+5L/SPhwav9vpQiVgdZ000XohEohGBBARAgAGBQI+Ahj8AAoJECaZsrtKUBsgQPAA
+oLHI3vy33CFagnaFd5PfzL+NOoY3AKDdVLvVN9G6lFbqPbr0yWboELtFHohGBBAR
+AgAGBQI+AikmAAoJEEwKq4rto2gJomoAn16U2TOQiDlpc6YRkBw1C0WPP82SAJ9j
+LZrAlNMtD0GKy906fbNuxMPdC4hGBBARAgAGBQI+A0FYAAoJEOFbTWxpxhbH+HIA
+n3f/9Y8NyyEu09B8MVGA1HYxOhlXAJ9AKkF4hTWY8vmAFe9gOeduSEdDIIhGBBMR
+AgAGBQJCDImYAAoJEG9+VzhUYiQeKe8AmgIguCD3blnr0pQQHmkXlHN5gboiAKCW
+XsLs8EbnxkoLSKfw3iNZcLo7N4hGBBARAgAGBQJFV4KTAAoJEBNxh3WYQKdf1XEA
+n2rFfq28ZwBlpz8V6UdF+Te7qMhIAKCVDBmEoMmhUvxpDaUvV/7Ouc0I/4hGBBAR
+AgAGBQJFX0jxAAoJEIg86PGxvLp3rFsAniEn7U1lgZSsnDh/hjpP41tBe77RAJ9n
+ZenIqCwSorEfVtrd7lv8nq81vohGBBARAgAGBQJGCjZkAAoJEAHo+EZv8SwwzkkA
+oJv1CRPkb8gRAoD3dZotTIhm0uDJAJ94EHg9LFp8gjk0tROped1NXOYM1oicBBAB
+AgAGBQJGClBJAAoJEKOyQ37GxgsoqoYD/AyAy83K6aubFEJo6shvsQ0rcYR026/J
+kcuM86sO6d8wI7bVF9V1t3v3eAD+gebaJb838qIHbhTa24UfxfyC4oLhDTiJpwXo
+Rh0aNuC/NGV/M2B8yH3iESQ8OBMbxnOmSIjGezQgei5FepYIv1MzBypLsOUVI359
+07EfHj1aqL04iEYEEBECAAYFAkYrE8MACgkQCHgWUYNH0dp07ACgwvBZWljLWE40
+sXaEO+MtcMiHI5MAn2cvJWTTqB0gj+3k2NmSFU2uMxM4tC1Sb2xhbmQgS3VobiA8
+cmt1aG5AZTE4LnBoeXNpay50dS1tdWVuY2hlbi5kZT6IZAQTEQIAHAIXgAUCQIAB
+ZAcLCQgHCgMEAxUDAgMWAgECHgEAEgdlR1BHAAEBCRAjgxY7xAhE/QVFAJ9e4+/D
+sLo2GPNtjdyjaOjyqHOzjQCfWmD4dQrdM4urJMI+T0vzvhSy8/aIXwQTEQIAFwUC
+PBzPPAULBwoDBAMVAwIDFgIBAheAABIJECODFjvECET9B2VHUEcAAQE6LQCfWJTk
+cmsCWMkg8oCpXmM6K4+u8KcAniHeV05whXPGLHUfgP5wul4R+pE4iFcEExECABcF
+AjwczzwFCwcKAwQDFQMCAxYCAQIXgAAKCRAjgxY7xAhE/TotAJ9YlORyawJYySDy
+gKleYzorj67wpwCeId5XTnCFc8YsdR+A/nC6XhH6kTiIRgQQEQIABgUCPf7x2QAK
+CRBvF6WvwfJOpHsTAJ9UxhqTrNlbqRz/WIkJFySAk1+wzACbBkv9N+lu5ME3w5/v
+Jx7hXi1YsKeIRgQQEQIABgUCPf72BwAKCRCCHxvhYSjGtp6pAJ95PiZ545M4I6Dr
++7DoMDjVnR0LewCfU3TN3RHLWUfMpClKQ3kIGG4PvJGIRgQTEQIABgUCPf8XrAAK
+CRBr+boMht46twW4AJsE9ZafAKOoZWZUxq3SLGgE92BtggCg3mUCPB7ghD0osPUE
+6kWYX2xiKhGIRgQQEQIABgUCPf9PpwAKCRAmGdSDD9JZXxrqAJ9Uns6G/DFQ4QfS
+vprXpqhGtVaFBACfSxGCBzP4F95pSIrVg037V73m52iIRgQQEQIABgUCPgDPzwAK
+CRA5iT+JjJS4vrqUAJwKVg24DpvVF6NoCTRroo/TXMHLnACgs7zhd+DUpIW/o4hr
+0PwM+qfWlNeIRgQQEQIABgUCPgDP9wAKCRBSXPVyvs1bOzeTAJ4hVJFiu//Z6NWF
+W0+2WjcmKaoFDgCg0HihTivB4oLQSX1Nk7Y4thsWWXOIRgQQEQIABgUCPgF0QwAK
+CRBMCquK7aNoCbCSAKDRNSaY0chDaljdNtKo19RZrVQ1ngCg8Ul3kMtZkF7C4GtY
+cQsTe7IwximIRgQQEQIABgUCPgIY+AAKCRAmmbK7SlAbIJCHAJ41w/YgHFpU/ZDW
+JsAdWrlv8uem1ACfap21W3qqdckX0K90nQc/2MH5Jv2IRgQQEQIABgUCPgNBQAAK
+CRDhW01sacYWx5vRAJ0cl7G65BmvjHkzXVXEEkYYtfS+kQCfV39Q5dcabanykN4c
+HfmmyWj/aESIRgQTEQIABgUCQgyJmAAKCRBvflc4VGIkHrSIAJ4ysFHSOjc9Gjzf
+BtlibOBXgWN22QCbBet71kIBdytPPDNf+ZuO6Mj9EfeIRgQQEQIABgUCRVeCjgAK
+CRATcYd1mECnX5AsAJ9iSAfoiBMKzB1Pdo2nS1cYTywIQQCcCyWyfibtQ/tamCAG
+KdAiG+auEQCIRgQQEQIABgUCRV9I8QAKCRCIPOjxsby6d5LgAJ91AA0PfJSkJVd+
+moQCeJVc8zGcrgCePBUZ9ey+vPxrBlsB31I0Hgvv0KqIRgQQEQIABgUCRgo2ZAAK
+CRAB6PhGb/EsMLJ/AJ9/DKOtXATttE+HFFm84UJf4f+fAgCgt6Ux+oPozdF02LAr
+4qMnP4mRM0GInAQQAQIABgUCRgpQTgAKCRCjskN+xsYLKG7wA/4/lExiL2PGmuzP
+urr+LDnRWjsJy24gqgNm3DZHu+KycpNUzzyQRdFrVO1NIQn4QJuVyh/jLxOkKi7X
+bpexev5WRpJVTIdLKn+YnVxHZMVbYMNDEEwqi93MbGFXn2HziVprZNaKOCu7prEP
+9SbNAKgTWaGIHRmjhTzqw+z9G4sCBIhGBBARAgAGBQJGKxPDAAoJEAh4FlGDR9Ha
+O9QAn2knWm6PTEHav9HRo0NpfWnkFcoWAJkBVoqMglIrU5GLElW+CwJTxqma6bQv
+Um9sYW5kIEt1aG4gPHJvbGFuZC5rdWhuQHBoeXNpay50dS1tdWVuY2hlbi5kZT6I
+ZAQTEQIAHAIXgAUCQIABXwcLCQgHCgMEAxUDAgMWAgECHgEAEgdlR1BHAAEBCRAj
+gxY7xAhE/dOeAJwNEUIIpIETuHqcR+yJwNGI0MM1sQCePu0S8du/ib4RbuJEeO/x
+B2KPFxOIXwQTEQIAFwUCPfinSwULBwoDBAMVAwIDFgIBAheAABIJECODFjvECET9
+B2VHUEcAAQGMcQCgjE+RYMRW55m55oPWlxr2GcUrAfQAnRBaA3/7pkjP9W8IVfHt
+uKRrYTOriFcEExECABcFAj34p0sFCwcKAwQDFQMCAxYCAQIXgAAKCRAjgxY7xAhE
+/YxxAKCMT5FgxFbnmbnmg9aXGvYZxSsB9ACdEFoDf/umSM/1bwhV8e24pGthM6uI
+RgQQEQIABgUCPf7x4gAKCRBvF6WvwfJOpGKnAKCOKCG9qC9SbLXWAH5dg2d4R2E4
+9wCfUBE6uHxqfY98gRHocN2Aff/3x2SIRgQQEQIABgUCPf73iQAKCRCCHxvhYSjG
+tvgxAJwLXg4L0SqMpxLqYbM25k0FKVZuUgCaAwMuB77qzb6xRIj/vZ22oBGuiWyI
+RgQTEQIABgUCPf8XuQAKCRBr+boMht46t2aIAJ9kw5BJWhafdRGMU+l25zXu8wHH
+WACgyKU6Z1VjVKdgmn0lqUh+oO75GoeIRgQQEQIABgUCPf9PpwAKCRAmGdSDD9JZ
+X3AoAKC3n5KCjh9DNrEEs4eZk3G2Ii97eQCgjM1NINTTOlB9c9K8NXbMVPqMweWI
+RgQQEQIABgUCPgDP0AAKCRA5iT+JjJS4vmFEAJ9O0d7waJi0DdmGoMuk45MG3iQw
+CgCgvCANcgScpVu52V4CB1OW1kjb31+IRgQQEQIABgUCPgDP+AAKCRBSXPVyvs1b
+O6A8AKD3/iyspWDTjWau9wV/9KwaGJ+yxgCghPbM8pElloBc8444PO8cY0amSGGI
+RgQQEQIABgUCPgIY/AAKCRAmmbK7SlAbIMinAKC3FTOL3agqCoukN7xB3xcHutY/
+dgCffuXv/Wup2WA0zqoboDZH3qHmwrWIRgQQEQIABgUCPgIpJQAKCRBMCquK7aNo
+CcSvAJ4m07cmT8unySrBlqBnUkQ5GGrMPACgnu6iDgowPJfvyDbuZpIkQf3zoN2I
+RgQQEQIABgUCPgNBWAAKCRDhW01sacYWxwgeAJ4iBRUJirkPJum3uQgFHd8Koobd
+qgCeKHP3LlS1rmjjDfJ83Bj29yG5tYCIRgQTEQIABgUCQgyJjwAKCRBvflc4VGIk
+Hg0gAJ4nVZKYJ+aNM223qcOPilRMEns4AwCfUEIJbO350f2fyK/joc12rGsKLpSI
+RgQQEQIABgUCRVeCkwAKCRATcYd1mECnXz7vAJ9btXDf1tzrkIMvZjyU3FEpMMXC
+swCeKZ6QK5DVv+dOMOnRVOYldWXiadCIRgQQEQIABgUCRV9I8QAKCRCIPOjxsby6
+d7adAKCLAufdS898TpC20lovfmCm2JsGZgCfdTySfepIvW2cnEn9NR4FJa1kPCuI
+RgQQEQIABgUCRgo2ZAAKCRAB6PhGb/EsMP6SAJ94EFSym1QzB7o9eAlhKRNM5A7/
+sACdHbMOqymIpzDPtidrCOl6Gg4+FMCInAQQAQIABgUCRgpQUQAKCRCjskN+xsYL
+KHkgBACHPUAiAuN1AdgroXaSf7zvplXomj1IWcIyC4H0/vKyK4K2jjbS2z1+zUn0
+PZFLkPJCioS5GQqKq/CjQYuOO6Z3JTuTLUabkvRv1vlCib6lAPSgK2276zWq/HD0
+xr9r6kjQWBtkigfec5y2GCIVS5Od2Koiymp5gFL1qwW/6FZPBIhGBBARAgAGBQJG
+KxPDAAoJEAh4FlGDR9HaS1oAnjhYdkQF/Bqk25rKWz/sOT4NUqijAJ457YjcmFIF
+XjRlT04n/5EqOh9ijLkBnQQ8HM9OEAZA1QjzjxeXwBmMVUQHiJgQvH9DKIR3f/lS
+TwvGnpFGrYZ/Qx0OgnrWmq0KKg9CpKKlGCfq+vCV3MHtHg3ZewHD6ESH/WpOwvEW
+Mp/Ql58lcz85Xw343P24BgPwSah9K5EW19vLo0C8evQSOw1HbheidqLWiCg0xsSc
+mMN96d7SOeJG67qRohGQ+FNx0unbw9OfKnnRUFyKkvx66kC7XuZvYQCmDhLr8mU3
+VTZH/W+nXkcQWUZ9IaEkCzJ0aBxZbKvBEU7CSj01FpMAAwYGPil6yMuJ9uFPEcKx
+qR/+op/83Ic35gBMzEIDX2snqnz58ETqsO8JmQucXilLzpRBoWD0bOBz4YjJOdNq
+MGiNJUE9xnq2/3qWuCCeHE3THIXhTNXK3IQ68PfeOu3Mn+pjnJIIfLeyRsaH1KQR
+z1y4bzRtlYV8xbNhgeYfkbRRPdvhcoMBrglHNkeWGl75mkfd0vCl/RhDWW1VlWIV
+QiWcK9o1o62hMuUi03H5s/OD4DonN8FujbJs1XK+tZ9hlJ2rIT0ekkYShsHFiEYE
+GBECAAYFAjwcz04ACgkQI4MWO8QIRP3xswCfYu37U+tEsEEg4sCfaFN+wKfy2/4A
+nioz3lCi3MT/S/OkR9SjrdSOuUYuiE4EGBECAAYFAjwcz04AEgkQI4MWO8QIRP0H
+ZUdQRwABAfGzAJ9i7ftT60SwQSDiwJ9oU37Ap/Lb/gCeKjPeUKLcxP9L86RH1KOt
+1I65Ri4=
+=5Xso
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2383163BC40844FD
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+uid    Roland Kuhn <[email protected]>
+
+sub    EDB3D937B0C94C3E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+1I65Ri4=
+=5Xso
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    15C71C0A4E0B8EDD
+sub    891E4C2D471515FE
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+tiwy+wOBjaK9g3Kk8jsN3I8t
+=8Tiq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7457CA33C3CE9E15
+sub    ABE9F3126BB741C1
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFIXyRQBCADe285y3Pu7KzoKyP6wqeNXtvvuwMatAmPm5x/i+S8MlryqzsYa
+x6twUmXV1yKjjtGrO+9fHvTOWBfSSP+fP9KTaTQYSasoJq2Mw4cQDy1i0zrxNZUw
+N4/BiyjQA25sdfaOolhO0sFlZuTZpYy5wG72KkA1ygNq0L+8aBKhEF6zDU61YzCC
+AxjcgTftgTeeoqkJtYa06lNz3jmJDN+zUQignfRa3ymoGtFHTzoXR9maE8RWDty4
+y+DY+8ibdGgSgKPZ0byTCDyNojgU1YTlADa/1/NY1ShYg617O1xicLNo0JEJlf2U
+Tu4Ymql36+xSkYSISU97Q6Utgq27XMuZvDUDABEBAAG5AQ0EUhfJFAEIAN9NHRd2
+bYP/3CDi+n1ilSChld0NR3DUBgS/AdqQ7IoAUfj7skyI/WyaMdV4uy6vRh5YgNg2
+g01nd0LLZR8Gf2Ck+D6F88CdZaTxlkcxHV/dXMZ8yBO+0D6yFRZEL7Imsv8Ig4QX
+OVwfuiXEPk/Ef5Dy9SdAVhcoErTGGR6BOGVVvexGtBwefsjMaOG0khkRbWIQ32Wx
+fUFuAv5XBQ0ckLrlKvYWUYhOlXg27GtFKH2EBBF0Z5ZWu7gaBFwSV0oLp9EWcD+C
++WEwUSfBdqfRJtyXvgf4kZdwdQ5caM8P2/Sdncl2l/LU1At2Smc+plr6zhIhDlLh
+lrzKGa16oARSBdUAEQEAAYkCPgQYAQoACQUCUhfJFAIbLgEpCRB0V8ozw86eFcBd
+IAQZAQoABgUCUhfJFAAKCRCr6fMSa7dBwURMCADHrqwRNHkbG1QsXJr9oUK6KVkL
+sPhcngIhxRLlqe89omg9G7eGNauzs2PKsB3txotCFc7ROVNv/TAuSDYzkPos8G46
+p3bGesjfJb24zc6GMT4RGIJoh1oNG1IciafIIHjp2ZJHRmEDwmvZG24OHJ+mlHLj
+aedtqlWu+zwwhH2VZrI/U3gW/x4imbk9UyyzciEIxrAc+fc19xl5PkUVcSDVC0cA
+qGpeZz8+SxFaf3Rr0aGnSbeuHRjNupmoxkQOAey1ztmdWiCPf5RFfmFD+fENh+/x
+qYiGorYpcIN7UAsMkvD5UHc5ZG2tTD41jM99w9Lm/xHJ9ks8gNwZESwIzr6ABKIH
+/1ulsflI216qPz5o7uUxlTm8NfTyATfCUuZEDMYGOjDQPqQa8hFebqjWWYBUq2Sl
+aKD2xMeEuEXV+M5k88Cx6T2nvaZWMsrD7uGj+tTsFaKBGxP5p2OSEWOTETKKv6Cx
+7vcMTQmrqSFo47bFKlNSs+aVM48UnQeFtTDyOhwa5jvtqtst4eQHwHWQ99BK0TEy
+mNx0vF0nPjWA76CRrfopOwXKdxJgoKq4MrxE92ot5I82AZBPeiWVJ+6wECeK/GoB
+IXZ5jEUqrQmmzIboWA5G5PMJ8egzLJNRJjTWHjCWrUTnwNcqaD4/qZxIlW4Lt0uv
+Glx6pKOJQ05u+9X/BzoVWrw=
+=ajY9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    95C15058A5EDA4F1
+uid    Eric Anderson (Maven Central) <[email protected]>
+
+sub    F57552EA2A2B5F3F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFUITeIBCADHIijQBuGmC+Oo/XE5qIXxzZ2cK26uD0tlDqaPhRLWt5RP3EbU
+b6X8ZLE2AlmawFzU0IqndrCDxSyuo9+ZFQRYT+stf+qHFjtvVQJh2+4L2LpcPrnf
+RK9QmmlDpKsTeS6ED32kYLDj7vwqrU+sdJcMxPViQ4TBq2AH+/pXoPJ9VBW0hg5Q
+WNehQ5yKireszStwEceRvNAnPffVJ3QVbOqFWQuxMboxZZnEmbpCot6hSCDTM+Kq
+3cyJkZTLm5ew9jHQGRmQB4sM8krQomokooSqUCb6YjPf5CmN5a4sB2z/YJMGbINr
+GOv48A9k+GDXliESyGyFUdrbZH+SCjU/LklfABEBAAG0MEVyaWMgQW5kZXJzb24g
+KE1hdmVuIENlbnRyYWwpIDxlam9uYUBnb29nbGUuY29tPokBOQQTAQIAIwIbAwcL
+CQgHAwIBBhUIAgkKCwQWAgMBAh4BAheABQJVCFAvAAoJEJXBUFil7aTxpLUH/2tF
+HofV14ZdDcrx0JRqVy6RUv6juLCzwdmaymOW/ZPYgVBs0tByQ5O1bZ5JprEuQCAk
+HKQj0SgI+1INuFsGDxJLXMwk9wbZGMUY3dcdXE9xAVTtxkFOExtEjTkjxP8TwCYt
+3AerZ3Qa/bdLfxIc1Ikeo5TC2rLcm0VJUh+5l7JKPxADpopQx5ATUdLgZEuEBRlg
+nWNm3Hrae6ovjKrXBomrdbAFcsWJNKPkhfszfh/8ajzXWLvYLAdGHaOLGtN5qHuY
+OMt/KNSWF3h6kC0a189292tTSHQy2lwKFVlbR/QW0VJF5K5cIv59dauGkGssiDj5
+Gq1o3bAfUdrVPBrtwba5AQ0EVQhN4gEIAMVQVNg6Kqg1pZNcafvm8CEwJonaIkmH
+82UmxslxuOP23O7so34CPYPOMgHW6werXSnjmGyk4X1LWOeexjbI1Ve7oG/zixy4
+GTtYST14BeGelAGYELc4CtoWlJ6SodIj/4pyuZdyrVjgWlWKvDS0wL0Mv0tRfP3h
+6bPkE1T4dsCVr3O3//qDWBFrPKClWIj8gPiQZBOZLWMwja6ML1r1KB/zW89mGs/Z
+NQqLjnXdSnS7Db4Mzn5C0JFrhbIhi1PICLYx2a4eW+ZQWArbKQYRg+aSRGZEUFyY
+lowM/FC1t8cPix7JnND7fWY+0+vDyB+dpPQ75VH5rHCpYEUIZzPUIqsAEQEAAYkB
+HwQYAQIACQUCVQhN4gIbDAAKCRCVwVBYpe2k8aYwB/9shrf3hLJEnLY9x7Py5wHD
+bKRw53ep/TXe5qHcH1iSClMEInREVE4ju8IHjOM0UsPKxTT/XDZ/rDXjp8eJYx6+
+ftJfk3Us8LnxQVcZGOwC4tO/sBpy+Z0pIpK4kyPzZjy7XjEDPauC73A1BrtIKM87
+NvazV6bbzMc57RAiwzigVGwSkqrur8O4H+seJ6YtM+rVXl0D7q5ZahXPQcZdCsAT
+6UYQxR4vx28L8k40ZTAx/gaT4SRV2vuNm14iujAgM7RfXM7l4LXt0HCaZYqitg3j
+qFEgtbX3f75Uz7wHmq1mY8CNjlnd2TV/NtdSzBeGxfsCXMEAOwWJ9rIWBuuAY22l
+=YwAJ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    95C15058A5EDA4F1
+uid    Eric Anderson (Maven Central) <[email protected]>
+
+sub    F57552EA2A2B5F3F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFUITeIBCADHIijQBuGmC+Oo/XE5qIXxzZ2cK26uD0tlDqaPhRLWt5RP3EbU
+b6X8ZLE2AlmawFzU0IqndrCDxSyuo9+ZFQRYT+stf+qHFjtvVQJh2+4L2LpcPrnf
+RK9QmmlDpKsTeS6ED32kYLDj7vwqrU+sdJcMxPViQ4TBq2AH+/pXoPJ9VBW0hg5Q
+WNehQ5yKireszStwEceRvNAnPffVJ3QVbOqFWQuxMboxZZnEmbpCot6hSCDTM+Kq
+3cyJkZTLm5ew9jHQGRmQB4sM8krQomokooSqUCb6YjPf5CmN5a4sB2z/YJMGbINr
+GOv48A9k+GDXliESyGyFUdrbZH+SCjU/LklfABEBAAG0MEVyaWMgQW5kZXJzb24g
+KE1hdmVuIENlbnRyYWwpIDxlam9uYUBnb29nbGUuY29tPokBOQQTAQIAIwIbAwcL
+CQgHAwIBBhUIAgkKCwQWAgMBAh4BAheABQJVCFAvAAoJEJXBUFil7aTxpLUH/2tF
+HofV14ZdDcrx0JRqVy6RUv6juLCzwdmaymOW/ZPYgVBs0tByQ5O1bZ5JprEuQCAk
+HKQj0SgI+1INuFsGDxJLXMwk9wbZGMUY3dcdXE9xAVTtxkFOExtEjTkjxP8TwCYt
+3AerZ3Qa/bdLfxIc1Ikeo5TC2rLcm0VJUh+5l7JKPxADpopQx5ATUdLgZEuEBRlg
+nWNm3Hrae6ovjKrXBomrdbAFcsWJNKPkhfszfh/8ajzXWLvYLAdGHaOLGtN5qHuY
+OMt/KNSWF3h6kC0a189292tTSHQy2lwKFVlbR/QW0VJF5K5cIv59dauGkGssiDj5
+Gq1o3bAfUdrVPBrtwba5AQ0EVQhN4gEIAMVQVNg6Kqg1pZNcafvm8CEwJonaIkmH
+82UmxslxuOP23O7so34CPYPOMgHW6werXSnjmGyk4X1LWOeexjbI1Ve7oG/zixy4
+GTtYST14BeGelAGYELc4CtoWlJ6SodIj/4pyuZdyrVjgWlWKvDS0wL0Mv0tRfP3h
+6bPkE1T4dsCVr3O3//qDWBFrPKClWIj8gPiQZBOZLWMwja6ML1r1KB/zW89mGs/Z
+NQqLjnXdSnS7Db4Mzn5C0JFrhbIhi1PICLYx2a4eW+ZQWArbKQYRg+aSRGZEUFyY
+lowM/FC1t8cPix7JnND7fWY+0+vDyB+dpPQ75VH5rHCpYEUIZzPUIqsAEQEAAYkB
+HwQYAQIACQUCVQhN4gIbDAAKCRCVwVBYpe2k8aYwB/9shrf3hLJEnLY9x7Py5wHD
+bKRw53ep/TXe5qHcH1iSClMEInREVE4ju8IHjOM0UsPKxTT/XDZ/rDXjp8eJYx6+
+ftJfk3Us8LnxQVcZGOwC4tO/sBpy+Z0pIpK4kyPzZjy7XjEDPauC73A1BrtIKM87
+NvazV6bbzMc57RAiwzigVGwSkqrur8O4H+seJ6YtM+rVXl0D7q5ZahXPQcZdCsAT
+6UYQxR4vx28L8k40ZTAx/gaT4SRV2vuNm14iujAgM7RfXM7l4LXt0HCaZYqitg3j
+qFEgtbX3f75Uz7wHmq1mY8CNjlnd2TV/NtdSzBeGxfsCXMEAOwWJ9rIWBuuAY22l
+=YwAJ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    912D2C0ECCDA55C0
+uid    Emily Johnston <[email protected]>
+
+sub    37AE8263DA3084E5
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=X7Ws
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    353A436E043E3145
+uid    Garvin LeClaire <[email protected]>
+
+sub    7494750BDF4F8FAE
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE1/v9YBCADaUiBecDzwU5g9Gmn3T9pAa17OlUl2iH0zn8tNTUg++bW/A9m3
+lWykQBlvPOi32lqZ5q7yewSNBGHl/pHRRVsIE6hhkVigNQbMztRFPshKCU/0RvKu
+29cew2T37crxYFGShYFwiJgOdQmXqhgIai0S2sW0Iavf5/PJJjXbrM1YIqUqkf73
+unns/lIDEiIDXCnGRNJKzGWTPsbt5R3hVo9mFraPUxapw3b9C/2GGDT/mwR51IOf
+rHkQby7Uh6XzDC8jWIH/BrFT6gFRZgKn9BRi3meB5vPip0rvcxPQnmvi2R4iUIyg
+DvCsUpXr6RpAEK6/p4k17JeglxCDlAbTDLUHABEBAAG0K0dhcnZpbiBMZUNsYWly
+ZSA8Z2FydmluLmxlY2xhaXJlQGdtYWlsLmNvbT6JATgEEwECACIFAk1/v9YCGwMG
+CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDU6Q24EPjFFHoQIAJXH6gRuS250
+q/EBG6vHSSqVWsck3vDwo22zGwAXOmuZ1YH7kCdzyfs9i3LnmtTyMUymvCBE0y94
+Bn2fFbin6CQsPS5U40NiquBo1wxyR8qO9pFpANlq4old1qW8t9mZBkwBjBpN6Pmf
+L5vbrgCECN46wVGqarPxseBgVjK7BB9E3qv9ymUrUJ8DSvL3b6vUwNEIqXDcZHKn
+xn4EX611YigPYiQazByw8UNq0a8kR262JN2ND64IxjBtFikdjuP5nck9Iz/yQ++V
+YpS2QfsaToCJfl8DhsVcht6N6pgo5FfDPOOhZyuDPCC+8j83JaeRS5sw6NcK03rk
+tNsnz4hef+u5AQ0ETX+/1gEIAJsFRfWMDIoJMsLPltDrrPsg1lpl2RFQuPqjZfPM
+0AAiAJTB/UhRfoMoijggV/m5r0y9d6LH4XhCynm+2VC/6TTxkvMKHAQroZFKzBKj
+vpCKXYaLgiMNi0XfsQ8p7/0nEUA1XXZDOrol9JJQ+3XxaQv3+64u+ZiZY7JrcH9M
+tytyVcsqOnQe8ST02pnpjwOIqh0TZt+HB17PWraDWRETspAMfbmoZSB9vEBiHsSo
+ELZYywFxcsxB+nbMunYONTjp/14MRKKlxeTLlH7CfJwaGV/2rvN+dKOymbg2uA4y
+/wrZrOJVE3G7IP5ehQ/Pitcb1TP6Q5LISdAo7zGFslS9iD8AEQEAAYkBHwQYAQIA
+CQUCTX+/1gIbDAAKCRA1OkNuBD4xRZ+QB/45ejZ9k7v3Yh4MtyY0th94E2h8UK3g
+T1axDIEyeWqQZaVxqvA8gG2kXhFP97c/WINUScMcdOCqTpUWRnQaZgcvD39/AFc5
+Bb3kN8Mo69YoOGkRRkvsY28NhRQBjn96QKUBmc4vGNBLV/XCsbhSD8T5KJdFszVc
+THg5q237mYucSzDfU9/0EUeSuFwwtng93Y4Rt5nDTm1MLcnBi5CTGw6Q1FL9orGN
+Hi6OXcwXDGKK1iiWjUjrmXwpgp5Zv+A4WcmG2dZHADjBlsgeHhfWCfxdJeMNZ5BO
+LL6SHLRuKiw6HUKNYs6BZNNdPQXapzKhCpSuFHW+84/4S2jX89AAfhTk
+=S97J
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    353A436E043E3145
+uid    Garvin LeClaire <[email protected]>
+
+sub    7494750BDF4F8FAE
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE1/v9YBCADaUiBecDzwU5g9Gmn3T9pAa17OlUl2iH0zn8tNTUg++bW/A9m3
+lWykQBlvPOi32lqZ5q7yewSNBGHl/pHRRVsIE6hhkVigNQbMztRFPshKCU/0RvKu
+29cew2T37crxYFGShYFwiJgOdQmXqhgIai0S2sW0Iavf5/PJJjXbrM1YIqUqkf73
+unns/lIDEiIDXCnGRNJKzGWTPsbt5R3hVo9mFraPUxapw3b9C/2GGDT/mwR51IOf
+rHkQby7Uh6XzDC8jWIH/BrFT6gFRZgKn9BRi3meB5vPip0rvcxPQnmvi2R4iUIyg
+DvCsUpXr6RpAEK6/p4k17JeglxCDlAbTDLUHABEBAAG0K0dhcnZpbiBMZUNsYWly
+ZSA8Z2FydmluLmxlY2xhaXJlQGdtYWlsLmNvbT6JATgEEwECACIFAk1/v9YCGwMG
+CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDU6Q24EPjFFHoQIAJXH6gRuS250
+q/EBG6vHSSqVWsck3vDwo22zGwAXOmuZ1YH7kCdzyfs9i3LnmtTyMUymvCBE0y94
+Bn2fFbin6CQsPS5U40NiquBo1wxyR8qO9pFpANlq4old1qW8t9mZBkwBjBpN6Pmf
+L5vbrgCECN46wVGqarPxseBgVjK7BB9E3qv9ymUrUJ8DSvL3b6vUwNEIqXDcZHKn
+xn4EX611YigPYiQazByw8UNq0a8kR262JN2ND64IxjBtFikdjuP5nck9Iz/yQ++V
+YpS2QfsaToCJfl8DhsVcht6N6pgo5FfDPOOhZyuDPCC+8j83JaeRS5sw6NcK03rk
+tNsnz4hef+u5AQ0ETX+/1gEIAJsFRfWMDIoJMsLPltDrrPsg1lpl2RFQuPqjZfPM
+0AAiAJTB/UhRfoMoijggV/m5r0y9d6LH4XhCynm+2VC/6TTxkvMKHAQroZFKzBKj
+vpCKXYaLgiMNi0XfsQ8p7/0nEUA1XXZDOrol9JJQ+3XxaQv3+64u+ZiZY7JrcH9M
+tytyVcsqOnQe8ST02pnpjwOIqh0TZt+HB17PWraDWRETspAMfbmoZSB9vEBiHsSo
+ELZYywFxcsxB+nbMunYONTjp/14MRKKlxeTLlH7CfJwaGV/2rvN+dKOymbg2uA4y
+/wrZrOJVE3G7IP5ehQ/Pitcb1TP6Q5LISdAo7zGFslS9iD8AEQEAAYkBHwQYAQIA
+CQUCTX+/1gIbDAAKCRA1OkNuBD4xRZ+QB/45ejZ9k7v3Yh4MtyY0th94E2h8UK3g
+T1axDIEyeWqQZaVxqvA8gG2kXhFP97c/WINUScMcdOCqTpUWRnQaZgcvD39/AFc5
+Bb3kN8Mo69YoOGkRRkvsY28NhRQBjn96QKUBmc4vGNBLV/XCsbhSD8T5KJdFszVc
+THg5q237mYucSzDfU9/0EUeSuFwwtng93Y4Rt5nDTm1MLcnBi5CTGw6Q1FL9orGN
+Hi6OXcwXDGKK1iiWjUjrmXwpgp5Zv+A4WcmG2dZHADjBlsgeHhfWCfxdJeMNZ5BO
+LL6SHLRuKiw6HUKNYs6BZNNdPQXapzKhCpSuFHW+84/4S2jX89AAfhTk
+=S97J
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1DA784CCB5C46DD5
+uid    Rafael Winterhalter <[email protected]>
+
+sub    7999BEFBA1039E8B
+sub    A7E989B0634097AC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=gRaX
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1DA784CCB5C46DD5
+uid    Rafael Winterhalter <[email protected]>
+
+sub    7999BEFBA1039E8B
+sub    A7E989B0634097AC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=gRaX
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1DA784CCB5C46DD5
+uid    Rafael Winterhalter <[email protected]>
+
+sub    7999BEFBA1039E8B
+sub    A7E989B0634097AC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=gRaX
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    11509ED50EC155E6
+uid    Konrad 'ktoso' Malawski <[email protected]>
+uid    Konrad 'ktoso' Malawski <[email protected]>
+uid    Konrad 'ktoso' Malawski <[email protected]>
+uid    Konrad 'ktoso' Malawski <[email protected]>
+
+sub    DEDF3A7EB400D53A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+1+61dcLTcdUOi2uBhwZG67Mpp3cSRw==
+=lHW6
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3FAAD2CD5ECBB314
+sub    3260CB2DEF74135B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+xZG1NzW9unRL1j8/o6QtwZ1S
+=cP6l
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3FAAD2CD5ECBB314
+sub    3260CB2DEF74135B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+xZG1NzW9unRL1j8/o6QtwZ1S
+=cP6l
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    296CD27F60EED12C
+uid    Charles Lee <[email protected]>
+
+sub    D95ECEC170500D9F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+pbySzrh5PAD5/2W6CzkFMpH6a6E=
+=sgH/
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7C7D8456294423BA
+uid    Henri Tremblay <[email protected]>
+
+sub    9842FE565AA0601E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN
+Yjq5KsVOQxZzloVdtqx75rznT7fZq98g7Nq9IeEtB6k4tnh6XQLhljJMk0a3mzdt
+q3VzdxeVbwCaPJ0zixv8XPTAH6MpRJUvP9XjzxwaYHrjwcQ1LslW4TrIzwCgi5rf
+jChLCyKcaL05gqUjl4lmefED/iqOwYZw5pJ8+X+OHUViiOB43wsJt1brAhPj4KgB
+ODStcE6WlHFKi7YzcYNLzYMebSGYn6bj65b3qNf6rybWD1hGUFK4122Q7+HCH9Ic
+J+rr8HwjGFo/yxI0/mkyaF0BthXYPy4WtdsdTM2kgx8Zr3Q2rSt1jBPuV3q8d27z
+FZMiA/9cWPkRx0RfAJmBPKmKkbBkEtBbNau3G7MY1OEAkEkRnzmnyyjr5IP84A7K
+RdjTCvkbiQrOQH00Ki4sHIg+9Xv1gDg1XLkFDzRARKA1TxjL0OeS4RWF3iia7Swk
+MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurQpSGVucmkgVHJl
+bWJsYXkgPGhlbnJpLnRyZW1ibGF5QGdtYWlsLmNvbT6IYAQTEQIAIAUCS+xnDgIb
+AwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEHx9hFYpRCO6PVEAn2zcXoOXcW0I
+7Ht0qnUs4ZMM84ahAKCAKHGR83czneSiWoCsXKJQo9ZQ3LkCDQRL7GcQEAgAthrb
+FDDbIGq97dbX1ZEwNGpjILdeumxZzaCc5PgldHGA86TL2V9iPpONJtv7/Csr1c/r
+vH0IA/BFu+0Kde9UP+z9JycmfJpIsd2Qtxfhn9R4+Td0VtN9NNkpt1+JcThbzyQq
+4UU82uBKwSG/wzubOI4Fn+7ypIuNgDkqK0STIL3ucKF/RV77PsOBeLHkCGKIVhUU
+fY1D51BWZKKB1efaVK7PLdnsi64lAhbaexA43dwUUtVwQOvDzJVtkycV2IMwXwyH
+onlK+4vbcwIH2BAU46LIZy+VFaI+lNNmR9+xeWH49oJYnMWIXif4RzvO1ag2KKwl
+G2sacuVTtpWVqKayBwADBQf7BGl4POKtluAbX3a/KGnX1YyibPT2e4pdOxqbKTwu
+Rc7ILIK/LVcejVuLd+eOF1QmjToI7Y3qjlzvtaxSemfkxbIQpdus0SyHEEAGH/qj
+NuTs8ZwEl9tPPrKaJHbJ9kQrlDPwkufA0NDAXTE76UhcHPY0DeykAKEw2ravEqI7
+Y0nXR2WSmRLFChmQ+aNTm/9UGI/IoRdS/dgo1eaLD/7RLFeL5tGDe+2nj+B6j+52
+nZEmaRCWWU7O9jYL1cQu5WTurtneCLtIqehLsjuVz9ihBysYuUcTOV/6W0AIclQo
+MEiFR9Kyv0owDk6LtX2DgibJuAvvLlnajsiGm5nyVh3G1IhJBBgRAgAJBQJL7GcQ
+AhsMAAoJEHx9hFYpRCO6iXUAnRcLw17lBhe/WcKFRkzETSxaJcjIAJ4/P1NNOn/e
+ScLdx27sje7q3sBENw==
+=TjvQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7C7D8456294423BA
+uid    Henri Tremblay <[email protected]>
+
+sub    9842FE565AA0601E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN
+Yjq5KsVOQxZzloVdtqx75rznT7fZq98g7Nq9IeEtB6k4tnh6XQLhljJMk0a3mzdt
+q3VzdxeVbwCaPJ0zixv8XPTAH6MpRJUvP9XjzxwaYHrjwcQ1LslW4TrIzwCgi5rf
+jChLCyKcaL05gqUjl4lmefED/iqOwYZw5pJ8+X+OHUViiOB43wsJt1brAhPj4KgB
+ODStcE6WlHFKi7YzcYNLzYMebSGYn6bj65b3qNf6rybWD1hGUFK4122Q7+HCH9Ic
+J+rr8HwjGFo/yxI0/mkyaF0BthXYPy4WtdsdTM2kgx8Zr3Q2rSt1jBPuV3q8d27z
+FZMiA/9cWPkRx0RfAJmBPKmKkbBkEtBbNau3G7MY1OEAkEkRnzmnyyjr5IP84A7K
+RdjTCvkbiQrOQH00Ki4sHIg+9Xv1gDg1XLkFDzRARKA1TxjL0OeS4RWF3iia7Swk
+MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurQpSGVucmkgVHJl
+bWJsYXkgPGhlbnJpLnRyZW1ibGF5QGdtYWlsLmNvbT6IYAQTEQIAIAUCS+xnDgIb
+AwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEHx9hFYpRCO6PVEAn2zcXoOXcW0I
+7Ht0qnUs4ZMM84ahAKCAKHGR83czneSiWoCsXKJQo9ZQ3LkCDQRL7GcQEAgAthrb
+FDDbIGq97dbX1ZEwNGpjILdeumxZzaCc5PgldHGA86TL2V9iPpONJtv7/Csr1c/r
+vH0IA/BFu+0Kde9UP+z9JycmfJpIsd2Qtxfhn9R4+Td0VtN9NNkpt1+JcThbzyQq
+4UU82uBKwSG/wzubOI4Fn+7ypIuNgDkqK0STIL3ucKF/RV77PsOBeLHkCGKIVhUU
+fY1D51BWZKKB1efaVK7PLdnsi64lAhbaexA43dwUUtVwQOvDzJVtkycV2IMwXwyH
+onlK+4vbcwIH2BAU46LIZy+VFaI+lNNmR9+xeWH49oJYnMWIXif4RzvO1ag2KKwl
+G2sacuVTtpWVqKayBwADBQf7BGl4POKtluAbX3a/KGnX1YyibPT2e4pdOxqbKTwu
+Rc7ILIK/LVcejVuLd+eOF1QmjToI7Y3qjlzvtaxSemfkxbIQpdus0SyHEEAGH/qj
+NuTs8ZwEl9tPPrKaJHbJ9kQrlDPwkufA0NDAXTE76UhcHPY0DeykAKEw2ravEqI7
+Y0nXR2WSmRLFChmQ+aNTm/9UGI/IoRdS/dgo1eaLD/7RLFeL5tGDe+2nj+B6j+52
+nZEmaRCWWU7O9jYL1cQu5WTurtneCLtIqehLsjuVz9ihBysYuUcTOV/6W0AIclQo
+MEiFR9Kyv0owDk6LtX2DgibJuAvvLlnajsiGm5nyVh3G1IhJBBgRAgAJBQJL7GcQ
+AhsMAAoJEHx9hFYpRCO6iXUAnRcLw17lBhe/WcKFRkzETSxaJcjIAJ4/P1NNOn/e
+ScLdx27sje7q3sBENw==
+=TjvQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3C0A8F4744F37328
+sub    D17266C6E05F9993
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFSQ6LEBCADnoAfQsg2uDYMnEPqt7tlnZxzyLVKiHXdJzT6OHA0FUdsB9H/9
+vWI863v20dsk4+tf1pXLa1AWBusInf7FM1JBCQBc/By3fR3JRhJU0QSoEcwtOQSa
+MmktLQx6s5V3hee6pJDJicY3fESWqrVygiUeyuRJupbBOOh3V4GkKnk1s48ZBesl
+viHzOjz8ysZKbn3h7mDuR4NaMx54U9x008NKs4Ry4ztAXbf2FqkmhkU1aE+1v1vz
+/mShXXuwGjYuv4OnQyP6ONHJPOclc4mDFU3yuUg328AUCbWHPg1kAMbpZLiEnBgN
+anC0K9BxYfVdQV55XSMMrdPfC4dNAwMEuzkRABEBAAG5AQ0EVJDosQEIAN9tyXFa
+CMYODFVn/vTf/9+Am9AoNvTtvoulLoC3VsamyIel3QI7ek9rppLi6G/lww9q1EYy
+3F0dR4ciqN8meMnGCbl0KhXCn2IJLp3MabaG4BmMbdskAGoqd2P3lynhbOnjQMBV
+RMcXFWqHPMfpAB4/5RM3wsgOn3vn/eDNBWPbGiHk297EUxGhooVmyb+1mbVXuNDE
+8S9KsiLus3Yq0vytlUI6DoPZoTMaO4GGJG4aOUw0abK6zPfPylzDaFXoryTaRhhJ
+lb4HONVT3GNFOT2Ob+ntgFx0I0cPfKKHDqJhcZl/CAWUMNyQb5/+u7uybyBGHzJw
+fydRH28FC9+m/xEAEQEAAYkBHwQYAQIACQUCVJDosQIbDAAKCRA8Co9HRPNzKJQj
+CACofWbBHPEPNj5mqVtJf/HuViQYib4PlIZKvcKsl2TVXkDdARzW38MV18ZDKUm7
+XECp1BPST0pwKvf1auq1/25X1BOtNC9FIFs8649K4U6RouDbXPo4hyzB0Og+608b
+KC8MN311Cqth+MuWy7rHjBZytNR8CW6e1XQBxJjW/G+1SYRM57g56S9IoPiTMDsW
+8jMQaYyNY7/Getddzfl4EZmjiiOysN3FQrrwF1tUGczLaDiaTO+db/FEGJpzBVmW
+WkxFGLuAjlkSPvBW+ijlTMnWwTnd3Ps/iBHWXLb2StrDV2vmhVln2gw3uR1qML90
+iwdK19eTAhhc+QJ28/SKBcyA
+=F4/Q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3C0A8F4744F37328
+sub    D17266C6E05F9993
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFSQ6LEBCADnoAfQsg2uDYMnEPqt7tlnZxzyLVKiHXdJzT6OHA0FUdsB9H/9
+vWI863v20dsk4+tf1pXLa1AWBusInf7FM1JBCQBc/By3fR3JRhJU0QSoEcwtOQSa
+MmktLQx6s5V3hee6pJDJicY3fESWqrVygiUeyuRJupbBOOh3V4GkKnk1s48ZBesl
+viHzOjz8ysZKbn3h7mDuR4NaMx54U9x008NKs4Ry4ztAXbf2FqkmhkU1aE+1v1vz
+/mShXXuwGjYuv4OnQyP6ONHJPOclc4mDFU3yuUg328AUCbWHPg1kAMbpZLiEnBgN
+anC0K9BxYfVdQV55XSMMrdPfC4dNAwMEuzkRABEBAAG5AQ0EVJDosQEIAN9tyXFa
+CMYODFVn/vTf/9+Am9AoNvTtvoulLoC3VsamyIel3QI7ek9rppLi6G/lww9q1EYy
+3F0dR4ciqN8meMnGCbl0KhXCn2IJLp3MabaG4BmMbdskAGoqd2P3lynhbOnjQMBV
+RMcXFWqHPMfpAB4/5RM3wsgOn3vn/eDNBWPbGiHk297EUxGhooVmyb+1mbVXuNDE
+8S9KsiLus3Yq0vytlUI6DoPZoTMaO4GGJG4aOUw0abK6zPfPylzDaFXoryTaRhhJ
+lb4HONVT3GNFOT2Ob+ntgFx0I0cPfKKHDqJhcZl/CAWUMNyQb5/+u7uybyBGHzJw
+fydRH28FC9+m/xEAEQEAAYkBHwQYAQIACQUCVJDosQIbDAAKCRA8Co9HRPNzKJQj
+CACofWbBHPEPNj5mqVtJf/HuViQYib4PlIZKvcKsl2TVXkDdARzW38MV18ZDKUm7
+XECp1BPST0pwKvf1auq1/25X1BOtNC9FIFs8649K4U6RouDbXPo4hyzB0Og+608b
+KC8MN311Cqth+MuWy7rHjBZytNR8CW6e1XQBxJjW/G+1SYRM57g56S9IoPiTMDsW
+8jMQaYyNY7/Getddzfl4EZmjiiOysN3FQrrwF1tUGczLaDiaTO+db/FEGJpzBVmW
+WkxFGLuAjlkSPvBW+ijlTMnWwTnd3Ps/iBHWXLb2StrDV2vmhVln2gw3uR1qML90
+iwdK19eTAhhc+QJ28/SKBcyA
+=F4/Q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5E1F79A7C298661E
+uid    David P. Baker <[email protected]>
+
+sub    A7CC6488427379A4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFgRFtYBCADud9fmvTI8Dbs+9GcZUIVzxkL84QYHSDxI9fF+sxfAviq1U+YJ
+a+ZLIW7HsXx8vpn3hqIqAbDxHjrb6MEJ3OWD5Ks7O9Lq7HOhtqAT/mpV3fZmf6pF
+zdEw7c4UrfbtKyBY2kSBpKzTfu6HD3q4OBDm59Ezs2XFhKrXtlNC0fQ30ysBpIvm
+vZH/opwlBgyELKnAYJ6eCmdW1iiju7DPKDBOrGi6zgvslToLpnZeSg6hzSyjM15n
+Gx6Dgby0GNR4VEVze/UdOpsFVTSfP9qXgdt5ZOWQqW2Jg5V/ezvk+3Ok+ecfHWRz
+q8tHkagnqn0SfP6mLqUNvmvAH7xp8crH8L/TABEBAAG0H0RhdmlkIFAuIEJha2Vy
+IDxkcGJAZ29vZ2xlLmNvbT6JATgEEwECACIFAlgRFtYCGwMGCwkIBwMCBhUIAgkK
+CwQWAgMBAh4BAheAAAoJEF4feafCmGYepYQH/AoDwA/N5Zq0z686DtrAu3KeQCap
+YbI4oNQ/yhCuCivJy9ORkqOLRZDhrfkmwFmetOmDeg8GAfoMEDUSvgXLqqli4wMS
+UNNlRA18X6g8N/FS7w/rWP0wp68boPK/Ry9Q/f7SFmMxrObT7aSX4hnhzWZfWTZy
+YkhWN9Y3+nXFtaT/XViZtHoxLZP0Ei92N0zcWGkKs/drH84OS+XMVRktCNExyXUY
+wD/cyD9n6r6f/TGtaL8cpXqu46IhLpeaPMPWqikZCLX/2KGSwiO4H2juTkkhQn8E
+bCZziDmfDY6RAa5xrsOnFeLYGbqbkoK7BfR9d+tMFtkgkXxqpHFMjW3a4QG5AQ0E
+WBEW1gEIAMuetYIGcqEC7KdfWn6EKmO7ZucfOEirvo+WXclo48WX0Eo0gsTghKPG
+TS2kOzglwn/wYCbBVKzYaOngZljIcrR47hJiY/u7OH7EjiCiB0sh5WuEqOaCPPFo
+8lCA1+SBPAF+c1d7SfIEABL/WCc6e1rkKhe7wkBSclspL8YQUG3cr5G/cSCGOV69
+TsCqq7rtezjkSsfE5dxmcs39Ouur7hs25DKehufUA5bV2i51v49WIuTE8x53VfIn
+YsJyeRs7f4sx3hmkwN+EL2mo1YFymGwEkp8iB0Jtrpsevl4AFOajl6X4IrdLn6+X
+Sok/1mzIm+t1ZHokQ3mUWe5FC9c1Y1MAEQEAAYkBHwQYAQIACQUCWBEW1gIbDAAK
+CRBeH3mnwphmHv59CACEnAU1vbN4qxquAzNuaalyV6Hyx9olUQqPHopRGBA2ulPs
+0l+gtAXz5USotNsh3Ai5j39Y4J+qxN3HuDtscxEReogawzOo/B+1IKuGuuTzvL6f
+U6ZFUnEosxChAKwJo9eS5xlyenyumTcXx5yB/5X5nqTes6tcZlDcEefh7K5Iaazw
+E5caITBX0ze8g7WQzRxyN+vuhY30U7P8TTKxAsavdSBVIb+Hp0e2W2S5T3ogXaGk
+Ii5qllr9uhfX+E9zLxJJKfJot33ix647mPwpXxo7K6teo2rkwOTQij1sEe2sbMZi
+KZkn4rYSgLpZiVLPiDYuP3RTuHnFenYROA/YcDvA
+=qbvN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5E1F79A7C298661E
+uid    David P. Baker <[email protected]>
+
+sub    A7CC6488427379A4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFgRFtYBCADud9fmvTI8Dbs+9GcZUIVzxkL84QYHSDxI9fF+sxfAviq1U+YJ
+a+ZLIW7HsXx8vpn3hqIqAbDxHjrb6MEJ3OWD5Ks7O9Lq7HOhtqAT/mpV3fZmf6pF
+zdEw7c4UrfbtKyBY2kSBpKzTfu6HD3q4OBDm59Ezs2XFhKrXtlNC0fQ30ysBpIvm
+vZH/opwlBgyELKnAYJ6eCmdW1iiju7DPKDBOrGi6zgvslToLpnZeSg6hzSyjM15n
+Gx6Dgby0GNR4VEVze/UdOpsFVTSfP9qXgdt5ZOWQqW2Jg5V/ezvk+3Ok+ecfHWRz
+q8tHkagnqn0SfP6mLqUNvmvAH7xp8crH8L/TABEBAAG0H0RhdmlkIFAuIEJha2Vy
+IDxkcGJAZ29vZ2xlLmNvbT6JATgEEwECACIFAlgRFtYCGwMGCwkIBwMCBhUIAgkK
+CwQWAgMBAh4BAheAAAoJEF4feafCmGYepYQH/AoDwA/N5Zq0z686DtrAu3KeQCap
+YbI4oNQ/yhCuCivJy9ORkqOLRZDhrfkmwFmetOmDeg8GAfoMEDUSvgXLqqli4wMS
+UNNlRA18X6g8N/FS7w/rWP0wp68boPK/Ry9Q/f7SFmMxrObT7aSX4hnhzWZfWTZy
+YkhWN9Y3+nXFtaT/XViZtHoxLZP0Ei92N0zcWGkKs/drH84OS+XMVRktCNExyXUY
+wD/cyD9n6r6f/TGtaL8cpXqu46IhLpeaPMPWqikZCLX/2KGSwiO4H2juTkkhQn8E
+bCZziDmfDY6RAa5xrsOnFeLYGbqbkoK7BfR9d+tMFtkgkXxqpHFMjW3a4QG5AQ0E
+WBEW1gEIAMuetYIGcqEC7KdfWn6EKmO7ZucfOEirvo+WXclo48WX0Eo0gsTghKPG
+TS2kOzglwn/wYCbBVKzYaOngZljIcrR47hJiY/u7OH7EjiCiB0sh5WuEqOaCPPFo
+8lCA1+SBPAF+c1d7SfIEABL/WCc6e1rkKhe7wkBSclspL8YQUG3cr5G/cSCGOV69
+TsCqq7rtezjkSsfE5dxmcs39Ouur7hs25DKehufUA5bV2i51v49WIuTE8x53VfIn
+YsJyeRs7f4sx3hmkwN+EL2mo1YFymGwEkp8iB0Jtrpsevl4AFOajl6X4IrdLn6+X
+Sok/1mzIm+t1ZHokQ3mUWe5FC9c1Y1MAEQEAAYkBHwQYAQIACQUCWBEW1gIbDAAK
+CRBeH3mnwphmHv59CACEnAU1vbN4qxquAzNuaalyV6Hyx9olUQqPHopRGBA2ulPs
+0l+gtAXz5USotNsh3Ai5j39Y4J+qxN3HuDtscxEReogawzOo/B+1IKuGuuTzvL6f
+U6ZFUnEosxChAKwJo9eS5xlyenyumTcXx5yB/5X5nqTes6tcZlDcEefh7K5Iaazw
+E5caITBX0ze8g7WQzRxyN+vuhY30U7P8TTKxAsavdSBVIb+Hp0e2W2S5T3ogXaGk
+Ii5qllr9uhfX+E9zLxJJKfJot33ix647mPwpXxo7K6teo2rkwOTQij1sEe2sbMZi
+KZkn4rYSgLpZiVLPiDYuP3RTuHnFenYROA/YcDvA
+=qbvN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2E2010F8A7FF4A41
+sub    E4D15F24364C7906
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEnOgPURBADYutfvXAtNgf67BQ2gWTI6+nKfILIwMPzCbQPMd7pykzF5nPMu
+Nswt3E7efo5IP1Zsv6DRrLafAW0OJSmL/oo8/ta0AfqcxCCbJ6CUyViifRZ5T4nU
+WfuWTZiaKRQ57jtt0WnNpFNFf00gDbYJWs5b4RU5Vac/0B0WDQ0wvOJfBwCgylAw
+LrDQmwyOZcws9VbpvZvz9pMEAMRkV6DN8kvmfktpbUnHNuZJOps5botqKyffQVj/
+b2zh9mQ9yFpaSWESdFgpJNeBGtQJEDOz2G/q9ydTrYyCD8ILMKmsUlj/DAjaE7mU
+/NmSpHBUO97NJN/fdMgkkbkSlk4j64lGaVovQph9ehw3DsuSTF8IPvr/DXV9nuIc
+duxTBACUE6vsxZlzB9dXe5HjKCoPGr90kUm8uCG/CVu6fBVpZZa9B6+OM6NhEkLG
+FA/EKgKc/tvNIlPsRwX1R2RoV9/tR9N772ZjhLcEBKV2UO9mb5iAWWZaMJtQ06SI
+Ws9fyd+Zx3GGY1+iwWPUxZ2lSGLlfg3Sunl7Cni86tb0fTHTrrkCDQRJzoD1EAgA
+lYw+EWr/t9pNqJhzVpAZ9u3LMKJfrGopbO+jOW0T58mIdVF4oMF5WZ4lHPTgHrRL
+KxXNcGlzaxjxBKtkUbnjRTSGk7ExzGIcWoqq65RI8JgONif1VpBaS4Y8WwX/akQB
+nCAL+eV7UwHttVUKEmt4xUW5CNa4BgCFKtVdiomvdxnBHBCgfWNHXpNnQLWhuOGJ
+ZVyqq1ZAh0/vIxUBDSJZPxmEh5235+2CDK8Zu4FCcsi409zrLTtga+ggsN4tp22x
+vRgNs6nwARsk4paFII3OMkdMVJlGqU0oQ+H5I5PADBFSUYwpcIYne/+k19+QMR1x
+Ik+7EavzdOribLC/nwaLFwADBQf+INE8jnD6qg3g1gRN3S9MNh+PAPEsrM/7Gw0N
+CAhaf3METVwSzZfwVNiXM8DVEGjaBAPTBpuJdveHpTG43E4eibjXWTe7j5A5QSUx
+O7p3W4AXNTKldFnlKkVs+6ZKCkKeasY2/7do6Cf2Ed6lL1CDXEYcZRZ6BbkXruI/
+HqT/IP2mTw1i53S5Gxj3gaG/jOroXN5cBZnRoaPJQpuri9hdUJVqPNIDhe8dz3Zx
+kHEgVPMoanp8xti86ErSjgvsxGs6xjjuxC9CNjMjyod7d6E1NSt7gvVdksX3vok3
+QvIqQKDO6l777R9LQcxEStPz91mrBRTAyO6b7AtCk4/5S2hTdYhJBBgRAgAJBQJJ
+zoD1AhsMAAoJEC4gEPin/0pBVNMAoLT0LzbZNVmium/JNdBhDhufgi7JAJ9s7DMy
+snT2e4S6/VitgWdoI9iCfA==
+=sgte
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2E2010F8A7FF4A41
+sub    E4D15F24364C7906
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEnOgPURBADYutfvXAtNgf67BQ2gWTI6+nKfILIwMPzCbQPMd7pykzF5nPMu
+Nswt3E7efo5IP1Zsv6DRrLafAW0OJSmL/oo8/ta0AfqcxCCbJ6CUyViifRZ5T4nU
+WfuWTZiaKRQ57jtt0WnNpFNFf00gDbYJWs5b4RU5Vac/0B0WDQ0wvOJfBwCgylAw
+LrDQmwyOZcws9VbpvZvz9pMEAMRkV6DN8kvmfktpbUnHNuZJOps5botqKyffQVj/
+b2zh9mQ9yFpaSWESdFgpJNeBGtQJEDOz2G/q9ydTrYyCD8ILMKmsUlj/DAjaE7mU
+/NmSpHBUO97NJN/fdMgkkbkSlk4j64lGaVovQph9ehw3DsuSTF8IPvr/DXV9nuIc
+duxTBACUE6vsxZlzB9dXe5HjKCoPGr90kUm8uCG/CVu6fBVpZZa9B6+OM6NhEkLG
+FA/EKgKc/tvNIlPsRwX1R2RoV9/tR9N772ZjhLcEBKV2UO9mb5iAWWZaMJtQ06SI
+Ws9fyd+Zx3GGY1+iwWPUxZ2lSGLlfg3Sunl7Cni86tb0fTHTrrkCDQRJzoD1EAgA
+lYw+EWr/t9pNqJhzVpAZ9u3LMKJfrGopbO+jOW0T58mIdVF4oMF5WZ4lHPTgHrRL
+KxXNcGlzaxjxBKtkUbnjRTSGk7ExzGIcWoqq65RI8JgONif1VpBaS4Y8WwX/akQB
+nCAL+eV7UwHttVUKEmt4xUW5CNa4BgCFKtVdiomvdxnBHBCgfWNHXpNnQLWhuOGJ
+ZVyqq1ZAh0/vIxUBDSJZPxmEh5235+2CDK8Zu4FCcsi409zrLTtga+ggsN4tp22x
+vRgNs6nwARsk4paFII3OMkdMVJlGqU0oQ+H5I5PADBFSUYwpcIYne/+k19+QMR1x
+Ik+7EavzdOribLC/nwaLFwADBQf+INE8jnD6qg3g1gRN3S9MNh+PAPEsrM/7Gw0N
+CAhaf3METVwSzZfwVNiXM8DVEGjaBAPTBpuJdveHpTG43E4eibjXWTe7j5A5QSUx
+O7p3W4AXNTKldFnlKkVs+6ZKCkKeasY2/7do6Cf2Ed6lL1CDXEYcZRZ6BbkXruI/
+HqT/IP2mTw1i53S5Gxj3gaG/jOroXN5cBZnRoaPJQpuri9hdUJVqPNIDhe8dz3Zx
+kHEgVPMoanp8xti86ErSjgvsxGs6xjjuxC9CNjMjyod7d6E1NSt7gvVdksX3vok3
+QvIqQKDO6l777R9LQcxEStPz91mrBRTAyO6b7AtCk4/5S2hTdYhJBBgRAgAJBQJJ
+zoD1AhsMAAoJEC4gEPin/0pBVNMAoLT0LzbZNVmium/JNdBhDhufgi7JAJ9s7DMy
+snT2e4S6/VitgWdoI9iCfA==
+=sgte
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6425559C47CC79C4
+uid    java_re <[email protected]>
+
+sub    D547B4A01F74AC1E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+WugIjrW6eRqMfhWIeF6otn/vBGbp44U=
+=+bu2
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+uid    EE4J Automated Build <[email protected]>
+
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ov8fTyW5CUsFo9wQlCvfBosOf7XRtyG9cg==
+=qap1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+uid    EE4J Automated Build <[email protected]>
+
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ov8fTyW5CUsFo9wQlCvfBosOf7XRtyG9cg==
+=qap1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+uid    EE4J Automated Build <[email protected]>
+
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ov8fTyW5CUsFo9wQlCvfBosOf7XRtyG9cg==
+=qap1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+/x9PJbkJSwWj3BCUK98Giw5/tdG3Ib1y
+=OVOn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+uid    EE4J Automated Build <[email protected]>
+
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ov8fTyW5CUsFo9wQlCvfBosOf7XRtyG9cg==
+=qap1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+/x9PJbkJSwWj3BCUK98Giw5/tdG3Ib1y
+=OVOn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0315BFB7970A144F
+uid    EE4J Automated Build <[email protected]>
+
+sub    7CD1B9BD808646B7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ov8fTyW5CUsFo9wQlCvfBosOf7XRtyG9cg==
+=qap1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D4DA5EAB3CD7E958
+uid    Jiaxiang Chen <[email protected]>
+
+sub    D826E3935EE9DC71
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=E4ez
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A7764F502A938C99
+sub    F20DB7FEF61CE1E8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFc7oMQBCADaIPEUzMrwF9gnEC+PRn2cSPG8OV4RxXxa88TZm0L7NF7D+F5N
+MNUAZ58oVqFUW+ytgb5iey3X7KjlJXZnuqES4m2Id4N7FlnvrmpeOg7MUc9VmNkt
+E7RH0O5GAo3V3o/Xp5nATUoaQ7v1WaPloB78ucyWLnH/iANw8YuxYuYUTJ0f2b15
+1oY1feqkpibbbO39kdMY36FH5h8Gsv0vvGdeS2O1p9vbzDHXEMLkNyKfcILLjbNU
+O/n2FzDL1y7hHXcFKDl6z2G7rKJCAsASH+r51YX3dOKUepE3pFcUbMAXGeG//n4B
+T8cv9YOhsYGaXBdbOMjy1WsZMvizbp0p6yIhABEBAAG5AQ0EVzugxAEIAMxtJLP4
+EGHrf/bnRuJHkyMqd/LEIMR4KszUl1AU5oeCxah7ZsK2MjwAUDD2UeLAIyANmKq+
+vXtma2wvQeOzo0QDMnxLqADSQ4xqUUcgbn71rjMq2O/T06BI9Lr2BaXeuYYjifA+
+loWzCbOHcgz78p8RRmxlChO5mWWlnrznDbUjV4Pih8M1LR/a2bUiU/Ftg14GPSrh
+ct9D3b5CjMIa4tqWMpvI+6jOjJm/ZD3Ux7WbzlHB+B9/yTw7n3pLSMXj/07PJKrp
+tUeJONprdN7V3wg1fnVS8CuQmLKoJhU1kLnucgnCFQMaHThhjxdaBMr6Mlq3urT2
+BSw970AB1qV4Wg8AEQEAAYkBHwQYAQIACQUCVzugxAIbDAAKCRCndk9QKpOMmUjO
+B/9ByOS3hX9yJysA/IDbFWonYmlo7p2hQbR1tiQ03QpbXZXCPxkSknW2uHqFLxd5
+eFkR46ExXINqFzMO6V7+o+soj7jUOK2rxQUIvdf423rhjdOU+TGXSDVKfNhBc/P+
+z0xQX7TkOuNwrcztgsmoSI/5K0rbF6+Yx3Thz29ZNFPTTkdFGiq6GfDOwBOp0VOv
+NyHw7mO4x4/5gdPKJ7zsMTT1OgBY+UQ9msb/ae47HvAEIgFg65OAamU+cWe471PQ
+uo8MEmeRKCsJuZlYjHcwqvqcVOcHJ9XzjuiCPn4N7aNkSTvoOcGvBWaAmBTxWVRM
+hvtJrydlnWJlCJiPfZvTePUR
+=IsAk
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A7764F502A938C99
+sub    F20DB7FEF61CE1E8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFc7oMQBCADaIPEUzMrwF9gnEC+PRn2cSPG8OV4RxXxa88TZm0L7NF7D+F5N
+MNUAZ58oVqFUW+ytgb5iey3X7KjlJXZnuqES4m2Id4N7FlnvrmpeOg7MUc9VmNkt
+E7RH0O5GAo3V3o/Xp5nATUoaQ7v1WaPloB78ucyWLnH/iANw8YuxYuYUTJ0f2b15
+1oY1feqkpibbbO39kdMY36FH5h8Gsv0vvGdeS2O1p9vbzDHXEMLkNyKfcILLjbNU
+O/n2FzDL1y7hHXcFKDl6z2G7rKJCAsASH+r51YX3dOKUepE3pFcUbMAXGeG//n4B
+T8cv9YOhsYGaXBdbOMjy1WsZMvizbp0p6yIhABEBAAG5AQ0EVzugxAEIAMxtJLP4
+EGHrf/bnRuJHkyMqd/LEIMR4KszUl1AU5oeCxah7ZsK2MjwAUDD2UeLAIyANmKq+
+vXtma2wvQeOzo0QDMnxLqADSQ4xqUUcgbn71rjMq2O/T06BI9Lr2BaXeuYYjifA+
+loWzCbOHcgz78p8RRmxlChO5mWWlnrznDbUjV4Pih8M1LR/a2bUiU/Ftg14GPSrh
+ct9D3b5CjMIa4tqWMpvI+6jOjJm/ZD3Ux7WbzlHB+B9/yTw7n3pLSMXj/07PJKrp
+tUeJONprdN7V3wg1fnVS8CuQmLKoJhU1kLnucgnCFQMaHThhjxdaBMr6Mlq3urT2
+BSw970AB1qV4Wg8AEQEAAYkBHwQYAQIACQUCVzugxAIbDAAKCRCndk9QKpOMmUjO
+B/9ByOS3hX9yJysA/IDbFWonYmlo7p2hQbR1tiQ03QpbXZXCPxkSknW2uHqFLxd5
+eFkR46ExXINqFzMO6V7+o+soj7jUOK2rxQUIvdf423rhjdOU+TGXSDVKfNhBc/P+
+z0xQX7TkOuNwrcztgsmoSI/5K0rbF6+Yx3Thz29ZNFPTTkdFGiq6GfDOwBOp0VOv
+NyHw7mO4x4/5gdPKJ7zsMTT1OgBY+UQ9msb/ae47HvAEIgFg65OAamU+cWe471PQ
+uo8MEmeRKCsJuZlYjHcwqvqcVOcHJ9XzjuiCPn4N7aNkSTvoOcGvBWaAmBTxWVRM
+hvtJrydlnWJlCJiPfZvTePUR
+=IsAk
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    4896F7312A5ACE4D
+uid    Chengyuan Zhang <[email protected]>
+
+sub    3EA98BD451E4B457
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF36fYEBCADU+1b8TH2AhJuJXebg5D3UbR9rk8/9kEfiF7ifbb3nCB9tnF5M
+7NnNocEdAq3XezNuSj9LtEpWUu6P4JdpXcfZiQO6wrobzSJRUWDc7X8D8NyhGpd8
+/7EMbAHH8MfMrwb1+00wdCeDXRpDtH8e+9I/mvdkkBgCrJwG2IG5FMSdQkMa44cs
+asquM705q5349n38F6zOFbS2CHtRw+dsGym1xHWX96E/kuAMIh0rlAK1vIh5hlmD
+2d1VQyx1IDQuAMR7YvByzpXvhwGm8neMaPgKvi3EHoySE8goFfo3UUotZBBv8h59
+h56lu4YfV0EOT3rUESOes2bZiRdLrnFPw9ebABEBAAG0K0NoZW5neXVhbiBaaGFu
+ZyA8Y2hlbmd5dWFuemhhbmdAZ29vZ2xlLmNvbT6JAU4EEwEIADgWIQTIiLmVWBXq
+g7SFMXhIlvcxKlrOTQUCXfp9gQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
+CRBIlvcxKlrOTZYeB/9Gb0MmFCMawEHvB5RbLvkQggZ3a5Ac7WCA4qy4p6B2r/2N
+7S4soaAB0iU3iutF1KzR4EaZod7C/DOJgjY7ZJ/ufoU+3KyzdoEr7b9QZktD8hUm
+vPS/hygpU6eY5gfyelFPtJU4+gTNAvls0/9oTq158OVgh6Kd3lmGpktLe/OFcXKE
+nRZC2+Vv7AJx/PboNko7uYpMml1cHDfi6cqRQv2L7DKvCGXnDseLi2tqfzWW6lYI
+XFJHmzWVk28SjUUFygfPN49kEkzSkQ94I0veC9Jxb8YqPkGD9r1gU2x6O8+4NsVC
+Iv2GnefwoRjDMgVvh4GzRhfGKuWM1+7OvjoC9QpnuQENBF36fYEBCADB55Q7spxH
+PFABiTlWY7iWlZ6KIJYdRm+yZGrWALYq05bL+UGfO1quXeSPoZapkNOp92RP3FSn
+xJ3S2GFXlv8AqjEuB3rUcWq+0g0f/cPq/MOYBPT9RgzYU+2BSmtnOoO9jEmsDBPA
+A8g11TIb/YglHmekEw7O3t76iebol3QYExHZ06IihKbH7kMQlgOGeWIPR1niJbvb
+E+VfFRhNzl2xjIMEcg8cu3nCK7xz4SwPXJTZJQjjJrUoenl6WFtSLVzzL9KQO0vH
+yzRv9cEUUU8npWz0NvNMA6weXYVGS9ZbjaAMgZ04PAMpEuiiYmsENFpP4F3S/yc6
+8o0dFeE3ZqUPABEBAAGJATYEGAEIACAWIQTIiLmVWBXqg7SFMXhIlvcxKlrOTQUC
+Xfp9gQIbDAAKCRBIlvcxKlrOTVN0CADGnC+XyF5FORZClBFtjzDI5WyRhqK0eBv5
+YDfCiBnH+vCrpRzks6ylsoHeuRkLBMyyN/GDyi3vLa/4zb65ekZzsDWROR5zzpiB
+hI5sKBekS3XLEd81cYb8mDVFqn4cgrATUeGz0UpHY0wm5bVel3FGpwY9NpZKHfhQ
+9UATNm4OJcJywPNNCPMjFUyj/XrXwqJDDsPafVewJ2qOziflSXt75TEos6xmi0YB
+zeYL7RbX07QsknYF+31TjsqbAgZsxgRKeexe7DsSL97BvSaUyB8X7Ghxw2UwE+9O
+w5dkCGlkxSnKE7WTKi1is1iziB4eYHLMW1BKVazIeudpCfyKmmhz
+=Zhff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    94B291AEF984A085
+uid    ReactiveX Admin <[email protected]>
+
+sub    9D149DAC4AC24632
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFPzzfABCADK/wEIRhUCUTj00TcBOxGTPs5ad8jn5D01P7P5ILpLOgmnUp1I
+E3EYy54PQYjDIeOFvEmEywvwMRV8yCVhhYGpOPqbegKwcebXoiMGhJjuRf2nPbdZ
+PSB+S3/WAsdydiPiz/2Xl6hhlaKIQSnSOgYPOQjbDjgfU7B0vYGPohYR50fbOd9D
+QLvwsYxQv7CCdMM1M+tx4HevvYOKrceAwTe6yRx9PEhmuXYRCes/AKOs7yODvNm5
+SFFlZzBrYMxh6LSmCAGfYrSGWJliJUuFMQ9U0R304nmVUo3rrCj3tD25Kdr7wj+z
+WjtJVBdWVFTq2/Zh0QnF7mbIOs4bYxLlKe+HABEBAAG0MVJlYWN0aXZlWCBBZG1p
+biA8cmVhY3RpdmV4LWFkbWluQGdvb2dsZWdyb3VwLmNvbT6JAT0EEwEKACcFAlPz
+zfACGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQlLKRrvmEoIWN
+gQf9ElK2o7JBUbQ/QgpPbaKlP7+Lgc78g2I20Insd51G7C6SFmnMj+Ae/EariCV5
+R8JObne8kfY2EpmME8ISUqPrFSw0hhR0q7E7jhZgHrY4s0w7R1mujjWYJQ5cSi0q
+2sQP1GDMIk6paJBFORedqQ25B0paWGGATyMLRu2ljz5tog3DVaE/yvaQWAgiH77i
+It24fY9waInC7F+ruYSiL9YwGaDi5VwV8mlVeNZ+yobjXllzsh29UW24UXjWJoEz
+1MH2IXC+v247wnr5s0x4GiBaYFIS7sg2WdPMImAY9tGwfKQRNs2kBAT4G2Y9cDx7
+Oe6eZTFP+VYBhioN+5GzDPMwwbkBDQRT883wAQgAqj9m/clM4PMTIRwRkDbrfFSA
+TZznMxgUe+jOGRbZgemEd0Lpa2Dgrhq1hd8jOQgm+suCKjhJi15oKHMYHRx435cE
+8gvdW/C8R+T8Iwd+Ce5IuaRKBisgcIpCcSBbaDgYqGsjhOT8W5N/Tgqobera2Wvm
+wDGnadIN82RQkvH9Sypj2eFyLuFUk1xIKCS25a62EYr1Pb2/mNwHvgEjkswWeoWR
+a8A6xQevvrcercj/a4dYB8m/RQQhdapo4J3gh/BQxJIHAvjVxxWyLfyOIdnV2tkG
+Cysl154R0ymVHIT/fXILnkUPJNeAQzITMIjbV6GAUklVr1sjtcDqXPHAl49DBQAR
+AQABiQElBBgBCgAPBQJT883wAhsMBQkHhh+AAAoJEJSyka75hKCFz30H/A4I9FC5
+kU5ipCv4iqc77egCekoG8hhm0DtVdWrKOgJwbayIRsyCB+hISnZpt69QyZi5iA2k
+rIPZx0Sq1Nrlw2lPlv87CbreDy57vdtMdFEFQHW0zRbFN+XKZ0noFQGYxG/1LyPR
+4AOg+ykBEX09gnWYHwUO6x7Q73OQs88y5JOurF6A4iQmH7na9Qz2A0YPWNKQ+tmF
+MEciypk7/YABFZrg+9Edz/TWyN81EERhJPDkxzHkYLm8fLpOhnQPOyDxuzt7fh7y
+hy/+b3B9QT4Cv1yH73DYIfJW3jtuQDdmvtTk6G7BdEzAWufGVt6EiY10pr4zyfpd
+eaSSyYoO8iMWJxQ=
+=e7Sd
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    8671A8DF71296252
+uid    Jesse Wilson <[email protected]>
+
+sub    51F5B36C761AA122
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=nFNX
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    10AE8966A146E8BE
+uid    Thai Duong <[email protected]>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBFrY3D4BDADSiDX16IC+236IeUiqi7Nbt2wlsBS0zqqaXi43QwXwcf7aYn4+
+qrn+4JvsyMrDgkRgOElz134B1i5OSzP/32w2JCnj90XUjO5N1KD0QqoSops7NLhZ
+/jW+5cFLDDeYPTYNLxJVsDRSqhIztRC0/m3eP0590MbnPxd+ahlj8uz4NRv/bwj1
+vqfIRDyoQOtV0+QX4M8ytX8cyLW9YynWLWMeHUFY344UztDunZrfomPC16roKXrq
+niP71cILlVFvhGhLfE4iF+Q/QZZnn6hvuQGagHR261N4LKw5II737g/5f1DsKZpu
+Mjam5juYCWobRie4fN4k0xwi2+I0KTpYMjBRTNNcOtyAb1AvY08E0HVwAYz8Cm+T
+VQQKriNpa40RI3KtDXCboCkz+LLL1w6vBXnvCes6F8CjSn3IlInpv2AE4nhcPC03
+zI56gPFHhUN+h4vm+b5H0aw8DyyedBDv/GX5sPxYYml3H12L/idpgAwp022rL8dP
+lxtvZrtO9PlOqHMAEQEAAbQeVGhhaSBEdW9uZyA8dGhhaWRuQGdvb2dsZS5jb20+
+iQHUBBMBCgA+FiEEyHQQgv8bDulryr7sEK6JZqFG6L4FAlrY3D4CGwMFCQlmAYAF
+CwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQEK6JZqFG6L5LEAv8CDTDJbAl/Rh3
+ALICi3dsXasWNQjMnG2kqDXQg/ysTPCoUphnYBTvwkEGxg+m6Bjb3ULeCJo+DIfw
+JxgLl5BNZOROeBmlX5uYZ37XYPntl/WwyGBnCF1IW6cHmdtTMwfYd6RkAFYVyFyZ
+FObeCrzdVj2knwqsZQb2Ty6BNodKV+xLCYBggT6VjNpjp1wOedn5ByQEReG9HDim
+qmVWz4pqAe5ipo9mTEwkQzZny6Mw5QHp+SRk+Yyo/NT8Q0BkGPwFpYn9YYUvda1k
+mYN41DwJBzG3m/kfwn3tmIbxCOnrmTt9x6cGuejPPsOI1VjhaJn8HMK7WOOA8DRh
+Zyi/IkZ04pdNlz6PeC7CbzvgGMgrY5Z9mIHP67GlXomOtoE2ZsUyNUBEA2QCBroC
+ktzkT6Y6IIYUe+EdQ8LdMJ+uisbPl72jmkPmnj0ssZfKkTZRTMF5mpR8a/AlRQwL
+VG5qGWHCQvsYUT/C4fNqaZKjwn53SUp6QDhrpMrv1UWhdLSWS+FI
+=YPkN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C7CA19B7B620D787
+uid    Stephen Connolly <[email protected]>
+
+sub    7679164AA2590985
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=H7JA
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C7CA19B7B620D787
+uid    Stephen Connolly <[email protected]>
+
+sub    7679164AA2590985
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=H7JA
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C1B12A5D99C0729D
+uid    Valentin Fondaratov <[email protected]>
+
+sub    606CC6C4533E81A2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Pyox
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C1B12A5D99C0729D
+uid    Valentin Fondaratov <[email protected]>
+
+sub    606CC6C4533E81A2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Pyox
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C51E6CBC7FF46F0B
+sub    4006CBA6D352F1FC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFbgSbABCADGGENSy3oWLjW7zfYMSsR0pm3l3eMA7ptyU5C0U/MoIYjbXwyX
+XtlGwKnNgngATh1SMpX4WDbD8tn6vdeP4uHQsDb40t0XN7/HISFcLhV5pCgz2wNR
+t1dZbreV/EaZn3f84Vnm9s6TU7RHuPP9qBne1YLbB+LKKZUfQGavqGR+n322DhrR
+NqLdC3zFNtSmCVXS6GZ17IV/B+6CiNdbmPVk0o7zZexqZCNMXxv1IFzHV1/Y8Htu
+WQBfZ0zWwrX85ZKysU7UDdoyUw2aa8/+YpZmKwo32N8GpqA6azBeUjjVXGuqktMy
+l6IcHbLlgymkkjK7TyAKltuhvp6AlBTzp9i/ABEBAAG5AQ0EVuBJsAEIALE90/PK
+unEOu2B+QGGV9e0jJMlW+rs3BV6NI9ZaRw0Uvy0xN+jqhMsyCzB8P1joTZKUsmK9
+ptaPlMuKrTaQ/0GYPi6cP5EamphyvjK8ljLhhQuiAxt7zwv78vX7CGqRUEcAszsK
+8FPBAXERsSit661rjp4Ai71cyQg8YOXDjhissHWmneF8TJ3yItocj4KxDKLxoY+h
+F64epbkjIkpfrZ34iX8zdZMRCNJlh+oTHe/xulYLQDbgkgQa+Y6gnKmUZi0QGU01
+k6eWw/U3yOC69++ehiYcZYS0dWpPE/H51Rizn7QipFeFfTsia9jkGjzMyKHGju66
+URQ8okd4E6ev3N8AEQEAAYkBHwQYAQIACQUCVuBJsAIbDAAKCRDFHmy8f/RvC1c0
+CACy49b4H6ZzY71Ao9JHRRpQZ2VSVk+6xPblr1DOoytDC/zhVKekerE7OBEul0UO
+qzUyLNwkDiHy+5PRi6ZquZr85PlaVV5j6DkuZ/0lcL3ofsvtQi1Dwd1q/9RzedSU
+jjY3OimPWDkDBIGyBXohxx1BxRIAvlRnk9agapfbAdwtv6cjYxW0TDcPx4XW839n
+MN3CMEWtlI1GhKGYi5nsUw73ctpSq9dm3ov85ykFOqB/juvTcPoiOwPE+6o0OCTZ
+o60VwPUfv7uoXtkrLVJ0B06mfKiUgZvaqppYDi9IrhcHarOz8MD2OrUS3z4riTsL
+VEPwY+Xd06QyemMynHqpcDpm
+=1WLL
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    56028DF552BA32E2
+sub    7EC19439E4D4C2A0
+sub    D89D05374952262B
+sub    B5681E477AD61C38
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+5KzrCgVUcXxeOohqkl0SRuYxdQ==
+=UvWw
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+k2jL7nGs2D66/qmjgmO2J1/D
+=ugSE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+k2jL7nGs2D66/qmjgmO2J1/D
+=ugSE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+k2jL7nGs2D66/qmjgmO2J1/D
+=ugSE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+k2jL7nGs2D66/qmjgmO2J1/D
+=ugSE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+uid    Brian E Fox (CODE SIGNING KEY) <[email protected]>
+
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+hfxMZo//jMG5FUu/pIWz5aHxQUjBv7phbwxwKvQAB7q4eYIPG6ZabYTQJDIweq3S
+q0XJaY1DxbHet+O4PKHUu+p0fjLabGTwENN8fnzI1adO6mKDrn3LcdZmPj9m1KkK
+2hslY7P8q5jz1AjAsVlSMWQoLwqfwj4ZqPnvUDeR1YivXnFf5jYkmX5rrzOHuSpk
+i5K7fKT30hwLE8Ew1Fn7LftldGWIi7U/T+IUlCDUgF6CxBKMjXCDtAic2dYo62aY
+WimcJC2KNWsj41+Iq+auUBdbIB4uHkROm0/V08OhQNSrHx7piQQcBBABCAAGBQJK
+/hroAAoJEIqviNbYTkGuiecf/0ZxYsoCsaUtkmLHhIeaB+VSgsGQRzQJExLyUi58
+i8c91+FXYykabOCzsQlIN3hhqDI0s7rQUJQTGoFWgwdVWRWpAhklidEFGx4wS9wN
+9twIiY+xgdwQkQ4/hf//////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////+JAn4EEAECAGgFAksM
+3mcgHFNhbmRlciBUZW1tZSA8c2FuZGVyQHRlbW1lLm5ldD4iHFNhbmRlciBUZW1t
+ZSA8c2N0ZW1tZUBhcGFjaGUub3JnPh0cU2FuZGVyIFRlbW1lIDxzYW5kZXJAbWUu
+Y29tPgAKCRCbuGOw9Ru4ikI8D/9vWt/TfpmUErEq+Md9F0MZqJ2H+y/nJJMviUDH
+Hx+po2etYJauhw5Ota6brkLjef1cNRWQ4tDxctQRPc8SsU05/Epzrdov5SWVutcw
+vmAjWSUs2wKp7/+lPuFUvEd7g4xt8gXY+mmvo8qi8tTNE+nfzaU7I0MHIMbN25P2
+b6//+Po1ifLVFE+S9fq6NbXI0QvuVBKCCmzVvA4VTVNaCd2CQCrZA+6c5VuFJBZK
+VoCW2FThDvXyQYlQAZmE3zYAZDjNFU+jAYF6aqY0dtU6wh+U1c1qbpLhrdn073pT
+HsfNsQW1vyzYLLr7QxkU9pVpFJ5Ajq41NwyU6xxSZhnJN+7TOYcJ17EnDKmdO7Mb
+52nn0zvxG2bactz+ycWwZrIxfQo9RAxyor9shORfPmEoVbsLOdfuoJxvb3OL8mI7
+wcTTfsSoPeqac2p7NS5ZWaDenliNrVR5ZWJFQeeoll/paBampGjK5En/QpIEoct4
+p3KnVTusFSsZdRnNkOFCKPUusbiQPl7dga17oiIqhpsLewq7BnQ9oW8h5jO0TuJ7
+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
+y+5xrNg+uv6po4Jjtidfww==
+=uA5H
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+uid    Brian E Fox (CODE SIGNING KEY) <[email protected]>
+
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+hfxMZo//jMG5FUu/pIWz5aHxQUjBv7phbwxwKvQAB7q4eYIPG6ZabYTQJDIweq3S
+q0XJaY1DxbHet+O4PKHUu+p0fjLabGTwENN8fnzI1adO6mKDrn3LcdZmPj9m1KkK
+2hslY7P8q5jz1AjAsVlSMWQoLwqfwj4ZqPnvUDeR1YivXnFf5jYkmX5rrzOHuSpk
+i5K7fKT30hwLE8Ew1Fn7LftldGWIi7U/T+IUlCDUgF6CxBKMjXCDtAic2dYo62aY
+WimcJC2KNWsj41+Iq+auUBdbIB4uHkROm0/V08OhQNSrHx7piQQcBBABCAAGBQJK
+/hroAAoJEIqviNbYTkGuiecf/0ZxYsoCsaUtkmLHhIeaB+VSgsGQRzQJExLyUi58
+i8c91+FXYykabOCzsQlIN3hhqDI0s7rQUJQTGoFWgwdVWRWpAhklidEFGx4wS9wN
+9twIiY+xgdwQkQ4/hf//////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////+JAn4EEAECAGgFAksM
+3mcgHFNhbmRlciBUZW1tZSA8c2FuZGVyQHRlbW1lLm5ldD4iHFNhbmRlciBUZW1t
+ZSA8c2N0ZW1tZUBhcGFjaGUub3JnPh0cU2FuZGVyIFRlbW1lIDxzYW5kZXJAbWUu
+Y29tPgAKCRCbuGOw9Ru4ikI8D/9vWt/TfpmUErEq+Md9F0MZqJ2H+y/nJJMviUDH
+Hx+po2etYJauhw5Ota6brkLjef1cNRWQ4tDxctQRPc8SsU05/Epzrdov5SWVutcw
+vmAjWSUs2wKp7/+lPuFUvEd7g4xt8gXY+mmvo8qi8tTNE+nfzaU7I0MHIMbN25P2
+b6//+Po1ifLVFE+S9fq6NbXI0QvuVBKCCmzVvA4VTVNaCd2CQCrZA+6c5VuFJBZK
+VoCW2FThDvXyQYlQAZmE3zYAZDjNFU+jAYF6aqY0dtU6wh+U1c1qbpLhrdn073pT
+HsfNsQW1vyzYLLr7QxkU9pVpFJ5Ajq41NwyU6xxSZhnJN+7TOYcJ17EnDKmdO7Mb
+52nn0zvxG2bactz+ycWwZrIxfQo9RAxyor9shORfPmEoVbsLOdfuoJxvb3OL8mI7
+wcTTfsSoPeqac2p7NS5ZWaDenliNrVR5ZWJFQeeoll/paBampGjK5En/QpIEoct4
+p3KnVTusFSsZdRnNkOFCKPUusbiQPl7dga17oiIqhpsLewq7BnQ9oW8h5jO0TuJ7
+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
+y+5xrNg+uv6po4Jjtidfww==
+=uA5H
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+sub    AD9CEBA0521B1945
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBEry8yoBEADnhvT3m/zzzuiUKyAeIfnN9CeN0ilQx4P0kFMhyZchRR4Ekb41
+iKw7tDL9q+g7xSo3yUT9dKjDWJ3yhDpdAhp6d4y8GAuWqlOu8CQdEHJOKK0yxTzX
+NMhSiskfUesM16q82/xHH3rUV92b0lxkJ0D/V5ldmYTaOwW2KRtQ7U/WP0cftdw8
+dJuy4ja/ASLn+WcsA32k3uA1X9qUCNGtJHQIZpcHi961rSb+fktiqjXloAX4TQfj
+Ys5TkOEykp5xSCK5aIf9ktTM67fS+oJkxw1Exzqm8dK2FT5xdQxtGEyMhwrj7RSY
+OUsP/LbgyKPviA4uAYGrtIKSpb9KX/j8eoS62MKxAP1Gw+rZpBYY6VuCOmLVOkJY
+yJHrM8O9Yd16eotBmbflx3f/X+/zGeEWno/GwQg+rX0NNmEWZF+TUZiIlO0n9dOS
+Ni8umYYRdVau7fsChwjRUPaRdwPGHQZaFBYsCPHAfn8Dnd3JPUWkevxui9pZ8Wgg
+1oFx1pBf2bu9NJgsWzn1idaXrxfyKTCuQFqazhBrhH9ecIwgzC3bLW8KBd5seG5l
+3k6FNSjk+54Z7sUU1ucxUUS9zK6dAw8+Sb3KVR8n4P3VEyBNKbb/U1fcXWhvm8sD
+0sQOruqx9h/g/d/V6iibZNu5fkmET/Q5X2qDFk9tRYUg4zeG0652KgTQnQARAQAB
+uQINBEry8yoBEADRoV4ShpX4gh2LJSLxiW2cjJsxD4LosDPUUcstgwDcYfrtfXb5
++avDbBYDi/5lIst82WPXTuAkWi+W1prht80ydNmpbC3wsztoW2xYJPF6GO9HpVW0
+n7tTVWuQWSgHZm77cIoOfAoz9FZDphxoE6Rp/ytSzOj2rXhBTJ7B2LAI2ddMyrND
+X4lBRMQnuuGiaTxe8CXEGYICBPSjP4q11cBdzCKSlRFsz2/4cFVotJhBzm0oyROZ
+po3/IBF/Gz8FckWM0Ud5fKxRuED9OL0vU7aRdQsUkcwbF9CsDkvHuxxRJkErD24C
+vh8ywsE4NskjxJ8L4Fi0CjXq4IN7xUcHnbuM2zvlLv7aaBVZ5FE7il6qMtowLide
+PzrihTUAmqeF4IOiutJZlSwoEDBnoGgh7iNY6kvUFp/FbCGl7cMt8JPjG41m9Tdq
+qfcLl1JC4pYpzg7Li6i68mCubRPiGCEVdAWVhv4jAd23vNutBLwPymQ4EUBiforO
+aPoM3zGvlea8p0MoIms2ir2rOz7R7Ai7aJHf7j8RBbb7KK93F+8dTYG1CDW2KTQm
+kro0CSxkMC+BxzcP5KjrWQxgmNEz+MUv2dCfU9gARC4/SGXIpFuzjyzztsciRVKb
+0G5QF2DuJ+LM7RnzBU15DmxUMil348F4Ovf6+nKlSHdneCt5Z4thK948awARAQAB
+iQIfBBgBAgAJBQJK8vMqAhsMAAoJECBchnPcdCx8F7QP/jbAh/IHe0mpZ4YYCXPy
+KOai/u3yEk12kS06195suhHsUdvSgxPTRB9DXkXaLXcRtXPHTDY0ww7vhLumvrmo
+bBrkBbOcBbXKoKyPPIibVUVGzxkIDtK7pUUKtkkxNoWecPCFv6w9APVFIz9AbQVS
+mIewT8bJG9k2CUYSnb/xjGEnB1poYlsE82uhfLpwe0k0k5vYE54wnmt7Ko+r968D
+smdIE63J+CxkPs/RZ0RHi57LamxC7BBnOvHWCtzQabDNuYluyde0zSO66VvkS/Qj
+DZerkq+1/1+E3as3557K4FplEriYUtq42UIpgrUsibLu9lTP13GdC2L/pylK4Nsm
+TsgnrupjZkeSM9huNi15xdF2iFOwU0A1Tx2/zrdWLyrqlEBob+Bd9wJGqvY2E1Hk
+Q9Dfcmx5OQFDAZTLOKUagVTULVhWZy/phLkuLhzP8IKjiDjvELDG/fNK3rKJJYlj
+KkxPdL5WNpkmi52cdPGhF3IwQ0oN9uaLlte97QfPbuxgAtCl+GNG4DGHTKdQXIl/
+tSFvWgVNCQRoCa+jsKw5rhgH6Aj+5quFzy/yXPFto8mb+oQ1Qsh0tjDr06uII2Ix
+n18TSwpN1BRPd6UpvoZhC03iQwAtw/M66LYoTWvwk1xyeC8G+m/FMyNqDziAypBC
+k2jL7nGs2D66/qmjgmO2J1/D
+=ugSE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2F566D4221D3EC52
+uid    Ryan Harter <[email protected]>
+
+sub    C4725C965E0455E9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFPSiQsBCADcgBiaKkIG5jVFbQ0NyG//y18S84/OT1X1I82OwtTryxNqxT9A
+q6HuTJqRPi5Qd0BwmQB6dG0mug9AEp58L8W5udiDysHeUvBKY6zTOprSSFvFg/Y8
+S7i9D3pM6k7L7lGahUQqVAAU4RSky90nJfcT3qTNpmsO24EelMf61XvdFHdyPAjS
+aAO9W+QWquxNqXd0FVQqpHKRB43oR64oeAAE/N/H4lvemuxK6aWEq0/KJo0KYHkt
+H60Jo+djdNhHD/EQwCp9m8pKd3FuAAI9/ypvE/a8LeH/8AcLqnrPq63vxVe678nZ
+yePb1Xl7zQUsMw/ZD4urlkcTrOLl9yfIg7wBABEBAAG0I1J5YW4gSGFydGVyIDxy
+eWFuamhhcnRlckBnbWFpbC5jb20+iQE4BBMBAgAiBQJT0okLAhsDBgsJCAcDAgYV
+CAIJCgsEFgIDAQIeAQIXgAAKCRAvVm1CIdPsUvShB/48Ai4yB2nlxy05CwbuX1ka
+E39VL2sb2Bd6ZVtmkWerIaA16MFj+/o12JlJ9R1S7BsrvZor/oa9ejCyJLUOHW5s
+vRD5BkAJC8IRpk88szJNeVwh9gRgd/lWv8IEKMaMFIx1I96NDKo2bjw+rdF6Qo1Y
+C9yC1qsj8vg9+szMvfAoDCN4KDa9rk5/k7a6q390QpaXm7KY0TbqTkUr8Y+NMY+R
+yEap/qk8EzaauKQyHvxOBj9m8bkv2QlxID9Cyjd1ZyJ9hWuyQy8UWLPy6pVXKPaC
+CVlf+Uoj/qbzoVrElZDqGok5GQfKjNFzOkHuKEgXdYEuX7JWJgDO2i4pAr5isfST
+uQENBFPSiQsBCADt3ycVnpTw4NeU+q1rt6+aBrOQfcdRrTAxAwhilKEo+jD1kufJ
+LfcDooqEYZ6l4B9Sw91/zECNmIyqRiMlMTDtZOniuv/fFgxKSzHIstVDjO6tlY1R
+DqjzQUSb5uHMTfToTDrLki9KJfHIHfHSgOvfa1l3FmX4vt9ro8X8f+wfZg8jHY2p
+aWW5RfhVprR2/A91nzgs5a3wdPQi9Bl6YRZKSJKNvgktsm18LMhwLqvuBpQ1ongT
+QdUVY9VLIkDc7Tn/V5x+2mWCAf7HrJg9UnZK0JoKjop4ZwR7MQ0DoBh2K1Hd6RFH
+rmKjpCmKA3TZVAe5C1Ntloby7un2FOL7zZfvABEBAAGJAR8EGAECAAkFAlPSiQsC
+GwwACgkQL1ZtQiHT7FL7Xwf+PM0DHB+7ENW+1HbkEXZRVF3hNHSWFWj1AySvSrUe
+Xm4z5I2Edq0zDdTQPmi/aEhYgXVzsOWXi+MinkNHXerzt6YHIfbeJJ6dX5IL7Xwq
+rsDRxpg/J7MoWL826FUXZ6CePBfGoEA1IjhkeSkyKvLm4aLv9vfC4MVuLHRbsx3n
+np4ZkMVvLBSnBSeBTLaINvhlp15NLyHweE1KhtAqVuiisWm86n9kqIXjfoj+DFuB
+kK9cE/YCU0sNFELYgmLVVoTjxxtY9mPsROt+KJxIDS9BQ8mjeifXbYwkHERnOTKx
+NzgwWngWLQBG5cIsQ4b80Hzl5AF5ApOcC5iu6Z5e2OWW+Q==
+=qdIG
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2F566D4221D3EC52
+uid    Ryan Harter <[email protected]>
+
+sub    C4725C965E0455E9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFPSiQsBCADcgBiaKkIG5jVFbQ0NyG//y18S84/OT1X1I82OwtTryxNqxT9A
+q6HuTJqRPi5Qd0BwmQB6dG0mug9AEp58L8W5udiDysHeUvBKY6zTOprSSFvFg/Y8
+S7i9D3pM6k7L7lGahUQqVAAU4RSky90nJfcT3qTNpmsO24EelMf61XvdFHdyPAjS
+aAO9W+QWquxNqXd0FVQqpHKRB43oR64oeAAE/N/H4lvemuxK6aWEq0/KJo0KYHkt
+H60Jo+djdNhHD/EQwCp9m8pKd3FuAAI9/ypvE/a8LeH/8AcLqnrPq63vxVe678nZ
+yePb1Xl7zQUsMw/ZD4urlkcTrOLl9yfIg7wBABEBAAG0I1J5YW4gSGFydGVyIDxy
+eWFuamhhcnRlckBnbWFpbC5jb20+iQE4BBMBAgAiBQJT0okLAhsDBgsJCAcDAgYV
+CAIJCgsEFgIDAQIeAQIXgAAKCRAvVm1CIdPsUvShB/48Ai4yB2nlxy05CwbuX1ka
+E39VL2sb2Bd6ZVtmkWerIaA16MFj+/o12JlJ9R1S7BsrvZor/oa9ejCyJLUOHW5s
+vRD5BkAJC8IRpk88szJNeVwh9gRgd/lWv8IEKMaMFIx1I96NDKo2bjw+rdF6Qo1Y
+C9yC1qsj8vg9+szMvfAoDCN4KDa9rk5/k7a6q390QpaXm7KY0TbqTkUr8Y+NMY+R
+yEap/qk8EzaauKQyHvxOBj9m8bkv2QlxID9Cyjd1ZyJ9hWuyQy8UWLPy6pVXKPaC
+CVlf+Uoj/qbzoVrElZDqGok5GQfKjNFzOkHuKEgXdYEuX7JWJgDO2i4pAr5isfST
+uQENBFPSiQsBCADt3ycVnpTw4NeU+q1rt6+aBrOQfcdRrTAxAwhilKEo+jD1kufJ
+LfcDooqEYZ6l4B9Sw91/zECNmIyqRiMlMTDtZOniuv/fFgxKSzHIstVDjO6tlY1R
+DqjzQUSb5uHMTfToTDrLki9KJfHIHfHSgOvfa1l3FmX4vt9ro8X8f+wfZg8jHY2p
+aWW5RfhVprR2/A91nzgs5a3wdPQi9Bl6YRZKSJKNvgktsm18LMhwLqvuBpQ1ongT
+QdUVY9VLIkDc7Tn/V5x+2mWCAf7HrJg9UnZK0JoKjop4ZwR7MQ0DoBh2K1Hd6RFH
+rmKjpCmKA3TZVAe5C1Ntloby7un2FOL7zZfvABEBAAGJAR8EGAECAAkFAlPSiQsC
+GwwACgkQL1ZtQiHT7FL7Xwf+PM0DHB+7ENW+1HbkEXZRVF3hNHSWFWj1AySvSrUe
+Xm4z5I2Edq0zDdTQPmi/aEhYgXVzsOWXi+MinkNHXerzt6YHIfbeJJ6dX5IL7Xwq
+rsDRxpg/J7MoWL826FUXZ6CePBfGoEA1IjhkeSkyKvLm4aLv9vfC4MVuLHRbsx3n
+np4ZkMVvLBSnBSeBTLaINvhlp15NLyHweE1KhtAqVuiisWm86n9kqIXjfoj+DFuB
+kK9cE/YCU0sNFELYgmLVVoTjxxtY9mPsROt+KJxIDS9BQ8mjeifXbYwkHERnOTKx
+NzgwWngWLQBG5cIsQ4b80Hzl5AF5ApOcC5iu6Z5e2OWW+Q==
+=qdIG
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7A01B0F236E5430F
+uid    Inderjeet Singh <[email protected]>
+
+sub    C3E640F38D845FA2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFZUsiQBCADGmoidvh3VvXWGdwbAtHPtDPKEebE/MfFVO+QTRbjJxphzKwAt
+mxHruikafaSTnC9FWizj99e/Yc45YZHcnt5Htmy0a7DSOQXL37rrnieZxg86tYmC
+4PxvvzC/s7xF8wmxDo4A+mRyoSF0NF/fQTZAr3ri5l0G/vntH7w8AbiiyerpLobW
+/TqQn1tpMh7XfZZ+XqQKANVRECUiCYT4iJKWMqcBpLZW8aa+iYW8yCQ1xfmNXjrx
+jpTqFCiQjvwCw4dDffNe/A1Dbq0wE6mw3YHW3OC1fnLiP+TEM9P9v02bZyem6uW2
++krrToLTTHSqIGF9wUUF6S3Ikrw2EtJiRQtnABEBAAG0K0luZGVyamVldCBTaW5n
+aCA8aW5kZXJAYWx1bW5pLnN0YW5mb3JkLmVkdT6JATgEEwECACIFAlZUsiQCGwMG
+CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHoBsPI25UMP6r8H/Rq70+JN+EyS
+6iK6ilytB1vY5GdwBzAxpsRUhTL1lXSqgjCXy/6sgrTQv/9/EgQznm7hEFVkwr5Z
+CacXeajvFJ3FVtjgn0aLRADp88Ry75DsttjwV5nIBNvFBJbydvJhfruHY8gzdUv9
+yOHAX4qtoNDFRn1HDbNsYMlRSXgjHX0JvBexdtZArtsd3aLOM4m8r+t1GFM6ePgj
+CD1q8yBH2RAIETAId/jiu07AqsJXp+UPBgJQi8o7cEtEE1HgkI+IoEsZXFJldRqF
+GJS6eKS8bpjX16nHI0SnR/gtsWpblAdZsY0YieK7o2pU8lvlCFffaUxXDOP7+BCq
+8W29nfaD6YS5AQ0EVlSyJAEIAL0+8UoJuUsC3jDE60tmrApu/hK+dCbe5UJnR8z9
+3aQ/1AfEX6So6JZzBlxID/HCOvRjJbauL6Lrvw2xgSnrnOzRLf1StvBPASfJk1Zd
+o9LZon6Xofzg34qCLUQLkDyntgXQaYF3Yw/xfiqqTC/yav29VTzKnf0Nri8aXGsH
+OycJ8nTO7I0p4xuRirFu7Bkvd7bK99/tDxttYkvUnG3BUGlr85UX4uODh3EcVcgV
+QteawYbmsf4F00IBoTAycutCOdbP2RAgP6kgFxLcGz4zVqu93QjSjEdTegF1SUXc
+GpzvDR8T8zRsQbBCZ32A/UJqmx+EIPPFHNkLijDp+f5mkJcAEQEAAYkBHwQYAQIA
+CQUCVlSyJAIbDAAKCRB6AbDyNuVDD2xjCACqL670xI/26dWsz66ZyHQ2yJI7DNQx
+oiU3OZs2bfrRZxLpGP9Q6YWCehb+iucvmFFvLZBoGGWzffmVBisD2Yz3mHtF3wLx
++2zJXHt1Xz7H6W89M54T3qUhQTTV6pl5f5/JCXK1DP9iC0y453ORY5B60byrGIUv
+BAv+qWXBPn3ECZ/3oEkErb5ZGof+gJjffqvWRAN3Li0WBRj0ldXpJoP/YE8naDJ7
+UdPfzcnh3tnOTfUDvFer1Nh00ilMmf6EYznRwaN9whc9W/1HwvDeXrijrc6/1U7H
+p1r5b1DddTtx6aHxpWrcwYw1yXGcm82fjXnRdomz6nBt2DF400YubAZR
+=2qwf
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C29B11246382A4D7
+uid    charleskorn's Travis CI builds <[email protected]>
+
+sub    97149CA7141687A7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+WLi/z9M5/VqJKMD6Dc6RCIwKYA==
+=SsPP
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C29B11246382A4D7
+uid    charleskorn's Travis CI builds <[email protected]>
+
+sub    97149CA7141687A7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+WLi/z9M5/VqJKMD6Dc6RCIwKYA==
+=SsPP
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    586654072EAD6677
+uid    Joel Orlina (Sonatype, Inc.) <[email protected]>
+
+sub    2E74CACB6918A897
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBE1VSkkRBACkCgvt26sMi+0X+EOJDMqdK0Sziy06k47LJf1jOg4tTZ2T9QtP
+OZ8fD+va/O5+q8Kna993jzcO5n0Nv+R/K3+MvUqSmdITshCIjBt3cC0n6FWndGyl
+jY7rOmzdNnvSkMGE3V2fQ18stkJRleqk3EuWwv+EwpxcYeVfCO+UCJGz5wCgtqnZ
+JYdRHcDkDYaIZ4eizpbV4d0D/3cgBdpcbSrwIGtft+lDxacaJrWpT5Jh5P0gLlYu
++6PFz8ZIC4+/aOSi4S4mgZxk8dBL8ZBqLqcW9rc//CYKNtPq33sdf9vxcusMIXvS
+PBODjDpoOsTJwy51fgCEL14qnp0v14y9p7ejjN5+GipiNY/JHo9S9kTdVhMYqt6x
+6a6MA/40vMejIbZ4q3Ia63jbHPi348fLDq3Gp8Wos7Sh2HnLC+pRdC46qX/5wL4t
+Vzj78yW9FdH5yeeE6nQLOBWh7PnSfMt2wYHoarEnkkkycP7WLpRME7qsBYqkNUNa
+2EQZSy8DnGiayYDij1YPNUHI9kpK6H/e3puhmgNkzrZj26T85LQzSm9lbCBPcmxp
+bmEgKFNvbmF0eXBlLCBJbmMuKSA8am9ybGluYUBzb25hdHlwZS5jb20+iGAEExEC
+ACAFAk1VSkkCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBYZlQHLq1md1Cy
+AJ9Vwm/4tCSR2iaLU6fCV4lnJgDnrgCeIDEdpte6HmX4eIWPHHxULLLP4Zq5Ag0E
+TVVKWRAIAOsb3rg3GoeIBQtJdgRUfULCVNEguSJMESQv9xnKgEGeQX9ItVfdMLrv
+Lbf4ySyIJ1ShBR8k80Xk8M6C2XA+c14AVUrtPUHmseO53TY0n2VjZD5ms7TOY/cq
++DheTBLzlxNsK85q0jZXOK2+Sliv9aRBIl/83c1iS5kBM76fzLWZqsiuqQsLUvEv
+oCmUI2WSzhJ3s4s3nCHHtq+sQkcaLap3FMH1IPozFFJWSlJSsIeE62AxR4XrfGs1
+y6YxA9AEhu/6QWA20T55loV9TT4geDLywxE68eu2rM867Bl2cfU6+tW4RW0Ssg2O
+Ymv/+dNe1YErRgKm5JAjWRxp0Jzc47sAAwUIAOgOfDKe+6VLQrVYXwUZ84ipBGgp
+/JwqajPzxa8YodPH0Cd8bfw236Qcd9R5MuyjNbi4M2RJ3pLlNGasICt2qloPNJqC
+miTcVGXXeaK3haG7Du6bXo7eaJl+pMXRoz3JTrdTPLHOhPgN7EeWtkAv/QbbONps
+nNcyiuvund1KX1JaoGj712xk7IrDO47eA7Vc+ply08owIlnjtO3XG0o4GbkZx7Eg
+iaG805jbRUz9Q4FHnIE3Ditmo4BrLsy6pG2kJyv0YkSM6pBSFpc/K85WDV4fEwPd
+AS3hl0rlThFuxgSHPH1Z7OqNdDnbAKp8xEKnAmb/3hx147fU+VoFd3qcudeISQQY
+EQIACQUCTVVKWQIbDAAKCRBYZlQHLq1md0BDAKCz+pK77m8VG8F4ZWyDthIjE4d/
+zACgsgdtDggyRGK8+BKm7HDnceh97sA=
+=7XCx
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    586654072EAD6677
+uid    Joel Orlina (Sonatype, Inc.) <[email protected]>
+
+sub    2E74CACB6918A897
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBE1VSkkRBACkCgvt26sMi+0X+EOJDMqdK0Sziy06k47LJf1jOg4tTZ2T9QtP
+OZ8fD+va/O5+q8Kna993jzcO5n0Nv+R/K3+MvUqSmdITshCIjBt3cC0n6FWndGyl
+jY7rOmzdNnvSkMGE3V2fQ18stkJRleqk3EuWwv+EwpxcYeVfCO+UCJGz5wCgtqnZ
+JYdRHcDkDYaIZ4eizpbV4d0D/3cgBdpcbSrwIGtft+lDxacaJrWpT5Jh5P0gLlYu
++6PFz8ZIC4+/aOSi4S4mgZxk8dBL8ZBqLqcW9rc//CYKNtPq33sdf9vxcusMIXvS
+PBODjDpoOsTJwy51fgCEL14qnp0v14y9p7ejjN5+GipiNY/JHo9S9kTdVhMYqt6x
+6a6MA/40vMejIbZ4q3Ia63jbHPi348fLDq3Gp8Wos7Sh2HnLC+pRdC46qX/5wL4t
+Vzj78yW9FdH5yeeE6nQLOBWh7PnSfMt2wYHoarEnkkkycP7WLpRME7qsBYqkNUNa
+2EQZSy8DnGiayYDij1YPNUHI9kpK6H/e3puhmgNkzrZj26T85LQzSm9lbCBPcmxp
+bmEgKFNvbmF0eXBlLCBJbmMuKSA8am9ybGluYUBzb25hdHlwZS5jb20+iGAEExEC
+ACAFAk1VSkkCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBYZlQHLq1md1Cy
+AJ9Vwm/4tCSR2iaLU6fCV4lnJgDnrgCeIDEdpte6HmX4eIWPHHxULLLP4Zq5Ag0E
+TVVKWRAIAOsb3rg3GoeIBQtJdgRUfULCVNEguSJMESQv9xnKgEGeQX9ItVfdMLrv
+Lbf4ySyIJ1ShBR8k80Xk8M6C2XA+c14AVUrtPUHmseO53TY0n2VjZD5ms7TOY/cq
++DheTBLzlxNsK85q0jZXOK2+Sliv9aRBIl/83c1iS5kBM76fzLWZqsiuqQsLUvEv
+oCmUI2WSzhJ3s4s3nCHHtq+sQkcaLap3FMH1IPozFFJWSlJSsIeE62AxR4XrfGs1
+y6YxA9AEhu/6QWA20T55loV9TT4geDLywxE68eu2rM867Bl2cfU6+tW4RW0Ssg2O
+Ymv/+dNe1YErRgKm5JAjWRxp0Jzc47sAAwUIAOgOfDKe+6VLQrVYXwUZ84ipBGgp
+/JwqajPzxa8YodPH0Cd8bfw236Qcd9R5MuyjNbi4M2RJ3pLlNGasICt2qloPNJqC
+miTcVGXXeaK3haG7Du6bXo7eaJl+pMXRoz3JTrdTPLHOhPgN7EeWtkAv/QbbONps
+nNcyiuvund1KX1JaoGj712xk7IrDO47eA7Vc+ply08owIlnjtO3XG0o4GbkZx7Eg
+iaG805jbRUz9Q4FHnIE3Ditmo4BrLsy6pG2kJyv0YkSM6pBSFpc/K85WDV4fEwPd
+AS3hl0rlThFuxgSHPH1Z7OqNdDnbAKp8xEKnAmb/3hx147fU+VoFd3qcudeISQQY
+EQIACQUCTVVKWQIbDAAKCRBYZlQHLq1md0BDAKCz+pK77m8VG8F4ZWyDthIjE4d/
+zACgsgdtDggyRGK8+BKm7HDnceh97sA=
+=7XCx
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6B1B008864323B92
+uid    Terence Parr (ANTLR Project Lead) <[email protected]>
+
+sub    FA6831EE37606774
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFTDM4oBCAC9cUMAjkP1dD7tt0JUI5kVORKagn4/zG6+Y2MUwGgJs481xsFC
+jXPuNZMucAVtXmw5Sl7FbsfSxR/9jJ2pnbXL918eRFbUqY4LnuOTZjcgNWo8PWPc
+0NLmqoLj3HXaLrpB5cRIXaQvzmfoWxt8o/ZWq1zSfDJDePuQb6qlWmnoDz/S2YJb
+f2AILPsljTE8kYIBHORGilKtUXtQRjs0SCqnbx+DSDAVKSnqYHWDMmxgBMMQsSE/
+RQ/EZ7I4eGRLLfONCxox0fuIt4kOLuMNqGWQlqiG2Kp6Uulx5SepToSrPZLyDGVA
+MgefKrKe/lzKiLeppmx7ELXOKBXlIvTFZBuzABEBAAG0M1RlcmVuY2UgUGFyciAo
+QU5UTFIgUHJvamVjdCBMZWFkKSA8cGFycnRAYW50bHIub3JnPokBOAQTAQIAIgUC
+VMMzigIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQaxsAiGQyO5IHQwf/
+VuVSUFdUJToUScygLSxS1zp6dTEUXc/BfNXD0+7TVRXtzNKNUUwLYRlPRX5aHkUV
+d3+g3QiD6DQIVlSH0INCOto7/EP0ENLbC0Tm6QGhhDg2zO+A1OLRLwXFAVun/4Wm
+1eV3lakXRBCE/Fji0QxDWTYXakShmzIyTZCfJB8jtxG6EYyKNSrOMM2HBjJY63y+
+sQWOYJRz7Y2pv3kpwzPPQ8yxRSsDkJSKU9FyzBZfl1F1UnNkzK3BwL+CyKOAh0Zu
+2u11SJ3gUF0O65Y6FeBW7FVyPYr2IlMsYokr6Ry1pmndehQzQB3paEGUiMO4KWN9
+1OZUfcG0LBZB/FFBmVTVYLkBDQRUwzOKAQgAy86UOqIrhAeN34v5QKv2ZGWWNc6r
+Wi7ieC+dnx2D4kmvn+BLaCX7hJCyNL1ex2TvZlhXt8cgA8jAVgN5+aHTaJwpcTHU
+pzx2p5UIe9oBAEq20NyjF3P9o7lt1C5V1b71EKMTwTOSfWUcK0Skz4G/+gkhNjSV
+fxYwZO1v+Ce4mRCCRi6x8pFGHdyukVR0wJ/o8yKvQijUciGMEbnpDC76N1eAQgd0
+wo79WWGZty+w/qQSknXwTTJ028LlumuVV8UlYxZ/eYYSrtK2t2w+6UG16TqHATDF
+lEyShzYJCer2H1fmSGWncZZ4ODQCkNzNWirPn+q/Rr8CBo7PlMUV06OKZQARAQAB
+iQEfBBgBAgAJBQJUwzOKAhsMAAoJEGsbAIhkMjuSZOMH/2V3TM9qXvwiGsmO2msb
+Ita9b2MbvdlIj7EfI9rt2azPjYTLiQcYWWntKN6tYmB61kK3qzARwcW8pJQ0FiOo
+XEG8jqwHUz3bIxF8ftbq3peLUJi03PDQoNlTpKRuj5EvV7M1f1uZGaKU5W8+BVVx
+Oq8exMeyDU+8PifHmW9S1iFPqq0gPqjljlzzcIZH/JM7pq59uoj3YuNz2X3PreQP
+XVaz607JXUhxJ4MIEqEy/qjD5OGZRKQr44eSxk7938j80OcBa/1IbbjvGs5oi2IY
+gEzpV3KGDU+kSDHVuKcwloU5qMC1Vvhrkildb23wtFBRYIpgke6HBcaQOIivCatS
+bBI=
+=yW86
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+uid    Kevin Wooten <[email protected]>
+
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG0H0tldmluIFdvb3RlbiA8
+a2V2aW5Ad29vdGVuLmNvbT6JATcEEwEKACEFAlVB0KACGwMFCwkIBwMFFQoJCAsF
+FgIDAQACHgECF4AACgkQR9z8Kln1m1tCNwf+MaNFqR4lezA6ebkpZ4vIKGPoCOAx
+b0zEXgKPUIsqiH3R0oYzkTqrhm85w9cwJDnPKISg/uoP6gKqJIFIwjSVWO9ESg7w
+SSXKpHZTd34XaqrBWS102btT3wi0PwRs7Bl098jgKmtFT2AhctwZfh1gULHGjHYp
+tOK4KuDch6gYoJ4h01rxMZ6vkO6IWT5rjkgl8SYbjHMsffl1/eLMpS7UvA9S6xIF
+JLxI1+/+5gg2M6VRAgMFZXujstoKOym6t/8ayZbz3HNA9Sw01vJiMYXmWoNn6Gj4
+nxxCtsorIcTW9qzGubnoDGR/DkUlux7QZrEl84A3/f4Z9SWfZ7u8aTuqsLkBDQRV
+QdCgAQgA7kQawwfOhqatOWR4JvWROpgk3TQE9QJGKOPkIlkaxTws0cyap4idMcZo
+RETVqXCpFiWcwVqwDbThQUhJx36EGn3P4mByNN2wLYw05fN4nofiuM708v7hG6SV
+2DcsYHyKXT6dc7pZDWSyCtEMv03ST93rTPaGjM+X0lj7gBgODyYLAtHcAgOuAFkD
+ZU2k1CfGWnm06QZ8Uj+EBf6fGp0sc9aySGQx9asyV6pVa+tksLuJVCsHesT7Up01
+cwtbBQsfSDh4eAuYemqNiHS0H8EI8PEozwsDdmJYtXwGyoP0rvXojv3v0pgrJgfs
+cJsyPrc7ajsWWMMP/HsPQr6DV4OcUwARAQABiQEfBBgBCgAJBQJVQdCgAhsMAAoJ
+EEfc/CpZ9ZtbLAsH/14uJWhG6mxG28lIaWqsNbv6fcRFVBK182n2ZziTZR9zvgqv
+dFZCX4mJA14JtbPV7SMl4Jt5wCcj+lrL2Zg9ywCspGXDp9gDRczYeG4uZHOUOuP1
+sF0QHtjUPCl4vrzcgo9BHx40tg83Yqkl4684Jk1GsXGmjX9krndXpYpZxjqvZEy+
+UcrlzfBwAxMiFWPbHxRaUyAlJADF87AC83CythCne8+MwnR51gNwX6VB9e5G8CJh
+KI79Ml4Nxu9bshJivTH4X1hHy1WZ4RTpYh9+QiX/mUWpESL/3MHE258/4t4kSmmZ
+uibIH78M76e5PfyVjZBdAdgcuQBYGJ0p9c7qSM4=
+=/5Qn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG5AQ0EVUHQoAEIAO5EGsMH
+zoamrTlkeCb1kTqYJN00BPUCRijj5CJZGsU8LNHMmqeInTHGaERE1alwqRYlnMFa
+sA204UFIScd+hBp9z+JgcjTdsC2MNOXzeJ6H4rjO9PL+4Rukldg3LGB8il0+nXO6
+WQ1ksgrRDL9N0k/d60z2hozPl9JY+4AYDg8mCwLR3AIDrgBZA2VNpNQnxlp5tOkG
+fFI/hAX+nxqdLHPWskhkMfWrMleqVWvrZLC7iVQrB3rE+1KdNXMLWwULH0g4eHgL
+mHpqjYh0tB/BCPDxKM8LA3ZiWLV8BsqD9K716I7979KYKyYH7HCbMj63O2o7FljD
+D/x7D0K+g1eDnFMAEQEAAYkBHwQYAQoACQUCVUHQoAIbDAAKCRBH3PwqWfWbWywL
+B/9eLiVoRupsRtvJSGlqrDW7+n3ERVQStfNp9mc4k2Ufc74Kr3RWQl+JiQNeCbWz
+1e0jJeCbecAnI/pay9mYPcsArKRlw6fYA0XM2HhuLmRzlDrj9bBdEB7Y1DwpeL68
+3IKPQR8eNLYPN2KpJeOvOCZNRrFxpo1/ZK53V6WKWcY6r2RMvlHK5c3wcAMTIhVj
+2x8UWlMgJSQAxfOwAvNwsrYQp3vPjMJ0edYDcF+lQfXuRvAiYSiO/TJeDcbvW7IS
+Yr0x+F9YR8tVmeEU6WIffkIl/5lFqREi/9zBxNufP+LeJEppmbomyB+/DO+nuT38
+lY2QXQHYHLkAWBidKfXO6kjO
+=airW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG5AQ0EVUHQoAEIAO5EGsMH
+zoamrTlkeCb1kTqYJN00BPUCRijj5CJZGsU8LNHMmqeInTHGaERE1alwqRYlnMFa
+sA204UFIScd+hBp9z+JgcjTdsC2MNOXzeJ6H4rjO9PL+4Rukldg3LGB8il0+nXO6
+WQ1ksgrRDL9N0k/d60z2hozPl9JY+4AYDg8mCwLR3AIDrgBZA2VNpNQnxlp5tOkG
+fFI/hAX+nxqdLHPWskhkMfWrMleqVWvrZLC7iVQrB3rE+1KdNXMLWwULH0g4eHgL
+mHpqjYh0tB/BCPDxKM8LA3ZiWLV8BsqD9K716I7979KYKyYH7HCbMj63O2o7FljD
+D/x7D0K+g1eDnFMAEQEAAYkBHwQYAQoACQUCVUHQoAIbDAAKCRBH3PwqWfWbWywL
+B/9eLiVoRupsRtvJSGlqrDW7+n3ERVQStfNp9mc4k2Ufc74Kr3RWQl+JiQNeCbWz
+1e0jJeCbecAnI/pay9mYPcsArKRlw6fYA0XM2HhuLmRzlDrj9bBdEB7Y1DwpeL68
+3IKPQR8eNLYPN2KpJeOvOCZNRrFxpo1/ZK53V6WKWcY6r2RMvlHK5c3wcAMTIhVj
+2x8UWlMgJSQAxfOwAvNwsrYQp3vPjMJ0edYDcF+lQfXuRvAiYSiO/TJeDcbvW7IS
+Yr0x+F9YR8tVmeEU6WIffkIl/5lFqREi/9zBxNufP+LeJEppmbomyB+/DO+nuT38
+lY2QXQHYHLkAWBidKfXO6kjO
+=airW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+uid    Kevin Wooten <[email protected]>
+
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG0H0tldmluIFdvb3RlbiA8
+a2V2aW5Ad29vdGVuLmNvbT6JATcEEwEKACEFAlVB0KACGwMFCwkIBwMFFQoJCAsF
+FgIDAQACHgECF4AACgkQR9z8Kln1m1tCNwf+MaNFqR4lezA6ebkpZ4vIKGPoCOAx
+b0zEXgKPUIsqiH3R0oYzkTqrhm85w9cwJDnPKISg/uoP6gKqJIFIwjSVWO9ESg7w
+SSXKpHZTd34XaqrBWS102btT3wi0PwRs7Bl098jgKmtFT2AhctwZfh1gULHGjHYp
+tOK4KuDch6gYoJ4h01rxMZ6vkO6IWT5rjkgl8SYbjHMsffl1/eLMpS7UvA9S6xIF
+JLxI1+/+5gg2M6VRAgMFZXujstoKOym6t/8ayZbz3HNA9Sw01vJiMYXmWoNn6Gj4
+nxxCtsorIcTW9qzGubnoDGR/DkUlux7QZrEl84A3/f4Z9SWfZ7u8aTuqsLkBDQRV
+QdCgAQgA7kQawwfOhqatOWR4JvWROpgk3TQE9QJGKOPkIlkaxTws0cyap4idMcZo
+RETVqXCpFiWcwVqwDbThQUhJx36EGn3P4mByNN2wLYw05fN4nofiuM708v7hG6SV
+2DcsYHyKXT6dc7pZDWSyCtEMv03ST93rTPaGjM+X0lj7gBgODyYLAtHcAgOuAFkD
+ZU2k1CfGWnm06QZ8Uj+EBf6fGp0sc9aySGQx9asyV6pVa+tksLuJVCsHesT7Up01
+cwtbBQsfSDh4eAuYemqNiHS0H8EI8PEozwsDdmJYtXwGyoP0rvXojv3v0pgrJgfs
+cJsyPrc7ajsWWMMP/HsPQr6DV4OcUwARAQABiQEfBBgBCgAJBQJVQdCgAhsMAAoJ
+EEfc/CpZ9ZtbLAsH/14uJWhG6mxG28lIaWqsNbv6fcRFVBK182n2ZziTZR9zvgqv
+dFZCX4mJA14JtbPV7SMl4Jt5wCcj+lrL2Zg9ywCspGXDp9gDRczYeG4uZHOUOuP1
+sF0QHtjUPCl4vrzcgo9BHx40tg83Yqkl4684Jk1GsXGmjX9krndXpYpZxjqvZEy+
+UcrlzfBwAxMiFWPbHxRaUyAlJADF87AC83CythCne8+MwnR51gNwX6VB9e5G8CJh
+KI79Ml4Nxu9bshJivTH4X1hHy1WZ4RTpYh9+QiX/mUWpESL/3MHE258/4t4kSmmZ
+uibIH78M76e5PfyVjZBdAdgcuQBYGJ0p9c7qSM4=
+=/5Qn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+uid    Kevin Wooten <[email protected]>
+
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG0H0tldmluIFdvb3RlbiA8
+a2V2aW5Ad29vdGVuLmNvbT6JATcEEwEKACEFAlVB0KACGwMFCwkIBwMFFQoJCAsF
+FgIDAQACHgECF4AACgkQR9z8Kln1m1tCNwf+MaNFqR4lezA6ebkpZ4vIKGPoCOAx
+b0zEXgKPUIsqiH3R0oYzkTqrhm85w9cwJDnPKISg/uoP6gKqJIFIwjSVWO9ESg7w
+SSXKpHZTd34XaqrBWS102btT3wi0PwRs7Bl098jgKmtFT2AhctwZfh1gULHGjHYp
+tOK4KuDch6gYoJ4h01rxMZ6vkO6IWT5rjkgl8SYbjHMsffl1/eLMpS7UvA9S6xIF
+JLxI1+/+5gg2M6VRAgMFZXujstoKOym6t/8ayZbz3HNA9Sw01vJiMYXmWoNn6Gj4
+nxxCtsorIcTW9qzGubnoDGR/DkUlux7QZrEl84A3/f4Z9SWfZ7u8aTuqsLkBDQRV
+QdCgAQgA7kQawwfOhqatOWR4JvWROpgk3TQE9QJGKOPkIlkaxTws0cyap4idMcZo
+RETVqXCpFiWcwVqwDbThQUhJx36EGn3P4mByNN2wLYw05fN4nofiuM708v7hG6SV
+2DcsYHyKXT6dc7pZDWSyCtEMv03ST93rTPaGjM+X0lj7gBgODyYLAtHcAgOuAFkD
+ZU2k1CfGWnm06QZ8Uj+EBf6fGp0sc9aySGQx9asyV6pVa+tksLuJVCsHesT7Up01
+cwtbBQsfSDh4eAuYemqNiHS0H8EI8PEozwsDdmJYtXwGyoP0rvXojv3v0pgrJgfs
+cJsyPrc7ajsWWMMP/HsPQr6DV4OcUwARAQABiQEfBBgBCgAJBQJVQdCgAhsMAAoJ
+EEfc/CpZ9ZtbLAsH/14uJWhG6mxG28lIaWqsNbv6fcRFVBK182n2ZziTZR9zvgqv
+dFZCX4mJA14JtbPV7SMl4Jt5wCcj+lrL2Zg9ywCspGXDp9gDRczYeG4uZHOUOuP1
+sF0QHtjUPCl4vrzcgo9BHx40tg83Yqkl4684Jk1GsXGmjX9krndXpYpZxjqvZEy+
+UcrlzfBwAxMiFWPbHxRaUyAlJADF87AC83CythCne8+MwnR51gNwX6VB9e5G8CJh
+KI79Ml4Nxu9bshJivTH4X1hHy1WZ4RTpYh9+QiX/mUWpESL/3MHE258/4t4kSmmZ
+uibIH78M76e5PfyVjZBdAdgcuQBYGJ0p9c7qSM4=
+=/5Qn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+uid    Kevin Wooten <[email protected]>
+
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG0H0tldmluIFdvb3RlbiA8
+a2V2aW5Ad29vdGVuLmNvbT6JATcEEwEKACEFAlVB0KACGwMFCwkIBwMFFQoJCAsF
+FgIDAQACHgECF4AACgkQR9z8Kln1m1tCNwf+MaNFqR4lezA6ebkpZ4vIKGPoCOAx
+b0zEXgKPUIsqiH3R0oYzkTqrhm85w9cwJDnPKISg/uoP6gKqJIFIwjSVWO9ESg7w
+SSXKpHZTd34XaqrBWS102btT3wi0PwRs7Bl098jgKmtFT2AhctwZfh1gULHGjHYp
+tOK4KuDch6gYoJ4h01rxMZ6vkO6IWT5rjkgl8SYbjHMsffl1/eLMpS7UvA9S6xIF
+JLxI1+/+5gg2M6VRAgMFZXujstoKOym6t/8ayZbz3HNA9Sw01vJiMYXmWoNn6Gj4
+nxxCtsorIcTW9qzGubnoDGR/DkUlux7QZrEl84A3/f4Z9SWfZ7u8aTuqsLkBDQRV
+QdCgAQgA7kQawwfOhqatOWR4JvWROpgk3TQE9QJGKOPkIlkaxTws0cyap4idMcZo
+RETVqXCpFiWcwVqwDbThQUhJx36EGn3P4mByNN2wLYw05fN4nofiuM708v7hG6SV
+2DcsYHyKXT6dc7pZDWSyCtEMv03ST93rTPaGjM+X0lj7gBgODyYLAtHcAgOuAFkD
+ZU2k1CfGWnm06QZ8Uj+EBf6fGp0sc9aySGQx9asyV6pVa+tksLuJVCsHesT7Up01
+cwtbBQsfSDh4eAuYemqNiHS0H8EI8PEozwsDdmJYtXwGyoP0rvXojv3v0pgrJgfs
+cJsyPrc7ajsWWMMP/HsPQr6DV4OcUwARAQABiQEfBBgBCgAJBQJVQdCgAhsMAAoJ
+EEfc/CpZ9ZtbLAsH/14uJWhG6mxG28lIaWqsNbv6fcRFVBK182n2ZziTZR9zvgqv
+dFZCX4mJA14JtbPV7SMl4Jt5wCcj+lrL2Zg9ywCspGXDp9gDRczYeG4uZHOUOuP1
+sF0QHtjUPCl4vrzcgo9BHx40tg83Yqkl4684Jk1GsXGmjX9krndXpYpZxjqvZEy+
+UcrlzfBwAxMiFWPbHxRaUyAlJADF87AC83CythCne8+MwnR51gNwX6VB9e5G8CJh
+KI79Ml4Nxu9bshJivTH4X1hHy1WZ4RTpYh9+QiX/mUWpESL/3MHE258/4t4kSmmZ
+uibIH78M76e5PfyVjZBdAdgcuQBYGJ0p9c7qSM4=
+=/5Qn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47DCFC2A59F59B5B
+sub    FCB1A11865F6A17A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFVB0KABCAC8YRgcTIomAMw865DHxS/tbFgqN9i7M+tgpih1ETJbb4enhIBj
+Upeq+MoFCtxN86zGu2gsA4DOMEXVCReJ4O5n0F8E03+NUraCnJjbXLW9eEyRQRaU
+sYXDn/3SpXQyZGP0XemHUfG2Gok77mqiqbYGO5PwQoTX09X1a1wvM/GUYS8I5dUh
+UY6MwB3IEXaoNIccuNs3exm9ojmnvLO4VZuXcLOizlqxq6+8VbEP9qr06UNLsPDH
+vdqLxIUpZWSyYnUQZIrkctsUvlxQMnB/PpzAN9hKvyps6quQv8tD+dyPreT1TJGM
+ej4OcJXkQNmDxXu0/GP7X5yPsunKy3MLabutABEBAAG5AQ0EVUHQoAEIAO5EGsMH
+zoamrTlkeCb1kTqYJN00BPUCRijj5CJZGsU8LNHMmqeInTHGaERE1alwqRYlnMFa
+sA204UFIScd+hBp9z+JgcjTdsC2MNOXzeJ6H4rjO9PL+4Rukldg3LGB8il0+nXO6
+WQ1ksgrRDL9N0k/d60z2hozPl9JY+4AYDg8mCwLR3AIDrgBZA2VNpNQnxlp5tOkG
+fFI/hAX+nxqdLHPWskhkMfWrMleqVWvrZLC7iVQrB3rE+1KdNXMLWwULH0g4eHgL
+mHpqjYh0tB/BCPDxKM8LA3ZiWLV8BsqD9K716I7979KYKyYH7HCbMj63O2o7FljD
+D/x7D0K+g1eDnFMAEQEAAYkBHwQYAQoACQUCVUHQoAIbDAAKCRBH3PwqWfWbWywL
+B/9eLiVoRupsRtvJSGlqrDW7+n3ERVQStfNp9mc4k2Ufc74Kr3RWQl+JiQNeCbWz
+1e0jJeCbecAnI/pay9mYPcsArKRlw6fYA0XM2HhuLmRzlDrj9bBdEB7Y1DwpeL68
+3IKPQR8eNLYPN2KpJeOvOCZNRrFxpo1/ZK53V6WKWcY6r2RMvlHK5c3wcAMTIhVj
+2x8UWlMgJSQAxfOwAvNwsrYQp3vPjMJ0edYDcF+lQfXuRvAiYSiO/TJeDcbvW7IS
+Yr0x+F9YR8tVmeEU6WIffkIl/5lFqREi/9zBxNufP+LeJEppmbomyB+/DO+nuT38
+lY2QXQHYHLkAWBidKfXO6kjO
+=airW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    47586A1B75EF0DE5
+uid    Benoit Quenaudon <[email protected]>
+
+sub    D74B959DFA1D84F2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFkW7RoBCAC7NMtr/e27nrUuIcEZEJBZS3TbZYId80UNQXgYmqPhy/sfCyMc
+87eKzOalauwLbr5+VGuKqhvKrihV1WCt2+FUjOtnCf1GutpAUH9plfSs8IpRog0h
+i9IpApPeR0Q37fHhc/fSLDxoHIylML0058K2X9js/VNg9xospjvRBi0vXmNaMWuo
+qMQXXVJrDDtDlxljx78Fk7b/qiFuqBgIPM3U5OPyaQ9Qks8wactSYo9pcqIZx9BF
+/XR//WvPwQ5MEAPCkwXnNIlrePDGMule7QRRmDvNkcD8V2xSOM+fhVd3UpuCpMEG
+h3MpiaFq9TF9O1Fv22Cs4eM3mnYOEHjAGyNzABEBAAG0JUJlbm9pdCBRdWVuYXVk
+b24gPG9sZGVyaW5nQGdtYWlsLmNvbT6JATcEEwEKACEFAlkW7RoCGwMFCwkIBwMF
+FQoJCAsFFgIDAQACHgECF4AACgkQR1hqG3XvDeU8FAf+KJqG/lNX1xzASjIYxXPj
+W++DVsvysQaSAr5OebRsD/KLeEM68ps65AfpMgxIAs094NEhA99wIXclf4vjZJ3W
+5z2VS2+IwhnDNYD9Pe0xt3H8zfbL3no0LyPS+pAsavtgJ0gqRG/kNDDoM/RmI2S4
+yZgaku6kQ4hCKKubdrPBV+LqCSBvEn6kTvHMvIYQrtDgvm/X9hTR/42zaAK9UaD1
+RiLF2k2nbQeJlDu8ZSvuA3IOGTb6ALUA66KkmiDqMG43vZs+ZTAKnreWKsPKlQr0
+eAAN/dcFVg35+bjf02561Zi73NcgMS7M6VgBExBoGYDW4299vnu8K3FqOHDQs3f4
+8rkBDQRZFu0aAQgA1+Ve/M0qe9PJ3RECh7T23GIGQSQ2qz877YKt0ZszRRqO3zyn
++odZTlDV7dNfWuC4vZfzY7tMs+4VpYiiFBGnEmZkgCc0upK5IuHrS9HwuD3VcOw6
+e9SpmOgYkJYKmjtNCNz7BIoYCIu+PYzaueP12DXCIod7bij8+smRaon0IkDj4SqH
+ALxnb75+L9MQKaxTfkOybDWLfhz9oxfUtO2StLHlGVk8Q6GVAhKJIp6bZGDA/S3m
+Hx/AZHnVsL8o98oYRIuwLFPxeAYauY6cgwoD/9FYpkQSlxbsLsje8HRT1nvzWKhP
+4NwZFDkmEWsKOiIYgV9lQWompcLpqLFfmp0pPwARAQABiQEfBBgBCgAJBQJZFu0a
+AhsMAAoJEEdYaht17w3l3ZoH/RYBt2aiAhrbjQteyA5CpNZ6V8jRrudzEHB/boJH
+FnBUGNhzDDeu9FoJGrR8r4AvLyJgqiiATN3/erKEiZI/cP8wBfzjoMBM9MiYLgRg
+NawvoLd03oEUq856SbCwW096GE6m/eLcT3735+aIchMAHSagHP9cIuWr+t3+W0z5
+MURVOe71bf2TSySXhbdp4E05XjRgAwdQciW0n8SCKgRppO/CuIWiUyvt5JCCrfxY
+gEOMg5/wEGRSuNS7YtYB92CBgLPQ7SmpNSMUY3Hvvg+AblS7sxPDDvvY7whHK2U4
+6LJQx7BqPFqTmGPfFbSt2843qryNpjbAIzMpm0WC40LvvLU=
+=5a7q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    ECDFEA3CB4493B94
+sub    3BD211F725778C36
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBERFeVERBACjfASThn15ynIICr0Gu8quGCl2rSSRar8TsjrbiwYB2MTW35Rg
+NjLU6MN5Nq4d5G8D5aMeoyGODstIHH8zA52sDGeHOMKfDaAraL+lGzElbpmaqP2s
+P+y+J4gDMlxSBoXY5HjfZUTogP4olWYJS0tWTFc6EiXcSH1zCo1rdo1TTwCg9/U5
+q+Us2XbjevKghRbRabl//R0EAIcimKSJf1w/3yVwrYeUh2Op0fM23y+JUAPcG8SD
+lRnHRnIrf2e0pAkQQ32us1zRaHbuHzcJc0lP1eyoQh0KoRZIUq/7mj9q6Dp3H63b
+VNAxU7O4DyPMMmlgTiZCjwN2qBclZ9zegGx51v2UR4b+qKhZZCHOSjdj0Xhq6P1L
+O7G9A/wItw9LtJhVBqXVxL/pNVNA++NneLMdl5OpAAqJtI44oflJpo/FJlnDFuHP
+ueLYZVWWGoOlPW0odKxI3fvMO0ZfTtm4VO0mjEN2kZ/OR8L3c2Tdx9AHS5lVqIh/
+T4fRqXl/zjbdE+ZqYqhEYelZat3V4EhBAmj2jFQiHsSbfMiSerkCDQRERXljEAgA
+3nHJ+5JvtwQIFzw95ZTPdB/4+Do6JzhZssC1L6ZtgjDh3zdEDbloXsyroawwcY6U
++unak24iTXlbcI/IgZnYIzZcdHM70hi9KtfhSAMRDI+UaFsxLhvx8hcTUV0fzx+B
+8q6nvdI/8fnjJ6Cr0EaCmWOqEjERs9NL7va7Y33JirQQ3pwe6VpzaejE+OzpqQMA
+vfhLw9ucq+l2KGTTk/LccQU3sUIF0osAakPXbTPDHXFmqWkIp0GQIExCorW7FBbq
++4Edd0n4H54z0kP/BLh3M6HgHTUQurV5yw+/enSv7B0wJPiULiUCWN1hb/Vyds9W
+Yo4NPL/MIlxH/ZVTUids0wADBQf/WpR4MjKrxrf6G20J+TXBnRV7cZPdx4FsUE8s
+CQFay4ZzXP24tkmWXQ1b8AcmUr6opnuMio6QXV1lFBIU2rrdoJ3uQihrc21cTE5/
+FzYkFrWH3ESlOuYUaqefWJp3B5i8lNoUdShAK4iwjxsM6J1Mnl/TT5V2nwvB38Co
+AcuKQTmUGNOAnECAPGmTy5NQ2YLZzRMHn9HzyWpNKLAEkp0qN9EVZK5TBGSnFP0f
+BfYPWHg+kaLVzpT3KhkzSGjE4cyWoyuIYwSb6/3FLnaCCalYaC8k2mEhw9oFaJc8
+yyIasKaoAnbPWdMXQR32ZSTUwWBd7GyA9U+wLaNamJramQEBFYhJBBgRAgAJBQJE
+RXljAhsMAAoJEOzf6jy0STuUac8AoK8Mz00VwJP+L1IEB+9rlPaWwPAkAKD1W5wH
+sZzmsaj6pFkpumu/OmsStg==
+=rjff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    ECDFEA3CB4493B94
+sub    3BD211F725778C36
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBERFeVERBACjfASThn15ynIICr0Gu8quGCl2rSSRar8TsjrbiwYB2MTW35Rg
+NjLU6MN5Nq4d5G8D5aMeoyGODstIHH8zA52sDGeHOMKfDaAraL+lGzElbpmaqP2s
+P+y+J4gDMlxSBoXY5HjfZUTogP4olWYJS0tWTFc6EiXcSH1zCo1rdo1TTwCg9/U5
+q+Us2XbjevKghRbRabl//R0EAIcimKSJf1w/3yVwrYeUh2Op0fM23y+JUAPcG8SD
+lRnHRnIrf2e0pAkQQ32us1zRaHbuHzcJc0lP1eyoQh0KoRZIUq/7mj9q6Dp3H63b
+VNAxU7O4DyPMMmlgTiZCjwN2qBclZ9zegGx51v2UR4b+qKhZZCHOSjdj0Xhq6P1L
+O7G9A/wItw9LtJhVBqXVxL/pNVNA++NneLMdl5OpAAqJtI44oflJpo/FJlnDFuHP
+ueLYZVWWGoOlPW0odKxI3fvMO0ZfTtm4VO0mjEN2kZ/OR8L3c2Tdx9AHS5lVqIh/
+T4fRqXl/zjbdE+ZqYqhEYelZat3V4EhBAmj2jFQiHsSbfMiSerkCDQRERXljEAgA
+3nHJ+5JvtwQIFzw95ZTPdB/4+Do6JzhZssC1L6ZtgjDh3zdEDbloXsyroawwcY6U
++unak24iTXlbcI/IgZnYIzZcdHM70hi9KtfhSAMRDI+UaFsxLhvx8hcTUV0fzx+B
+8q6nvdI/8fnjJ6Cr0EaCmWOqEjERs9NL7va7Y33JirQQ3pwe6VpzaejE+OzpqQMA
+vfhLw9ucq+l2KGTTk/LccQU3sUIF0osAakPXbTPDHXFmqWkIp0GQIExCorW7FBbq
++4Edd0n4H54z0kP/BLh3M6HgHTUQurV5yw+/enSv7B0wJPiULiUCWN1hb/Vyds9W
+Yo4NPL/MIlxH/ZVTUids0wADBQf/WpR4MjKrxrf6G20J+TXBnRV7cZPdx4FsUE8s
+CQFay4ZzXP24tkmWXQ1b8AcmUr6opnuMio6QXV1lFBIU2rrdoJ3uQihrc21cTE5/
+FzYkFrWH3ESlOuYUaqefWJp3B5i8lNoUdShAK4iwjxsM6J1Mnl/TT5V2nwvB38Co
+AcuKQTmUGNOAnECAPGmTy5NQ2YLZzRMHn9HzyWpNKLAEkp0qN9EVZK5TBGSnFP0f
+BfYPWHg+kaLVzpT3KhkzSGjE4cyWoyuIYwSb6/3FLnaCCalYaC8k2mEhw9oFaJc8
+yyIasKaoAnbPWdMXQR32ZSTUwWBd7GyA9U+wLaNamJramQEBFYhJBBgRAgAJBQJE
+RXljAhsMAAoJEOzf6jy0STuUac8AoK8Mz00VwJP+L1IEB+9rlPaWwPAkAKD1W5wH
+sZzmsaj6pFkpumu/OmsStg==
+=rjff
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    971B04F56669B805
+sub    D3664677F6280E44
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEzZjwMBCAC0ecfE/qkdgq8uJv1c1ZlzegeWH/lxW0W3SWK2RwaHx7LrfpiN
+WhxLkXbK6fkf86FN4579W1+9Qef2yjZCwTfLe6bqj3zZGQWSu7HPw1mmhf9lbhJ9
++TlxlczRt7m20fpSakGLIs1Jp7L4WJq3N5Ti6IsDFNOZdzGCpuiezzvp08PAD/f+
+eYABnWskOOarCOUrRJ5hV4FFj+9w+OPL25iaaEvHaAuqxvmahHzIPaT5v5Kr9Qiu
+zx0jdNaoq4/wJOGQ8rfMnXSjmuoMNgzTEs/H9ElNdBRfH50xYG6MACnVrZ1kGiCy
+z8BYBZzNUen+I0ek9SlMQDvGr0vRe4AeqlutABEBAAG5AQ0ETNmPAwEIALb8q/SE
+92Bg1UamGopUJ7lbqyebdVx0Fjf8T9MkEnteY0kvpEvluDaUWty393w4QRFPFCen
+Qtn5iyIiE0x+/xF5WlfP9kBMS03n6eXTs1pxgQ0YZ73qvzyZdOzg71isigrduA4r
+yXpoiTlWCfeStapimSUUgXxtsxFLeRVm14j0Xht1cvFCKpdxVZ9+vXIQZlyP2QqU
+zN46bwWwK2lNkKehkdSUPgUdEli/jw3L8rdASs6d8RqO/aiQN0R2kc9EA9kaRaQc
+mBboLsuZwoOCbyxPTpIZ7836b/KRuCM0sBy+RVNem1kv+905yWWJF32lZij/M01c
+OUnlnw6TVDJW5hMAEQEAAYkBHwQYAQIACQUCTNmPAwIbDAAKCRCXGwT1Zmm4Bac3
+B/4umKNZuUFKwTD+FTu6kRUOO2Rnsmk6WBuPm8h3ov2g6lW+2NjeeBib3fl+ehQ3
+IeRebLaxa0ZNAiajxbiMW5LNVC0hvqlsVAxP2Rv+DVoznI6L4I8vNEfa8ysbMY4T
+musAds4kbni7oHTUGA5bzvFgQ0ifDaFxFRvbn9ycDYFfatwDEbs3xgjewy1611zQ
+ef74Si6NR86Xit6v+056srmhZyV53e+pxGAVMw/qR6ROiMNrgLl7CPhtTwSYmSZE
+zQseNBFZpHUb7IGzk4B3ulwlhTcLnb7SUo5DhrBz5Et7XcQ/2mQOH1SrSEmoeyoq
+UfbLkuGneZv5H0KIMZ/5pV4H
+=3VLr
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    971B04F56669B805
+sub    D3664677F6280E44
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEzZjwMBCAC0ecfE/qkdgq8uJv1c1ZlzegeWH/lxW0W3SWK2RwaHx7LrfpiN
+WhxLkXbK6fkf86FN4579W1+9Qef2yjZCwTfLe6bqj3zZGQWSu7HPw1mmhf9lbhJ9
++TlxlczRt7m20fpSakGLIs1Jp7L4WJq3N5Ti6IsDFNOZdzGCpuiezzvp08PAD/f+
+eYABnWskOOarCOUrRJ5hV4FFj+9w+OPL25iaaEvHaAuqxvmahHzIPaT5v5Kr9Qiu
+zx0jdNaoq4/wJOGQ8rfMnXSjmuoMNgzTEs/H9ElNdBRfH50xYG6MACnVrZ1kGiCy
+z8BYBZzNUen+I0ek9SlMQDvGr0vRe4AeqlutABEBAAG5AQ0ETNmPAwEIALb8q/SE
+92Bg1UamGopUJ7lbqyebdVx0Fjf8T9MkEnteY0kvpEvluDaUWty393w4QRFPFCen
+Qtn5iyIiE0x+/xF5WlfP9kBMS03n6eXTs1pxgQ0YZ73qvzyZdOzg71isigrduA4r
+yXpoiTlWCfeStapimSUUgXxtsxFLeRVm14j0Xht1cvFCKpdxVZ9+vXIQZlyP2QqU
+zN46bwWwK2lNkKehkdSUPgUdEli/jw3L8rdASs6d8RqO/aiQN0R2kc9EA9kaRaQc
+mBboLsuZwoOCbyxPTpIZ7836b/KRuCM0sBy+RVNem1kv+905yWWJF32lZij/M01c
+OUnlnw6TVDJW5hMAEQEAAYkBHwQYAQIACQUCTNmPAwIbDAAKCRCXGwT1Zmm4Bac3
+B/4umKNZuUFKwTD+FTu6kRUOO2Rnsmk6WBuPm8h3ov2g6lW+2NjeeBib3fl+ehQ3
+IeRebLaxa0ZNAiajxbiMW5LNVC0hvqlsVAxP2Rv+DVoznI6L4I8vNEfa8ysbMY4T
+musAds4kbni7oHTUGA5bzvFgQ0ifDaFxFRvbn9ycDYFfatwDEbs3xgjewy1611zQ
+ef74Si6NR86Xit6v+056srmhZyV53e+pxGAVMw/qR6ROiMNrgLl7CPhtTwSYmSZE
+zQseNBFZpHUb7IGzk4B3ulwlhTcLnb7SUo5DhrBz5Et7XcQ/2mQOH1SrSEmoeyoq
+UfbLkuGneZv5H0KIMZ/5pV4H
+=3VLr
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    995EFBF4A3D20BEB
+uid    Ktlint (ktlint signing key) <[email protected]>
+
+sub    B89991D171A02F5C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+RUjO/QWG6CIej/nl7O0g91NtlEY=
+=Ixqm
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    995EFBF4A3D20BEB
+uid    Ktlint (ktlint signing key) <[email protected]>
+
+sub    B89991D171A02F5C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+RUjO/QWG6CIej/nl7O0g91NtlEY=
+=Ixqm
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BAC30622339994C4
+sub    FC9BDC25FB378008
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFlMExYBCACmdTDSXPwSJeYbfYvHoDl5C7vx/0+LOTunDGJN38pNQHYQAZnv
+Gyoc9ZmChrhLoim7z4ILqmNo8eegknepQ3dGdUij4NVIhR+m+8irayTbsNHvo3UG
+9y7eM5tTSjyNYkyk5fAVuT7OhzIzMA+qtc3GRVxNYRKnaHajt+pOSqr+uoDtMG3n
+6eAMHCAnhgh5Nd+dCFcNT+syl3zCwolA1wrzGxxOaif+xi5wwXjmF/lAt4PDIuDT
+etA2/AqPM4zAC0BtC0iqVgVypjFV3EAexm/g0LNMiG/M/krzwjPq5gf1DY/57jU0
+02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG5AQ0EWUwTFgEIANmMpV3N
+K8aLrLgQTyh5++det8C3D3T5tkEdljHOuN31/qdKNge8H6uKH8zXRZsj5pd8adpW
+kD4TzIMvzIwzizsGw34O9hf1E2XPoDqvQr39p1sovX3PeDvRJY/7JFNt9DsphVc3
+xWQfNkC7JdMPa6JRiFHd3ynfbQ+wplf4tfaDVn1JXAWp0NSGgMtXfn5i19hHQWjm
+RNAKNQLdVn8UczI8XdVM7bS4giDpQMukSyjsjgAo466iRK2+8f8BwIRe1JRvF37B
+dnbvTg/dzoi1/E4ukwVJD6YE2LlDwzdGno9KxPlRsuY3nnheVgjbrGJ2XKRJkIk8
+7cMGh41VKw6L4usAEQEAAYkBHwQYAQIACQUCWUwTFgIbDAAKCRC6wwYiM5mUxEiH
+CACQViGOHi0BoZ78ZJz6L48YNMx8fSdSv3YJ83Ih1n5DWCJgrDV5S3/edYinkoVI
+0Lusy3MdftRg6OWaYOuOTf6MYcddO/mY363jiMByf9Uh3Dqq4sKqVLRnZbAqgD1o
+dRoj2NkEQfgEH/H4JRVrxquzAKoWwJh3MhY+kajYJRJyWfc1/Bm3Bj1tcMGlGeIQ
+fgWheeMg3kxrxJ9TXPqVi6VVPaPKIU5i8l46S+Wg3uvMs8vC3XzOIvhY6cwguJv9
+UkjZwGDSI952wLqnREMy0gFZ+OAB0qJpYM3nDEekWZP38G80kojnN61tZjRThu9I
+i8/b+PwSW+nW3EpQZdLqZtOU
+=2H2i
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BAC30622339994C4
+sub    FC9BDC25FB378008
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFlMExYBCACmdTDSXPwSJeYbfYvHoDl5C7vx/0+LOTunDGJN38pNQHYQAZnv
+Gyoc9ZmChrhLoim7z4ILqmNo8eegknepQ3dGdUij4NVIhR+m+8irayTbsNHvo3UG
+9y7eM5tTSjyNYkyk5fAVuT7OhzIzMA+qtc3GRVxNYRKnaHajt+pOSqr+uoDtMG3n
+6eAMHCAnhgh5Nd+dCFcNT+syl3zCwolA1wrzGxxOaif+xi5wwXjmF/lAt4PDIuDT
+etA2/AqPM4zAC0BtC0iqVgVypjFV3EAexm/g0LNMiG/M/krzwjPq5gf1DY/57jU0
+02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG5AQ0EWUwTFgEIANmMpV3N
+K8aLrLgQTyh5++det8C3D3T5tkEdljHOuN31/qdKNge8H6uKH8zXRZsj5pd8adpW
+kD4TzIMvzIwzizsGw34O9hf1E2XPoDqvQr39p1sovX3PeDvRJY/7JFNt9DsphVc3
+xWQfNkC7JdMPa6JRiFHd3ynfbQ+wplf4tfaDVn1JXAWp0NSGgMtXfn5i19hHQWjm
+RNAKNQLdVn8UczI8XdVM7bS4giDpQMukSyjsjgAo466iRK2+8f8BwIRe1JRvF37B
+dnbvTg/dzoi1/E4ukwVJD6YE2LlDwzdGno9KxPlRsuY3nnheVgjbrGJ2XKRJkIk8
+7cMGh41VKw6L4usAEQEAAYkBHwQYAQIACQUCWUwTFgIbDAAKCRC6wwYiM5mUxEiH
+CACQViGOHi0BoZ78ZJz6L48YNMx8fSdSv3YJ83Ih1n5DWCJgrDV5S3/edYinkoVI
+0Lusy3MdftRg6OWaYOuOTf6MYcddO/mY363jiMByf9Uh3Dqq4sKqVLRnZbAqgD1o
+dRoj2NkEQfgEH/H4JRVrxquzAKoWwJh3MhY+kajYJRJyWfc1/Bm3Bj1tcMGlGeIQ
+fgWheeMg3kxrxJ9TXPqVi6VVPaPKIU5i8l46S+Wg3uvMs8vC3XzOIvhY6cwguJv9
+UkjZwGDSI952wLqnREMy0gFZ+OAB0qJpYM3nDEekWZP38G80kojnN61tZjRThu9I
+i8/b+PwSW+nW3EpQZdLqZtOU
+=2H2i
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFLmWO0BCADfxkkFnwj5uOALP07g8yArQpu6zbNr+5dtDvJe8Y51V1leb74U
+Eh4U1IeosCRdKUCg0XlAjDmjrUkG6W/5AMUZM676JVHL5tVG1F+dsKhCrFOZoMHj
++oLOMT7+159maGVlTbp+CarWjp9HWguCVYYAgmP96EZVILG+U7iFzLveEDHmWHyP
+QgZeJPbiiZPEPVDYll821zajCsPj6qse050IIiKfsyveCk4j/eEm2EtBDbQeI8Ul
+Y47TRSBvrtUaUUFe9P6uNoNQmbasyFdD/2yKCoZHCMhAdP4QydflybQdDrF9p7UF
+kCRk+uVIyxXDSn/XMHNhYG09+sy2CoQynF43ABEBAAG5AQ0EUuZY7QEIANFoey9+
+gIJ+VBKDYOZIK5t7s0J3fmgYasBt+uOycrZ/UmZfj3I502i4nYVtjwdWJZFp0LLh
+4G+Ba7uLNdTYEiSOEowjcxyBr2tvck98wDGCKkLkiesrg0IUM56ZGBqUvc+hale+
+bKoTV3+HwWfh8Iu+pRPHlNRUGpLTnAwatQf13sJukfRD8vXKdj4em9CtMjbTbsVB
+LdJXNPRzZV75zfH1DOGHTxvHYKDRsVKUmMZn4JE+gJ555dIYxygjYoB6V5oQVIy6
+hud39dhhqmPeCQDY1bUu4VJQBVJZh6WM5+1mquc6SOtJ9CWJ4zOk7hUbWstalOkn
+ipAzIIMXD411+PsAEQEAAYkBHwQYAQIACQUCUuZY7QIbDAAKCRBBMhSQdYqtbwGW
+CACM8r3Zmvr1PZvL632ezNg/GuFHc5d4S2JoEEeWeg8qTLATnOudL4utBDGs1ZQ0
+F2bbLxO9Dfnn5DuxzBCh4OUmtQu7QWzSqZCAd6LCF2hVU/9Fy7NTwAO9JKaTYqSk
+Uvca2gRFe59T/bYYrYboHIKoJ3gTQ0vTe5xq6yY2JAI+wvE8bihwdGNwJYlGdFFP
+ezkslvqAxZYeyFbkzT4eHmAsLKGwZl9ZTWVpgt9fR0fwEgzhLfA2UnSbblq8LUVZ
+naKwZ7gI5HE+7kWpKXaREkwC2H440y0JTKU/631O8qK+faFPepy6bSfej655yJNd
+D7OBDjgf/LLAP43w0BlWOGSG
+=nS+A
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFLmWO0BCADfxkkFnwj5uOALP07g8yArQpu6zbNr+5dtDvJe8Y51V1leb74U
+Eh4U1IeosCRdKUCg0XlAjDmjrUkG6W/5AMUZM676JVHL5tVG1F+dsKhCrFOZoMHj
++oLOMT7+159maGVlTbp+CarWjp9HWguCVYYAgmP96EZVILG+U7iFzLveEDHmWHyP
+QgZeJPbiiZPEPVDYll821zajCsPj6qse050IIiKfsyveCk4j/eEm2EtBDbQeI8Ul
+Y47TRSBvrtUaUUFe9P6uNoNQmbasyFdD/2yKCoZHCMhAdP4QydflybQdDrF9p7UF
+kCRk+uVIyxXDSn/XMHNhYG09+sy2CoQynF43ABEBAAG5AQ0EUuZY7QEIANFoey9+
+gIJ+VBKDYOZIK5t7s0J3fmgYasBt+uOycrZ/UmZfj3I502i4nYVtjwdWJZFp0LLh
+4G+Ba7uLNdTYEiSOEowjcxyBr2tvck98wDGCKkLkiesrg0IUM56ZGBqUvc+hale+
+bKoTV3+HwWfh8Iu+pRPHlNRUGpLTnAwatQf13sJukfRD8vXKdj4em9CtMjbTbsVB
+LdJXNPRzZV75zfH1DOGHTxvHYKDRsVKUmMZn4JE+gJ555dIYxygjYoB6V5oQVIy6
+hud39dhhqmPeCQDY1bUu4VJQBVJZh6WM5+1mquc6SOtJ9CWJ4zOk7hUbWstalOkn
+ipAzIIMXD411+PsAEQEAAYkBHwQYAQIACQUCUuZY7QIbDAAKCRBBMhSQdYqtbwGW
+CACM8r3Zmvr1PZvL632ezNg/GuFHc5d4S2JoEEeWeg8qTLATnOudL4utBDGs1ZQ0
+F2bbLxO9Dfnn5DuxzBCh4OUmtQu7QWzSqZCAd6LCF2hVU/9Fy7NTwAO9JKaTYqSk
+Uvca2gRFe59T/bYYrYboHIKoJ3gTQ0vTe5xq6yY2JAI+wvE8bihwdGNwJYlGdFFP
+ezkslvqAxZYeyFbkzT4eHmAsLKGwZl9ZTWVpgt9fR0fwEgzhLfA2UnSbblq8LUVZ
+naKwZ7gI5HE+7kWpKXaREkwC2H440y0JTKU/631O8qK+faFPepy6bSfej655yJNd
+D7OBDjgf/LLAP43w0BlWOGSG
+=nS+A
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFLmWO0BCADfxkkFnwj5uOALP07g8yArQpu6zbNr+5dtDvJe8Y51V1leb74U
+Eh4U1IeosCRdKUCg0XlAjDmjrUkG6W/5AMUZM676JVHL5tVG1F+dsKhCrFOZoMHj
++oLOMT7+159maGVlTbp+CarWjp9HWguCVYYAgmP96EZVILG+U7iFzLveEDHmWHyP
+QgZeJPbiiZPEPVDYll821zajCsPj6qse050IIiKfsyveCk4j/eEm2EtBDbQeI8Ul
+Y47TRSBvrtUaUUFe9P6uNoNQmbasyFdD/2yKCoZHCMhAdP4QydflybQdDrF9p7UF
+kCRk+uVIyxXDSn/XMHNhYG09+sy2CoQynF43ABEBAAG5AQ0EUuZY7QEIANFoey9+
+gIJ+VBKDYOZIK5t7s0J3fmgYasBt+uOycrZ/UmZfj3I502i4nYVtjwdWJZFp0LLh
+4G+Ba7uLNdTYEiSOEowjcxyBr2tvck98wDGCKkLkiesrg0IUM56ZGBqUvc+hale+
+bKoTV3+HwWfh8Iu+pRPHlNRUGpLTnAwatQf13sJukfRD8vXKdj4em9CtMjbTbsVB
+LdJXNPRzZV75zfH1DOGHTxvHYKDRsVKUmMZn4JE+gJ555dIYxygjYoB6V5oQVIy6
+hud39dhhqmPeCQDY1bUu4VJQBVJZh6WM5+1mquc6SOtJ9CWJ4zOk7hUbWstalOkn
+ipAzIIMXD411+PsAEQEAAYkBHwQYAQIACQUCUuZY7QIbDAAKCRBBMhSQdYqtbwGW
+CACM8r3Zmvr1PZvL632ezNg/GuFHc5d4S2JoEEeWeg8qTLATnOudL4utBDGs1ZQ0
+F2bbLxO9Dfnn5DuxzBCh4OUmtQu7QWzSqZCAd6LCF2hVU/9Fy7NTwAO9JKaTYqSk
+Uvca2gRFe59T/bYYrYboHIKoJ3gTQ0vTe5xq6yY2JAI+wvE8bihwdGNwJYlGdFFP
+ezkslvqAxZYeyFbkzT4eHmAsLKGwZl9ZTWVpgt9fR0fwEgzhLfA2UnSbblq8LUVZ
+naKwZ7gI5HE+7kWpKXaREkwC2H440y0JTKU/631O8qK+faFPepy6bSfej655yJNd
+D7OBDjgf/LLAP43w0BlWOGSG
+=nS+A
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFLmWO0BCADfxkkFnwj5uOALP07g8yArQpu6zbNr+5dtDvJe8Y51V1leb74U
+Eh4U1IeosCRdKUCg0XlAjDmjrUkG6W/5AMUZM676JVHL5tVG1F+dsKhCrFOZoMHj
++oLOMT7+159maGVlTbp+CarWjp9HWguCVYYAgmP96EZVILG+U7iFzLveEDHmWHyP
+QgZeJPbiiZPEPVDYll821zajCsPj6qse050IIiKfsyveCk4j/eEm2EtBDbQeI8Ul
+Y47TRSBvrtUaUUFe9P6uNoNQmbasyFdD/2yKCoZHCMhAdP4QydflybQdDrF9p7UF
+kCRk+uVIyxXDSn/XMHNhYG09+sy2CoQynF43ABEBAAG5AQ0EUuZY7QEIANFoey9+
+gIJ+VBKDYOZIK5t7s0J3fmgYasBt+uOycrZ/UmZfj3I502i4nYVtjwdWJZFp0LLh
+4G+Ba7uLNdTYEiSOEowjcxyBr2tvck98wDGCKkLkiesrg0IUM56ZGBqUvc+hale+
+bKoTV3+HwWfh8Iu+pRPHlNRUGpLTnAwatQf13sJukfRD8vXKdj4em9CtMjbTbsVB
+LdJXNPRzZV75zfH1DOGHTxvHYKDRsVKUmMZn4JE+gJ555dIYxygjYoB6V5oQVIy6
+hud39dhhqmPeCQDY1bUu4VJQBVJZh6WM5+1mquc6SOtJ9CWJ4zOk7hUbWstalOkn
+ipAzIIMXD411+PsAEQEAAYkBHwQYAQIACQUCUuZY7QIbDAAKCRBBMhSQdYqtbwGW
+CACM8r3Zmvr1PZvL632ezNg/GuFHc5d4S2JoEEeWeg8qTLATnOudL4utBDGs1ZQ0
+F2bbLxO9Dfnn5DuxzBCh4OUmtQu7QWzSqZCAd6LCF2hVU/9Fy7NTwAO9JKaTYqSk
+Uvca2gRFe59T/bYYrYboHIKoJ3gTQ0vTe5xq6yY2JAI+wvE8bihwdGNwJYlGdFFP
+ezkslvqAxZYeyFbkzT4eHmAsLKGwZl9ZTWVpgt9fR0fwEgzhLfA2UnSbblq8LUVZ
+naKwZ7gI5HE+7kWpKXaREkwC2H440y0JTKU/631O8qK+faFPepy6bSfej655yJNd
+D7OBDjgf/LLAP43w0BlWOGSG
+=nS+A
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+uid    Groovy Operator (Groovy Language Continuous Integration Server) <[email protected]>
+
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ZIY=
+=83HN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFLmWO0BCADfxkkFnwj5uOALP07g8yArQpu6zbNr+5dtDvJe8Y51V1leb74U
+Eh4U1IeosCRdKUCg0XlAjDmjrUkG6W/5AMUZM676JVHL5tVG1F+dsKhCrFOZoMHj
++oLOMT7+159maGVlTbp+CarWjp9HWguCVYYAgmP96EZVILG+U7iFzLveEDHmWHyP
+QgZeJPbiiZPEPVDYll821zajCsPj6qse050IIiKfsyveCk4j/eEm2EtBDbQeI8Ul
+Y47TRSBvrtUaUUFe9P6uNoNQmbasyFdD/2yKCoZHCMhAdP4QydflybQdDrF9p7UF
+kCRk+uVIyxXDSn/XMHNhYG09+sy2CoQynF43ABEBAAG5AQ0EUuZY7QEIANFoey9+
+gIJ+VBKDYOZIK5t7s0J3fmgYasBt+uOycrZ/UmZfj3I502i4nYVtjwdWJZFp0LLh
+4G+Ba7uLNdTYEiSOEowjcxyBr2tvck98wDGCKkLkiesrg0IUM56ZGBqUvc+hale+
+bKoTV3+HwWfh8Iu+pRPHlNRUGpLTnAwatQf13sJukfRD8vXKdj4em9CtMjbTbsVB
+LdJXNPRzZV75zfH1DOGHTxvHYKDRsVKUmMZn4JE+gJ555dIYxygjYoB6V5oQVIy6
+hud39dhhqmPeCQDY1bUu4VJQBVJZh6WM5+1mquc6SOtJ9CWJ4zOk7hUbWstalOkn
+ipAzIIMXD411+PsAEQEAAYkBHwQYAQIACQUCUuZY7QIbDAAKCRBBMhSQdYqtbwGW
+CACM8r3Zmvr1PZvL632ezNg/GuFHc5d4S2JoEEeWeg8qTLATnOudL4utBDGs1ZQ0
+F2bbLxO9Dfnn5DuxzBCh4OUmtQu7QWzSqZCAd6LCF2hVU/9Fy7NTwAO9JKaTYqSk
+Uvca2gRFe59T/bYYrYboHIKoJ3gTQ0vTe5xq6yY2JAI+wvE8bihwdGNwJYlGdFFP
+ezkslvqAxZYeyFbkzT4eHmAsLKGwZl9ZTWVpgt9fR0fwEgzhLfA2UnSbblq8LUVZ
+naKwZ7gI5HE+7kWpKXaREkwC2H440y0JTKU/631O8qK+faFPepy6bSfej655yJNd
+D7OBDjgf/LLAP43w0BlWOGSG
+=nS+A
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+uid    Groovy Operator (Groovy Language Continuous Integration Server) <[email protected]>
+
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ZIY=
+=83HN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BFFC9B54721244AD
+sub    788E173C196BC673
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBFRRGVMBDADAQcmG+x0mHZwJ3uKgODjUZXkGRkuz7aP/qRmuQVn93tl8DmA1
+lgvXndvChUjzYt4DJnQhRsapAXEmP5/YYIkWOzuk9EpXGtqUieocylvNXP9eDF9y
+4mRbGbCUmz5W6Y/3w7wIsrz4kbCC5xij7cavCxxSGGg1IsyDHYkOMpcQyZH41vXJ
+IPMyDvkJUON2/YA+xPph4XkmNA+hJZ1fEa+06Cd5P4j8GeTnpibkkgzqzjuiUlo1
+PcXMXUzkGnf5IwMQOdDYbmDC0K+QUKEPheWY6NsmTdZTuyEdD7BunWA++mUlrqZW
+n81HMNijG9fQbipvuGiOn7OfmVF1eqfH+NtP9csBCjn84ZMUHHArzsWgb9LWpoki
++vQyc2K+egdykeDJG3hFZ0Ztbz1YPQAUy8BN3r/OmKuSwJ33cleugxyDe123kyUX
+KhBdGEY9pTZ8dbBKn6PfA51XvuWQSVPJRjG3bPFphLPDYNJr/MUuYqo3TSTSp1O9
+EGUz6yVG/S01tJ0AEQEAAbkBjQRUURlTAQwA5QjPD3Y6kiGacT7lXdhYYN1m0iHV
+ddk6NpERbQn7NAncLI8yx2kWCtF2bBYujv/plSfMKZmKSR2VUx3NXwmG4QD0Wr0G
+AjhS81jrmAjEEs6Kf0fvihJn5Z5fJAyDB0BMYARhCPtQBmZ5g/mLQWqPEj00kaXc
+vZyPaMwOvkFpNowItAdj+oxt9v2DS0zYSNQoRtF8WkX8GeU5j5yL8l3+dgu9CKlS
+CM+DqnbpMDiXDdDpc56Ca5jSuI85+c0TYo6ZIvn/34nmWMD5dIMQ2504Qr+Cuc9g
+u3zIJL9Op5TPpDKLMhiF+Pdes51unoFMnuLKMmbPWtIAIXkphd1QkVTnhr/yiqh6
+gGyGD3520FLTqR+Aq44CUUINWN2nBTbgrAaE42B0PRGVjtmTqoYJBziig0Fbqt+m
+BPwvT5+qRlX9fttcV4Nkhgan7JNH2B7xL07mWXAOifoGmkAeCH5y5TKvxJOCGTw0
+17NN05RCsQTHsL+0OhjU32hvhRGrbQTNq17nABEBAAGJAaUEGAECAA8CGwwFAlRR
+G/8FCQHhNh4ACgkQv/ybVHISRK1gaAv+Lg3GF1LFbHQlT0DiF8cAJ7f0VTiEgpKR
+SHh1SJ9mwPJYM+60HNHr2/i6+8aMML6VVy8goOvYzSW9BPgTY7wPF5HJ6k09kzDP
++R/tG74XjrZNFwZfRQ9rAeAlMVYXpPcUfo2FpM8tvR8HKAvJJNZfPGEtVkIJnJSz
+pZcqLX7ScOdKyWu+byo7+UoINF0vWvHorWHps0iMNDtrCL1QiNWxGMYH0+vK+a0C
+zGM/C2JllP8hzLc8anJjjtcF2xIZGL/roQnal6g2+OlKmtXSgdDwGOzEFPIjMHU2
+CvsjRPX2RbdzKOjIo/4ybjKtbvrbiXPfUORyb/aQ8PHHAZXaQ6yU1LRTCI+qA+gu
+sFCtKpk7RvXQdo6sIcrpqvLfAAWL7SB6zV0rtIFqPHh09NlLJ3LIl+2UK43Sa7gT
+j88XfFZYef0bm+IZjSGmEaZVEiXHB79AXyD3DZDhHX8fmcJIvvaZt+6V34ZOaKIG
+RATW8oAGjGserAKr1rvL3gGRF8LiRmBx
+=oggK
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BFFC9B54721244AD
+sub    788E173C196BC673
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBFRRGVMBDADAQcmG+x0mHZwJ3uKgODjUZXkGRkuz7aP/qRmuQVn93tl8DmA1
+lgvXndvChUjzYt4DJnQhRsapAXEmP5/YYIkWOzuk9EpXGtqUieocylvNXP9eDF9y
+4mRbGbCUmz5W6Y/3w7wIsrz4kbCC5xij7cavCxxSGGg1IsyDHYkOMpcQyZH41vXJ
+IPMyDvkJUON2/YA+xPph4XkmNA+hJZ1fEa+06Cd5P4j8GeTnpibkkgzqzjuiUlo1
+PcXMXUzkGnf5IwMQOdDYbmDC0K+QUKEPheWY6NsmTdZTuyEdD7BunWA++mUlrqZW
+n81HMNijG9fQbipvuGiOn7OfmVF1eqfH+NtP9csBCjn84ZMUHHArzsWgb9LWpoki
++vQyc2K+egdykeDJG3hFZ0Ztbz1YPQAUy8BN3r/OmKuSwJ33cleugxyDe123kyUX
+KhBdGEY9pTZ8dbBKn6PfA51XvuWQSVPJRjG3bPFphLPDYNJr/MUuYqo3TSTSp1O9
+EGUz6yVG/S01tJ0AEQEAAbkBjQRUURlTAQwA5QjPD3Y6kiGacT7lXdhYYN1m0iHV
+ddk6NpERbQn7NAncLI8yx2kWCtF2bBYujv/plSfMKZmKSR2VUx3NXwmG4QD0Wr0G
+AjhS81jrmAjEEs6Kf0fvihJn5Z5fJAyDB0BMYARhCPtQBmZ5g/mLQWqPEj00kaXc
+vZyPaMwOvkFpNowItAdj+oxt9v2DS0zYSNQoRtF8WkX8GeU5j5yL8l3+dgu9CKlS
+CM+DqnbpMDiXDdDpc56Ca5jSuI85+c0TYo6ZIvn/34nmWMD5dIMQ2504Qr+Cuc9g
+u3zIJL9Op5TPpDKLMhiF+Pdes51unoFMnuLKMmbPWtIAIXkphd1QkVTnhr/yiqh6
+gGyGD3520FLTqR+Aq44CUUINWN2nBTbgrAaE42B0PRGVjtmTqoYJBziig0Fbqt+m
+BPwvT5+qRlX9fttcV4Nkhgan7JNH2B7xL07mWXAOifoGmkAeCH5y5TKvxJOCGTw0
+17NN05RCsQTHsL+0OhjU32hvhRGrbQTNq17nABEBAAGJAaUEGAECAA8CGwwFAlRR
+G/8FCQHhNh4ACgkQv/ybVHISRK1gaAv+Lg3GF1LFbHQlT0DiF8cAJ7f0VTiEgpKR
+SHh1SJ9mwPJYM+60HNHr2/i6+8aMML6VVy8goOvYzSW9BPgTY7wPF5HJ6k09kzDP
++R/tG74XjrZNFwZfRQ9rAeAlMVYXpPcUfo2FpM8tvR8HKAvJJNZfPGEtVkIJnJSz
+pZcqLX7ScOdKyWu+byo7+UoINF0vWvHorWHps0iMNDtrCL1QiNWxGMYH0+vK+a0C
+zGM/C2JllP8hzLc8anJjjtcF2xIZGL/roQnal6g2+OlKmtXSgdDwGOzEFPIjMHU2
+CvsjRPX2RbdzKOjIo/4ybjKtbvrbiXPfUORyb/aQ8PHHAZXaQ6yU1LRTCI+qA+gu
+sFCtKpk7RvXQdo6sIcrpqvLfAAWL7SB6zV0rtIFqPHh09NlLJ3LIl+2UK43Sa7gT
+j88XfFZYef0bm+IZjSGmEaZVEiXHB79AXyD3DZDhHX8fmcJIvvaZt+6V34ZOaKIG
+RATW8oAGjGserAKr1rvL3gGRF8LiRmBx
+=oggK
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D5F4C07A434AB3DA
+uid    Egor Andreevici (My key) <[email protected]>
+
+sub    9D49CFE20A7A3EE7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBF7rvIMBEACkH8bOlnIXAH9nQYFcihkcJvv73pw66YMz4aMPJe5PzaJU6kkV
+2lbEgEOnfoFLqgnJVY/KsPf00BXaP5uMzqNfJTK+HO9I7m3BTqmjLBgUegQig4K/
+YSwCCgVWsMDflTe+kXbgcwMAT5GwZR42GTvQuLkPHe6RALcQtrC+A3ER1ZWeBAdT
+j77UqYvaNLS5joYr5UcSTdnPPAE5hjWpOPDyj8exVlKqi9tj5lrjZSeXUa+OGTpo
+Uy46rlwx+mKD3/ARweab/NmyNtsXLA2rG5Z+M9lgrEvleJsJrxmEx702kIV9ZSTK
+e9AqM3TzALa70JyR1NoUlR4z7jaSDONqhm7b+mAj0wz/OMZXrSFQWa8Lm5ILCczj
+QXRWA1IxqwnhgzvrrqUhj2TlhmoEkGWWXrggEKdInKLsXmiLkbV07zl5wSkYXOuC
+/yalFVCz0kz5dV5rwoo7umCVg47HWSBrLxrGRfpQ67sl9Og4Q8r8MXAQvXPwmAMH
+566rGOvyv88ZLgPkdiX5YF/dwDIIv5vZA/7baIJvnn+jljHSyfHBM3z31JXln8bG
+ZYdtGAaIcHpThu1dyfYkUuoyHC13gU8A+Nw8b6MYoJH/1UR4bkrq+7Q38nbEaqS6
+6q9+MjRUVEu5Z676wg6ANCdEsMNwA+X4HuiRnh00insUXtDeMivtTtuK3QARAQAB
+tCxFZ29yIEFuZHJlZXZpY2kgKE15IGtleSkgPGVnb3JAc3F1YXJldXAuY29tPokC
+VAQTAQgAPhYhBK+isYI/wCG/0IwhH9X0wHpDSrPaBQJe67yDAhsDBQkSzAMABQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJENX0wHpDSrPavSMP/08Esg0IgGDmvnK3
+7c5gqhOZFo3C/+fAXl7U7HHpRO1rfROCn5+MqUQyKqLJ4vHddMWIZin9qTykaoWo
+AZOF1w3ma7KuQavjHDQDD4DcAy59501hT1xtyOUjuHaggvOxyZLBKQoET0vrbx2x
+KUEgg0wjxiL3ID6FKF0o/TEcs54gGE3kW0Jqy+VkIneg1mRQBpB4cFMxKcBgMsFk
+W3pqXybfdgAmxRlXLWwEWTthhC7SmqszqCMBLiug8FTo5FsCMUdt/lkeh0diJ5g5
+j25VEUut1WNnHu2YtlgUEYbmCgD8kM540He/WSwvlTkXEVOASnterZrq6t4ynFqd
+crI54Gt+O9ssdN9NqrLvQ8ehNiWOu+j4pXqLaNqtxPwCuuZ+byyKNYP5D8Lifn7U
+3rzEhLrRF0QKUbxagvzI4XzF6/sOMUBJQLM4xuvJVH1oKFeA2kRBUewu9cjR8mxt
+GQXGMya9y4xRUTDXk/aBJUBHXS2nrYR/d5zzx5nABVy2d5Cq66gm55ZzYr2geUd6
+pR2u0HJVOAsvVTMRq0K/uaQyUMrJp465GgfHWtL4otXtx/X7doVLJxwnzQH3emFP
+Kjb0VSxDt2WYP4nPyYwrfr+rEF8xvgiY//Rr6Vz8xJzuFVaRBdzRPe421hmQiFkt
+KEgmApPYFt/2gLg7wE+jv4H8cmq8uQINBF7rvIMBEADIIMrQOZzWqtaCtAqiPC1A
+ocG2s+1dl+t7Vnn9GJrBcpAtXq6Nu9qZCmtuZJtrC3RK++f/QHfHsdroVgZM2w77
+Dz6bMgOFUX99twqV/LUGu43uaPLySqTCiyezzZ8gWr1AWy791TbfQAhW7uQyOZxs
+2LnjvkZOG1FK1bilYeLre8ebOqpNpiKufNodbXCch7bk1lGs111NroUuBqC35Or/
+hpl39IzvrY30rzmlBpwXSs2yL7CyKhGnIh1RjGwCPduA2Q+nYLgNbgkSBUYVCeNV
+4mBbX0T5O/r7Wwht0j7+o+ow23GwaiZ+s8aoc2X7+boGGq75+9ApkA+Rp8qeIL8K
+bO9ujlBxYmLkb5F4gO0farqeBon4irD1XDwQfHL70BKPpVH7dr+91eWtXfHojiub
+NtKDK1gaBmMNyjZf1H5gsi5BAPZaAUsBsXLtX8nZ4NowQfllSqQzOU3ToXG0kzXd
+knk0xaD82CkkkU+7huKwZ9n8WBTE876ci2xlg43JyZwkWdrlWzkfKQ6ErVDSGQyL
+dJCpCJli+jvaLJVdCDKGqB+1zz/F67Hbf3rk8Lx73iFC4NZ8oMi0DLrf3jG8+Lpo
+mYXXPAcwKLUfAtp+IaAwqbibT43+ItSTOH9GTx3ZU7DXSEFCeia/9ZZ1wZHhwbCW
+g45usqryT2ccsFkldWeLRwARAQABiQI8BBgBCAAmFiEEr6Kxgj/AIb/QjCEf1fTA
+ekNKs9oFAl7rvIMCGwwFCRLMAwAACgkQ1fTAekNKs9pwjhAAk8sJtMsofLG+sWn1
+pJTEUX+f9TGz9e8kcm7vlK3fnYBzY4DSCU+48S3IRf1bD2LT8tQ2JU/wtuKuoe2j
+EzPiG9yfVqK/iWivSry7gx9DZi30ZIDnCm4qUi7jnUlxQv4UuP+35A5rBloRpts0
+GnryO/4jj4HuU3mEFCjYdUGNzSIgHu0Ckiy92vv13sHUvyWWSNe28RSSpmvUGMqQ
+ANQN7II56BqvhVg3mCzC+JNoyr6f265gLjTJWCz9mRvtjG1Le50bEAXNUGJsc7WA
+ECs+Frw4vGEofBclVr5EB0XM47zfD7a8zIwa5GOFmNwDpEg3q0hOfuPaL68o2B3S
+Y8c2jkEIVrURY7Rvbx+Faqdum7OnfI8QlP7lZjmwdXDxX9L1vKyoII/MhZYh467u
+ga1z3DneMqzeI4Gv3FUd7O5hYaVNKp33wNlVX+j7gQfytPsMlTI/3Bj6pLJgkfcU
+0AVjRJX4xkGhXY9+/dcXG+Cs7ByQVvv807cjy14T0dvcKHYLtIgqmvA/WOa0gs7T
+OyMne2Exj+iQHAIUA5N8yBjKBjoSUuT19H4ATIDKshXELrJIHbq+eBEju5pXd+Ty
+jeZNazrzpvqBoxz8hZmoQyDaH8oW2PLdUVFTPrCajr7uCuqOR1sU+4Qpd3JVU2Ng
+Umx6zyOUi5AfW8LWHwPYuk2dkLY=
+=KXp1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    88BB19A33A18445F
+sub    FF59C22B07640A16
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE//SjoBCADao3lh/I96fWIY2ZU49ljtHR4Vnzmifm3URFNuv/c8McWGxxCy
+Y1+oolgVuJcy4hCqcgbkwTiAfBhjZSmsC1QK/2Vs1awFzGccPcgTBakFw/TUav12
+6Zb8y72dH0VxxcN/HUGBUOSgZg9IMe7AmmVnxbJ2ED1I3/opkC6ElPXFOl8EJdgE
+Wvinp4ok3mwBGMIexQDyEN4DviuqvmB4K+gYCjS33HtHh4OrkXkCO5pDNUDgkAZK
+1uG3GfmxGBjdG6nPWgIuDMEL3j1cW9r5D6I5obXsFlg6bX8mBs91jAtmfTNv+IAB
+bwUOAJC+9C3ZEIsZOcBSSdUIXmuRPa51oP9nABEBAAG5AQ0ET/9KOgEIAOokxMbt
+TY2zLvdAWD9xPHj1kZPThN7o52A9Atw0zKjiNFl9jy+IFarPNdbMzwooQWgx5Y3S
+bKdSCSDlP74psEMOttEdw/23wt3oG70I84RveLuTs+dTDRAd5w8jxLXhjm+QxhiE
++z+peVhfe//u1+kn2vzesXMIRBdQTikjIZ3W5TMgu+RV7Fgf5zUWTEUTns1kmM99
+XPhOVh5BIr1kkty/Fyg/1Wg87leM3WZUoe/7bnWju+YSgjWvxwv8HEBYPKciNG5n
+0oOPoU3jkyEugJafmlhAt3CAgmFbfrJgkncXPvow2xK312iy0xIslAqm0dy2+E9j
+hYLlS3p3J8TLPGkAEQEAAYkBHwQYAQIACQUCT/9KOgIbDAAKCRCIuxmjOhhEX5s3
+B/sFcywEwoA4ylzSSsVctp7pjDczczlD1MnvCNP9ldzzU2oOGAduvF+zzJNL162J
+qMd1TMYnYROoZhIS78He+LriBSjCsweKDqEix12mtuWrAICpF3UcY8WLMB6SXgXP
+qnZS1cw+Prr+NVnuR+0G/cUJieVdKO5rcYuwrs4OGh2rEMRCksAY5FAMe1lSB4mj
+9jIGKW0B31D3/AxNlQuN1aRzGLj72k6d7Q91OrbQ1+yG12CLwSd6mS4kVBFjppUD
+JCKN+HD8NGQ9EtyiVpx2/gmqshFVdwUgAqQ4tKtFI713bi8xz/oNiHkOfclHdgMM
+E1GU2n+gEnCLRpmC3Qqmeb0n
+=2JQQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    88BB19A33A18445F
+sub    FF59C22B07640A16
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE//SjoBCADao3lh/I96fWIY2ZU49ljtHR4Vnzmifm3URFNuv/c8McWGxxCy
+Y1+oolgVuJcy4hCqcgbkwTiAfBhjZSmsC1QK/2Vs1awFzGccPcgTBakFw/TUav12
+6Zb8y72dH0VxxcN/HUGBUOSgZg9IMe7AmmVnxbJ2ED1I3/opkC6ElPXFOl8EJdgE
+Wvinp4ok3mwBGMIexQDyEN4DviuqvmB4K+gYCjS33HtHh4OrkXkCO5pDNUDgkAZK
+1uG3GfmxGBjdG6nPWgIuDMEL3j1cW9r5D6I5obXsFlg6bX8mBs91jAtmfTNv+IAB
+bwUOAJC+9C3ZEIsZOcBSSdUIXmuRPa51oP9nABEBAAG5AQ0ET/9KOgEIAOokxMbt
+TY2zLvdAWD9xPHj1kZPThN7o52A9Atw0zKjiNFl9jy+IFarPNdbMzwooQWgx5Y3S
+bKdSCSDlP74psEMOttEdw/23wt3oG70I84RveLuTs+dTDRAd5w8jxLXhjm+QxhiE
++z+peVhfe//u1+kn2vzesXMIRBdQTikjIZ3W5TMgu+RV7Fgf5zUWTEUTns1kmM99
+XPhOVh5BIr1kkty/Fyg/1Wg87leM3WZUoe/7bnWju+YSgjWvxwv8HEBYPKciNG5n
+0oOPoU3jkyEugJafmlhAt3CAgmFbfrJgkncXPvow2xK312iy0xIslAqm0dy2+E9j
+hYLlS3p3J8TLPGkAEQEAAYkBHwQYAQIACQUCT/9KOgIbDAAKCRCIuxmjOhhEX5s3
+B/sFcywEwoA4ylzSSsVctp7pjDczczlD1MnvCNP9ldzzU2oOGAduvF+zzJNL162J
+qMd1TMYnYROoZhIS78He+LriBSjCsweKDqEix12mtuWrAICpF3UcY8WLMB6SXgXP
+qnZS1cw+Prr+NVnuR+0G/cUJieVdKO5rcYuwrs4OGh2rEMRCksAY5FAMe1lSB4mj
+9jIGKW0B31D3/AxNlQuN1aRzGLj72k6d7Q91OrbQ1+yG12CLwSd6mS4kVBFjppUD
+JCKN+HD8NGQ9EtyiVpx2/gmqshFVdwUgAqQ4tKtFI713bi8xz/oNiHkOfclHdgMM
+E1GU2n+gEnCLRpmC3Qqmeb0n
+=2JQQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    62C82E50836EB3EE
+sub    2AC7BF2F3349DE80
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+egz57oSj4I+NT33hA64x6jicEKyBNxNI
+=T3Bh
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5208812E1E4A6DB0
+uid    Gradle Inc. <[email protected]>
+uid    Gradle Inc. <[email protected]>
+
+sub    33AEBC1F01C98081
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+bMFjyklLBAm1WETBiqR+k5uwXmJ8
+=RGVX
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5208812E1E4A6DB0
+uid    Gradle Inc. <[email protected]>
+uid    Gradle Inc. <[email protected]>
+
+sub    33AEBC1F01C98081
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+bMFjyklLBAm1WETBiqR+k5uwXmJ8
+=RGVX
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    571A5291E827E1C7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBE9iFawRBACJb4OMk3zqMDNvSJKYZ8fGYrPq7yCcf/ykKDkGb2dtPnAZGkSp
+3mmNlTsU6s9ARn7BtkhIuM5TdbLs+z+okX62h3F0WW3h+CpfIXyKSgl7uWbhZ5G8
+RSCCRr7A8m6y83npkTVDW6m2oFN2cjFwPLm/vxg1gu5pO+NCwz5iBRHdewCg1idO
+Gl6gBAZVNteCRMVnGnX4EhMD/RaYBO2j511h7gR+p+6BBeJTEIA1+tsi+GhTBkS9
+mUMGuD9Z8PyvwL7quGQyXJ/kTe3eB6iyDFn0oemB1w736FQe3vcIX6eePOEiDZs5
+1Uepv7bXI4wn1i3Z3kzynXNKcjCd5ZxAmML5VlQ0zWeE0W18reCjt1P5q5xxBFjw
+0L8WA/9aPi4d5VPakzuDvxfKK29BogScTLn2C3fpEnqWsTfpoWSkNXkRsoB4jUU4
+oIqRFMTxwsjUmjVUPOG+YqoeAaVpj+RBpp+V+CqgfNWpnH4caxzODE9f+6RYRCGm
+LSq/6OmgZg6t38M5XWVpvk7Ixygs6Vrd99VZyIQPJwSBM/pvAw==
+=dENk
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B16698A4ADF4D638
+sub    32784D4F004B405B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFM1v9ABCADD0KoXq2ZKlUHeIVovQy3gFmW9oFAaraV48ouv8cYvqdf+s91H
+NyqeyNPT/ihFeNqZJUAMyPdwN5xrWD6gxMrOCR7BFhA5kLmAKz4HfFCQ05ViyQdI
+/HVNFvTdF8LNnuF+a5aNgg+jjLvFwzkyMFkuiPGuUDFnqEGxC+z9J8t40tpOTOIw
+tPjSzkDN41AJDpUK/simKC5F0Im78nUbwMalE5z2IsZRWpYZyIhN1HhEdDvaDIh7
+3vENjH7enAjWh0iGRu+GTP/fayZnX0uhmausCCwMMhsr489e63ZOaJrqeC//wWrX
+dtEJjcmvRmJ2hwLmgwMP4zSNKsnLGzP0sh69ABEBAAG5AQ0EUzW/0AEIAO62SMbq
+gIzEFQEHlxNN5pZHd7msqDESILFYFkI1mxlkD0twFWMbk4nMH2VXhiuT3ulqKBOU
+UUNQrO7egtfbGsgVv4bWbUHfeZkfvoWDlmbrvi1YLlR/ZxzGpCNc8e3aOcN3XKHl
+BwfUaco6pcTBvLpKPA/TAjkTOtK4A5Azv1CSwpzSJf2bVVbrn7mi/rw78SmZAV2/
+rtiOU5a9S+3fzswLk1PO/z//d4VoCcL2s2WueVO1Q99kejkE55l3lYwEiBzVuAA9
+8Q0a5wg84vRGFZQWLIw8c20On2+dZcTLZc61ZjnsI1LSnLUUyQ/fzHQ+BynQF9l4
+3ZCPKFIl125MGikAEQEAAYkBHwQYAQIACQUCUzW/0AIbDAAKCRCxZpikrfTWOJel
+B/9vDc3G/mrIHB1P/zl0Fdl5wQzaSVc9JB/ce0018ptplL711af0ZDvWqmZkJNkY
+u0lHgnniaXB0l3GGUPIa/TZzVgFSRPj65FWTMkBbNnhGIwV5IVOPcSKSyDYn9/nQ
+PpmWl5fDj8xiv6kKYxA4hjjRbRGuUXiI2dnyFHuFpacf/Af/Mc0U/CDDuz5a1jS4
+SYuYM/HFVL93POZzwLUR/+GDuVJFnm12rmjGnJVgR0rWcJKJt6vCsBPVfIamfl6v
+G+N4TWQ9euj8Rd4hjsYPOwDfgVIUGIhpTUJ+fz046fkz9MWnX7RJh6hqLAXT7Hbc
+0FTFsKYAbLJbm3Q+rU9jTdM8
+=mDDW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C9FBAA83A8753994
+uid    Tatu Saloranta (cowtowncoder) <[email protected]>
+
+sub    AFF3E378166B1F0F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFeWvEwBCAC7oSQ7XqcGDc6YL4KAGvDVZYigcJmv0y5hWT4wv9ABP4Jhzr1H
+NDmmGyWzhzTeMxwuZnc9vhxCQRwyxj3gGI5lYPEARswbi2fWk//78/3Wk+YMHJw3
+/1EO3VqvvDUt39gbaSqMCQNHctnFdb2QYZ7nRFTQeCqG/wyMdB05beqEnWEXzjeP
+FDF9y6gXkELn0lxUm2TKO8tU3h96TCuutDKJ0aE00lOeh/MbEaGHEbIU8kdfui6U
+znZ1X80EWbkCY8cKxEZHKD0aONSVHXwE6nETvFW9/9+K+sj/I7ytlyxwHsaQpi1H
+6aRGnq013VsIECrwkhmXBsLLXNjmhER+LkcDABEBAAG0NVRhdHUgU2Fsb3JhbnRh
+IChjb3d0b3duY29kZXIpIDx0YXR1LnNhbG9yYW50YUBpa2kuZmk+iQE+BBMBAgAo
+BQJXlrxMAhsDBQkHhM4ABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRDJ+6qD
+qHU5lFtxB/0QBiKaHHdFu3GOs21+S4LZYmO0bvHASg7ueeWtoE/1cEsKqvES03Tw
+iSfMabaPt+UL4qP9w6/SUtTITAmxuc1ksyU+HwC/R1QuF+vdsguFZ0/8VdVRVY5I
+5/6Dcp7kI49RO0LxGPXCMn8s3Nj0KXiCoodMDLHwwMv5OXWrQQ4yXiQTsJudBxy5
+o2yfp0AlLm4uZdDLj7Z4u4DfyKOuKIUMsMQ2Hk12gSkDaZViIURH6MaSEdC+XbDU
+cPTq27+JSdjfYEX0908P/bH36H2kPCGVh+sXpICZ/Ce7m0OHBfE/pTTCuOlAJvcL
+Y4QbyMTlyPpZ0zFgO+jX+fj8UFi2sRhquQENBFeWvEwBCADfbjqRN1GvSf9VkjDD
+WBqX3hILiPx3DKPiSFmSsAoiLSEkP8gRDBDy6po/Oez9q+bgb9Sk+iGifJvbVNZr
+7+88LSxQECsrVL+ZgTAZ2LkqABQJ8XYh/dTO6BMJ5rSLH/YN6bO9V4NjYod67W5u
+Yox+aCp6keE7ia7eBHck2wyqxikCqvVzmAduPCkkNSRuOwLkOguduXfwb7Cg1Rna
+cMMEfDd9t+a6ytY/8JFu01G++VVxFHO3vs//RINrm0O4xKPkT1+Ocd4+h3DlhhRv
+RXvI+MKeM0ud0OpUVCBKCZqbFKTVgoRpsKC925ZRUSqbmyBcIkqyYjzD1adaZdkq
+4PLFABEBAAGJASUEGAECAA8FAleWvEwCGwwFCQeEzgAACgkQyfuqg6h1OZQ6swf/
+Vm0ndBcvdK0qCoubR/WOsynS1wdQ2rGKJC5oVsUN4YVCZhg9OMhwMSO3EOBPdxtq
+4A8bSZp/8ZWmHLohE8QHD8AgaQBtRZyNkvMRiN157XGkPEBRWdHw6XAvx/lE31W+
+19qFRnAE8BbERE3gieJcG4CKWy5CyzXnjSM+znZvDQ8J7MfG+LxKbr7zUHQH9ZWs
+k8V9D+GXDgpuyZc4ct1tNDLcn6784FubcdrD3RLMiOAYSSgKSgoELRzB8zZds+WK
+FuiAYXZSdzCbjJJ2VqnJnQtYHN7Z5r3ySqbG7w3rRen+Ett6PX9Hrvc1MTy/UUdb
+3s08C0wD0x+ZzFzqUXKTZg==
+=nsI4
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3E3D777C909A447C
+uid    Dino Oliva <[email protected]>
+
+sub    7ECD484BE871E4BC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFhV2aoBCACyHcEuTUn5nVo1ODvWvgBgV8b6Aju4cVAhMNIvAdcOYf+N9Rgo
+Y/669/P371uN2hc4SxJeORBjHyzkAX2sJZQj+FwdvGl60YX9Zv/NQaTzC1WFMRp2
+rb0QGj8yia+WA+If6hatbZmCg87CtDVpzpPIZUzX4UO+DRQEhezflt9uZ4YrFoYq
+PmbL7znqm7/3kpenKrNoinGnzFG7wnOrDfMrBrZgL0Vt95zvs/PBTyE2r4GWCNms
+PH6n50oTck5Lif0EtnIp26o9+vgkVVAFcHLUDy2y90g67j137SNnYu/47FD/rS8R
+A2Y8wRd6lXXxI/n5Wyj+P0Vai5zq6BIFPMbpABEBAAG0G0Rpbm8gT2xpdmEgPGRw
+b0Bnb29nbGUuY29tPokBOAQTAQIAIgUCWFXZqgIbAwYLCQgHAwIGFQgCCQoLBBYC
+AwECHgECF4AACgkQPj13fJCaRHwthAf/SihiHP9sr4LRSw3TW9t1CuKW2e+DwsJH
+6BY7m64jENIKF2zXWuMkHzGmM9pVO6qy/hY610wI6GqppuPESaFOVBc4sp5i6A5+
+Z70ZzXVEM+rfjS65qAbz0VdaF6cIEcZrJ25DD2DYLMq9wMAWo+EqKyiN3OJ/m/3t
+xz4WECkgpAgIPdfriJ1mmkn0fbpG1Hc7uhwtg0EfcAc2nN84AyPlBbh6RMkKDFgk
+K2/zwsdR6t93JzexVEXRN7hiNqBu9rFPbyvXy2jtoO9P60vlF3OuvM3SCqAr4yYL
+l9Vlkh5ytoZW/XPMJMOYsullzk7q2zSKIOPkx/Si7fqKz4MqZzc7zLkBDQRYVdmq
+AQgAuTKXw+m5HveJjH7uTGdkmX37rkOX7Kl6cyPutq21tbG9cGhrOplTJN9lDoK9
+7km2YOs16SGVlKTEQtJ7CLAQGRLW1qPATMlW6gJ5+KAAY1GFej+DZOLYy+RjxxdT
++gDSIXt8kQwAlETwSNgymp53TrU1dDGPMjod0AfFbawJtxp/gaI/Sb+MkzLRS+NA
+7g1fDNAsy6twjxwmL5lvCUO+JMtlG8vXlIoiP7N6hXk4PYzYFCI4JR1H4aNhIBk0
+4MoUngJj2WNXfPJYQef3DqAJrzaQpuiCdQAq6F9GgldMHyv0ujHpA2JBikcxlR1r
+dUdo2Yqnc90pd5KB6IO4TfN8twARAQABiQEfBBgBAgAJBQJYVdmqAhsMAAoJED49
+d3yQmkR8SNoH+wRfWyXUFPVDNN4UrAi5HEY/Ca10AGuREkzacZSVz4dYtofNOAxx
+RVfOAoZr1NUECNvWgyxIZ8ZkeQi8fGN8uS3becIVAWmkji8l9jDRpC3DPs/g/7wL
+4A5VGzvp4GdD6jHk7KCVPiEk1DzRajI3sAntmpTKL9LNB9LpP4NdWiFA8TPMEHIg
+SqMuv1Jzycngjd0Zr9joSJvhIU+j38FvL/F+l/ooa7TKpRv6f2eAlyls0K1V9bUh
+a9KhGsyjXqolyxHZ25Gc3VnxEKIZS6R5QrxVbnXPmd/SV6MI4fBSrcrNgR91iH9X
+r1elbwcAFltomc9/3/7xXmHMaEfaxJnY5mk=
+=geV3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A730529CA355A63E
+sub    D5A25EF82542C54A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEUQYOcRBADsCu4zTVaB4TOhV7NyTvHhG1bqN+3Va5t4vpGQJg4M4U0Yu0ut
+4bCZP8I6rlXGj+TqDKVUx9kfGpIKX6Kw2TvZUYbHIDWh3UhQO1hD4xy4b8rOak1w
+3vDAMYA5L/jsZshNHp++aTgmvSoXGS5S1xsjrbrOics6iTtHXMV9TCRelwCgkwGj
+WHzPJnlSj0z4jAlRG4ZubAkD/3LOfrXtti1oirfDTnBZcxhvldyCT2yiE3LRe8N2
+ijmtNO6fl2fqXSWuP0L125ytlOvww1r6Gd8sVXiVwt2oKZVQ+A5028BbHa0u4e3y
+54nA21OBKLCC/hJvyOkPf9/kZk6S7fV+Tour/auixX4WqUg+siMRe/EwHw6bQDD/
+1OK8A/4rVPPCDTLvcQbT+B3z0IEfryMkivJMu7dEoENDXDK7N5KginugnCpJd+g9
+GbYgTYI2YPNB6A2eaR4lH8yQCMyDXC5+bGL+1NL3SP1qR4JE//nUcbx+iMTYR5uX
+kwmaGMXRl7z47OgtaWM/dVipNuNaqkD9WkuMGb4rdSNHrI+amrkCDQRFEGEDEAgA
+pH7D8VkxWJgH5zCO7I1m2ITBf8pu/McMCvpCHR7qgQp4yvLBiQ+AXkbQPRPnxO8v
+QNlSL7wODfYI9hKDkoi5pFNlzhBI9ivehUrfdx3uMIjowZk+UMBhaiH4Ppazkw3F
+V7JhKm0rA9VX5HnujGmZjWymE+yVRJhR9dy0XQo+b4691Ve8Ce9L7j0j8BzCcCwA
+hTOtEKxBnion46KLgr0caDa89C1HG8QJCqQrN+HRbfj07Zs4HjJl2CuJY6ql/f1G
+lGxJYZT0FxfIst01dAdNFppD8JJ1I+PYErWdgkm1rQDkAZXEN7rwtihHj6A0EEqr
+s1ogkXzyXs05fJurUtI5/wAFEwf9Hqv0J5kyzSA3mVhSzSY1pOheiVP6pWWKCsZ6
+xLM90PWekAHsENvvF0mtoAAOS6HYKog5qDHJme7jr10wdalynSfgCDCzt1qm2dvX
+vEk69j7vqLmqAkKEir//1XaPlGKxA3EYjl4U8HxdqOhw/FApWRmJncezqeE+R+uD
+4pMugi7DLnVa90hlPvRNYfButXXS8p7dhuiCa5ebPxclvcW6F/mf6ZDwDSuhkddP
+Du7OD36ebmiD6RHJwsfn/uOz4sRG5ogYNqiB5OOkKO5zBVztgcmWc3ACzNCbykin
+DmNHnAaeiPWR3xTp8ZwNa0BDLGBX5RUsUhP57nhQr0ifllubsohJBBgRAgAJBQJF
+EGEDAhsMAAoJEKcwUpyjVaY+pVgAnjLQPFKg6QdrUiYYCQactc2Gx9OlAJ9r5x4Z
+Pk/ZgTDkz44EfZS63bJ2IA==
+=6Dub
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A730529CA355A63E
+sub    D5A25EF82542C54A
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEUQYOcRBADsCu4zTVaB4TOhV7NyTvHhG1bqN+3Va5t4vpGQJg4M4U0Yu0ut
+4bCZP8I6rlXGj+TqDKVUx9kfGpIKX6Kw2TvZUYbHIDWh3UhQO1hD4xy4b8rOak1w
+3vDAMYA5L/jsZshNHp++aTgmvSoXGS5S1xsjrbrOics6iTtHXMV9TCRelwCgkwGj
+WHzPJnlSj0z4jAlRG4ZubAkD/3LOfrXtti1oirfDTnBZcxhvldyCT2yiE3LRe8N2
+ijmtNO6fl2fqXSWuP0L125ytlOvww1r6Gd8sVXiVwt2oKZVQ+A5028BbHa0u4e3y
+54nA21OBKLCC/hJvyOkPf9/kZk6S7fV+Tour/auixX4WqUg+siMRe/EwHw6bQDD/
+1OK8A/4rVPPCDTLvcQbT+B3z0IEfryMkivJMu7dEoENDXDK7N5KginugnCpJd+g9
+GbYgTYI2YPNB6A2eaR4lH8yQCMyDXC5+bGL+1NL3SP1qR4JE//nUcbx+iMTYR5uX
+kwmaGMXRl7z47OgtaWM/dVipNuNaqkD9WkuMGb4rdSNHrI+amrkCDQRFEGEDEAgA
+pH7D8VkxWJgH5zCO7I1m2ITBf8pu/McMCvpCHR7qgQp4yvLBiQ+AXkbQPRPnxO8v
+QNlSL7wODfYI9hKDkoi5pFNlzhBI9ivehUrfdx3uMIjowZk+UMBhaiH4Ppazkw3F
+V7JhKm0rA9VX5HnujGmZjWymE+yVRJhR9dy0XQo+b4691Ve8Ce9L7j0j8BzCcCwA
+hTOtEKxBnion46KLgr0caDa89C1HG8QJCqQrN+HRbfj07Zs4HjJl2CuJY6ql/f1G
+lGxJYZT0FxfIst01dAdNFppD8JJ1I+PYErWdgkm1rQDkAZXEN7rwtihHj6A0EEqr
+s1ogkXzyXs05fJurUtI5/wAFEwf9Hqv0J5kyzSA3mVhSzSY1pOheiVP6pWWKCsZ6
+xLM90PWekAHsENvvF0mtoAAOS6HYKog5qDHJme7jr10wdalynSfgCDCzt1qm2dvX
+vEk69j7vqLmqAkKEir//1XaPlGKxA3EYjl4U8HxdqOhw/FApWRmJncezqeE+R+uD
+4pMugi7DLnVa90hlPvRNYfButXXS8p7dhuiCa5ebPxclvcW6F/mf6ZDwDSuhkddP
+Du7OD36ebmiD6RHJwsfn/uOz4sRG5ogYNqiB5OOkKO5zBVztgcmWc3ACzNCbykin
+DmNHnAaeiPWR3xTp8ZwNa0BDLGBX5RUsUhP57nhQr0ifllubsohJBBgRAgAJBQJF
+EGEDAhsMAAoJEKcwUpyjVaY+pVgAnjLQPFKg6QdrUiYYCQactc2Gx9OlAJ9r5x4Z
+Pk/ZgTDkz44EfZS63bJ2IA==
+=6Dub
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B7C3B43D18EAA8B7
+sub    02A4A6FB70018AD9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+xMHQYSM2kcHogpDcFph6wXxGhRjYldaB
+=VHs2
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B7C3B43D18EAA8B7
+sub    02A4A6FB70018AD9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+xMHQYSM2kcHogpDcFph6wXxGhRjYldaB
+=VHs2
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9DAADC1C9FCC82D0
+uid    Benedikt Ritter (CODE SIGNING KEY) <[email protected]>
+
+sub    923C08F9417B222D
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+uGWBaZVODvhr9hDoUpp2+qte
+=rXX9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9DAADC1C9FCC82D0
+uid    Benedikt Ritter (CODE SIGNING KEY) <[email protected]>
+
+sub    923C08F9417B222D
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+uGWBaZVODvhr9hDoUpp2+qte
+=rXX9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6A65176A0FB1CD0B
+uid    Paul King <[email protected]>
+uid    keybase.io/paulk_asert <[email protected]>
+uid    Paul King <[email protected]>
+uid    Paul King <[email protected]>
+uid    Paul King <[email protected]>
+
+sub    EA8543C570FAF804
+sub    CA890A5FA09CFD80
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Wk+k
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6A65176A0FB1CD0B
+uid    Paul King <[email protected]>
+uid    keybase.io/paulk_asert <[email protected]>
+uid    Paul King <[email protected]>
+uid    Paul King <[email protected]>
+uid    Paul King <[email protected]>
+
+sub    EA8543C570FAF804
+sub    CA890A5FA09CFD80
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Wk+k
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6A65176A0FB1CD0B
+uid    Paul King <[email protected]>
+uid    keybase.io/paulk_asert <[email protected]>
+uid    Paul King <[email protected]>
+uid    Paul King <[email protected]>
+uid    Paul King <[email protected]>
+
+sub    EA8543C570FAF804
+sub    CA890A5FA09CFD80
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Wk+k
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    8E3F0DE7AE354651
+sub    D3047B0BA4452AE1
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFMnpeABCAC+vckg+AqDG5Sg+GKbA5t2knu72aD000Qle1X//SjTvPHz0L1v
+rUNzwrqlmah17usczZHOoOCaGjSUFl3nPmBEOlLBh6L4+e2Av8PSbP0qUneaQVgi
+TQfbNgRB4v4H5dtKIglK1hZwCeqFazuRuFDWLHl/IG4ymcMwy/86y96BJKWrW+Oh
+4vK21DF/BRhyFGaIGwN1aPYRofy3ERsUfwe9WiPXXuYb3gvG++QuiS4V7UJwcAkx
+5TGukoatI4T1PVmZPk2zmeM2pHQRisHAScRt5YJ9bswgBphk1xHoENVQ3BYhzrsu
+a3hFDY5hO+UQiT+eIE38noOuKuSbRalSPelvABEBAAG5AQ0EUyel4AEIAO6MSdr4
+Sp59Gb+J8t5o5g+f4jMJPm2v7BkJzldN1JISoEWeo8iyCOVcM4D83coihMfN5Nwi
+7Tuc4tnZH00+XxYFkHMOLMPtCE7l0Ai8mVhFqE3HraCVnk7gRzNCyXeJRu+Q1TSN
+4QbiIEeonBSoGsAYafkAx1evBJtGmrDv0Y42NdocnACyRPZD0usxMARk2ZwQaqN4
+Ih5pL2MGXqMeo6uEW8iIIumnkMywXyZ0jbAcZSs9Smi3AdU8P/eY/Afpu4nyYVAU
+Sdm79eMjcBHRluvuk7db3mMzQPAepWQSYOgsbWq2BS/0rMq65M+uWo9MNpP1ZH2w
+G87qh+7nFIk38h8AEQEAAYkBJQQYAQIADwUCUyel4AIbDAUJEswDAAAKCRCOPw3n
+rjVGUXwWB/0Yq3UknzRomC9wi8sCh9Nv4erqjSP/JSoNx+rYNpwJX74jVmUA4u7p
+pzywCwSFKyE2L6pkgKw0y+KfE4cWsotlfO7E6VQQi/+cCb5OCxqf+gOelupuW4Co
+MSHKkPWXI/dhM1NMIW77+bLiiHfaOW3Wa9kBSKujiuFSp9tIq2gjTf/2rKQMbywK
+szhlBICdvYzji8t79C7tAJ0xNgZJJv0QHP+5MZJfMAARKrvtRP0I5OB1HYVJrH0v
+RbO9Y8PoYrPxeR5zQYxAyt36/DE+PM4CpEcCZ2D7Xrtk/GKe3Y/jU8FBifEebuhE
+HdZk2xusuOEx27cIovRPHwvLcgY+4u3j
+=oNWb
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    CF9F3090CE4CB752
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE7E4m4BCADCkqre+MJRRn+yBa8PqDHFIpfxOk8lQeueZTrU0Hw14wMkkOW6
+XFBb4hDeezStNNP6s2TS7bf5YRXZwqOwwgg33WYVVH4jPldaP1m+Z3GtYSLKEjTl
+G7/YqLcCtLxDdhLF3WpR7LUyZFQpIPEwRj12UyK8gU/Wy67GP3JBz/YhGTGfEaXE
+13VWM6FLvS6GJVouT4lFVqPTVv54+RKz0GdlgCB7Ht7kPtpMkz8ceKGU8+JcbAsL
+zkcicA97ZBzYEnlHFfoNI4M6EZumw8TXM+hvJBQ3SEWenhmUj5dwkympTahH+Dw/
+iam4sbZPiQH01GLiffeNNfTVlf0bvaczvvG5ABEBAAE=
+=YoaU
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A2115AE15F6B8B72
+uid    Stefan Bodewig <[email protected]>
+uid    Stefan Bodewig <[email protected]>
+uid    Stefan Bodewig <[email protected]>
+
+sub    6366592024774157
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+lwCfQHZvTM+MqMa6LB0pKeQVs1wVLeA=
+=Td5q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BAC30622339994C4
+sub    FC9BDC25FB378008
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFlMExYBCACmdTDSXPwSJeYbfYvHoDl5C7vx/0+LOTunDGJN38pNQHYQAZnv
+Gyoc9ZmChrhLoim7z4ILqmNo8eegknepQ3dGdUij4NVIhR+m+8irayTbsNHvo3UG
+9y7eM5tTSjyNYkyk5fAVuT7OhzIzMA+qtc3GRVxNYRKnaHajt+pOSqr+uoDtMG3n
+6eAMHCAnhgh5Nd+dCFcNT+syl3zCwolA1wrzGxxOaif+xi5wwXjmF/lAt4PDIuDT
+etA2/AqPM4zAC0BtC0iqVgVypjFV3EAexm/g0LNMiG/M/krzwjPq5gf1DY/57jU0
+02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG5AQ0EWUwTFgEIANmMpV3N
+K8aLrLgQTyh5++det8C3D3T5tkEdljHOuN31/qdKNge8H6uKH8zXRZsj5pd8adpW
+kD4TzIMvzIwzizsGw34O9hf1E2XPoDqvQr39p1sovX3PeDvRJY/7JFNt9DsphVc3
+xWQfNkC7JdMPa6JRiFHd3ynfbQ+wplf4tfaDVn1JXAWp0NSGgMtXfn5i19hHQWjm
+RNAKNQLdVn8UczI8XdVM7bS4giDpQMukSyjsjgAo466iRK2+8f8BwIRe1JRvF37B
+dnbvTg/dzoi1/E4ukwVJD6YE2LlDwzdGno9KxPlRsuY3nnheVgjbrGJ2XKRJkIk8
+7cMGh41VKw6L4usAEQEAAYkBHwQYAQIACQUCWUwTFgIbDAAKCRC6wwYiM5mUxEiH
+CACQViGOHi0BoZ78ZJz6L48YNMx8fSdSv3YJ83Ih1n5DWCJgrDV5S3/edYinkoVI
+0Lusy3MdftRg6OWaYOuOTf6MYcddO/mY363jiMByf9Uh3Dqq4sKqVLRnZbAqgD1o
+dRoj2NkEQfgEH/H4JRVrxquzAKoWwJh3MhY+kajYJRJyWfc1/Bm3Bj1tcMGlGeIQ
+fgWheeMg3kxrxJ9TXPqVi6VVPaPKIU5i8l46S+Wg3uvMs8vC3XzOIvhY6cwguJv9
+UkjZwGDSI952wLqnREMy0gFZ+OAB0qJpYM3nDEekWZP38G80kojnN61tZjRThu9I
+i8/b+PwSW+nW3EpQZdLqZtOU
+=2H2i
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A6ADFC93EF34893E
+uid    Tom Denley (scarytom) <[email protected]>
+
+sub    9C4C23E6FFE405BD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN
+OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr
+9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe
+d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+
+0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg
+SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG0K1RvbSBEZW5sZXkgKHNj
+YXJ5dG9tKSA8dC5kZW5sZXlAY2FudGFiLm5ldD6JATgEEwECACIFAk+xZxICGwMG
+CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEKat/JPvNIk+ysEH/iY5dP/4ERAQ
+8YC1j1XoYmMxW219uzxZfwI0ltLtPjGQlZbwlFvwjZk0nDJ6O1iZSeZQm804uRup
+gUZe3wqOp7a7z5zHab93QD/nA7O9QmLf2RC7Y0mW0EvD0tfbCzt6JJkAaxKTDA+T
+jFoukUZx2KJr0XToE6kwAnKmCgyFkzb2SUqfsBRNRBJBa6XG/1mAtDJJSM1XLChV
+Sa9nLwYjZzIcebtmtQ1vVqovO74ixxEzonLlNZi7tkc3GS23yntf5tAH0bQ9bM68
+TB9RHpLvjGgHUJtghFQN/Ny+//q1EsjRGn6Pa20cUPxnMS+WguOYIQx5jTb9ZHA0
+WBcu/V4UL8W5AQ0ET7FnEgEIAM3i3e1sjwrx2PN8XYMPQWG+/YTtw1BYDl2+iYE+
+LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXogWqKrkJ0LRjlpdKhKBvyH1ex4grh3cWN
+/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+MR3aFIsii+vadrwYYvuVYGeWvdZhB7mJ
+KYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG7Xd3tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6
+JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC9cHh5eCol11uSoWPKcQR2Ar8Eo56nxv/
+UApdu15iJ7R8cA5guKeeS4jt0CGCPs2PhuggDxI73Xvl4zsAEQEAAYkBHwQYAQIA
+CQUCT7FnEgIbDAAKCRCmrfyT7zSJPuylB/9iwtIQeexMWBmQNdDe0md8HLulDfcu
+jPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb1YCP79uF0qgswSxINYCOJx4nTPIP9BOd
+TwqfGo7ul27REgNq4lIUW0GkMgZAUA2ft/vc0u/I0PqnhKCi4Pq79hLIx7eiX2yS
+fXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA54J1qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2c
+pIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/o0co+GoYkieIxxibDCmt3BioLgmyzpGU
+sMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJEEIhZlI/ojefaZkRseFrtl3X
+=rYGl
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    840B2BF6DA8ED8C8
+uid    Phil Weaver (Software Engineer, Accessibility) <[email protected]>
+
+sub    43115D7B115DB0C0
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFSR0DQBCADw8XL+xgFg9WVPknAIqqb0sUIZ3yNNr8LkuNtwQXnwAcSJkHSt
+C1k2CIKwRPPfcLsb51l3SpxFTs/s5yhyiknDfjqP8IFtLocBSsn3kD4VRjcxFQhc
+0jjgsTr9ZP/ZAWMBRIuxaZtpe7bpqbLbV9lvqjbOnJzASLKJoUngZAXvljGrWGfM
+3+A9z7SdrilRlA4DOZNqPoxN2RNY0QOwHh8Wv7+R97K/VQoAbvN3tQxlfn5B2scf
+WL2nWoGRS6OuO9Zp5/W1twoVdf4d85FlpNFFM1xzT8f5FpjF5QRgQD/Az2XHnObn
+ukG3ZPEhgwBIwx1Uw/Y9aOceXke9vaGEsDT1ABEBAAG0Q1BoaWwgV2VhdmVyIChT
+b2Z0d2FyZSBFbmdpbmVlciwgQWNjZXNzaWJpbGl0eSkgPHB3ZWF2ZXJAZ29vZ2xl
+LmNvbT6JATgEEwECACIFAlSR0DQCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA
+AAoJEIQLK/bajtjI12QIANhe1ZrLQQvYFyDXGHS99LrT7WUzvxQdJ4xYYBRhmfqE
+6povjXvBAvYQabMQD3iBHie8xZ4PDngc/osp6SJF2wCT7LCFLr1ebCbulnL+rPDc
+y9Y6vQ1zD0NrBxsRYjTGq/1JqBd+Q7L0xMk8BK1xuZOCAUyq4CVRzSSxgTxJSQ+n
+Y4ZOL7PzBTYbdacMnqJc+2TwZKgi+CKIpOJusHa98mZSafzotNbmasKGRLPeJ+66
+Y/+Wfh6P/N2VL4nrnOrERW/XV9QNcI5VYlBUW6eYOhvpaiMeTMHNiN1VfDs1nnfH
+ICTdeZNhw0J7S544RXII59MBjOO3UklyZ6A20fiuvwG5AQ0EVJHQNAEIALIuFrzu
+8kQ/fFJ2FA51e+ULp+dy1ZYrZqJdTF5pMdZId711/zN9NExsTIxck6Vx9PYYaTre
+aquTkRIKnFD4XH/Q5MItEiiKHRtwdyhdFqCKSHaaNSGqldFwWZK2zh/x7OPk0ybn
+9L46E4+Eg9Ie+4WdyTxDKoeYQYl9asjtZPtfbNLad3UBvGAeyqc2hbePSxiNifNe
+cTJqzBpW0voJ85vTkuRa/Y3wBdkfyxRPRofAIjzwjyIXCLQQFSel0ok6aV8nToOp
+/j+HST4L+TVnY2vYDW1UWQP3y/suCp0jtz7/ygEyTie+6P/LEgLfp8LKri0jJqxi
+RUXA86tgDiy8x88AEQEAAYkBHwQYAQIACQUCVJHQNAIbDAAKCRCECyv22o7YyDOi
+B/9mnGjQdqXQ3NWMiqAliYnPEHYuNaP1UnRWrXpAHpRnQ2L0mWTHrAW/f7P6W4is
+l+oUKbURBEItgYY5f4/nIfp6TMrpD2ej91Q63gQw8KLL1x5CpKKLrv27w2SzE3ZG
+c9PYRuvW5rPqIXAdBYpznGKoowszWlRsgpw2XShuTEeiM2xLghmb2gSnU9l5wXFz
+VSa0PHvXoUIV6YeO1wym9bvRdvmAhf1AimvyOlpyk826vmI65l0OSbx30N67RaTi
+k2eHYk1uQ1WlnmgeRB1NfTANUMvaDbrFsbOliPJm3ncc9eGhJ74hzl8WGUy3SseS
+YYRhm4MK4YpKCJtCTWxKdYj9
+=zW35
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    840B2BF6DA8ED8C8
+uid    Phil Weaver (Software Engineer, Accessibility) <[email protected]>
+
+sub    43115D7B115DB0C0
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFSR0DQBCADw8XL+xgFg9WVPknAIqqb0sUIZ3yNNr8LkuNtwQXnwAcSJkHSt
+C1k2CIKwRPPfcLsb51l3SpxFTs/s5yhyiknDfjqP8IFtLocBSsn3kD4VRjcxFQhc
+0jjgsTr9ZP/ZAWMBRIuxaZtpe7bpqbLbV9lvqjbOnJzASLKJoUngZAXvljGrWGfM
+3+A9z7SdrilRlA4DOZNqPoxN2RNY0QOwHh8Wv7+R97K/VQoAbvN3tQxlfn5B2scf
+WL2nWoGRS6OuO9Zp5/W1twoVdf4d85FlpNFFM1xzT8f5FpjF5QRgQD/Az2XHnObn
+ukG3ZPEhgwBIwx1Uw/Y9aOceXke9vaGEsDT1ABEBAAG0Q1BoaWwgV2VhdmVyIChT
+b2Z0d2FyZSBFbmdpbmVlciwgQWNjZXNzaWJpbGl0eSkgPHB3ZWF2ZXJAZ29vZ2xl
+LmNvbT6JATgEEwECACIFAlSR0DQCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA
+AAoJEIQLK/bajtjI12QIANhe1ZrLQQvYFyDXGHS99LrT7WUzvxQdJ4xYYBRhmfqE
+6povjXvBAvYQabMQD3iBHie8xZ4PDngc/osp6SJF2wCT7LCFLr1ebCbulnL+rPDc
+y9Y6vQ1zD0NrBxsRYjTGq/1JqBd+Q7L0xMk8BK1xuZOCAUyq4CVRzSSxgTxJSQ+n
+Y4ZOL7PzBTYbdacMnqJc+2TwZKgi+CKIpOJusHa98mZSafzotNbmasKGRLPeJ+66
+Y/+Wfh6P/N2VL4nrnOrERW/XV9QNcI5VYlBUW6eYOhvpaiMeTMHNiN1VfDs1nnfH
+ICTdeZNhw0J7S544RXII59MBjOO3UklyZ6A20fiuvwG5AQ0EVJHQNAEIALIuFrzu
+8kQ/fFJ2FA51e+ULp+dy1ZYrZqJdTF5pMdZId711/zN9NExsTIxck6Vx9PYYaTre
+aquTkRIKnFD4XH/Q5MItEiiKHRtwdyhdFqCKSHaaNSGqldFwWZK2zh/x7OPk0ybn
+9L46E4+Eg9Ie+4WdyTxDKoeYQYl9asjtZPtfbNLad3UBvGAeyqc2hbePSxiNifNe
+cTJqzBpW0voJ85vTkuRa/Y3wBdkfyxRPRofAIjzwjyIXCLQQFSel0ok6aV8nToOp
+/j+HST4L+TVnY2vYDW1UWQP3y/suCp0jtz7/ygEyTie+6P/LEgLfp8LKri0jJqxi
+RUXA86tgDiy8x88AEQEAAYkBHwQYAQIACQUCVJHQNAIbDAAKCRCECyv22o7YyDOi
+B/9mnGjQdqXQ3NWMiqAliYnPEHYuNaP1UnRWrXpAHpRnQ2L0mWTHrAW/f7P6W4is
+l+oUKbURBEItgYY5f4/nIfp6TMrpD2ej91Q63gQw8KLL1x5CpKKLrv27w2SzE3ZG
+c9PYRuvW5rPqIXAdBYpznGKoowszWlRsgpw2XShuTEeiM2xLghmb2gSnU9l5wXFz
+VSa0PHvXoUIV6YeO1wym9bvRdvmAhf1AimvyOlpyk826vmI65l0OSbx30N67RaTi
+k2eHYk1uQ1WlnmgeRB1NfTANUMvaDbrFsbOliPJm3ncc9eGhJ74hzl8WGUy3SseS
+YYRhm4MK4YpKCJtCTWxKdYj9
+=zW35
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5796E91EE6619C69
+sub    153E7A3C2B4E5118
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=IF9r
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D7C92B70FA1C814D
+uid    Matt Sicker (Apache Software Foundation) <[email protected]>
+uid    Matthew Sicker (Signing Key) <[email protected]>
+
+sub    B4C70893B62BABE8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFMvQKsBEAC3/wuVMv4ia132SA1Y/KnuZYkSNDaRH/Ie1WTAX9X0KrWA5fx2
+WmzKfaLNyBHU5aI0BjoE9DW3zkZcLEcL/cxRzoXoavUGRhRsaHbj4PhQkEqV35L1
+OdsOPRc5vesIyvYlQsThz6LS1LRA+nOz5qW3gwfrdwuD1AWjHHluNVlgL2y2ydQI
+m4nd24LD2VssfiNXkquuJmOHZKA1EWOwDq2SSQCyx0IcQZZSF+y/pnp2JUkGoI7L
+m39XPa72sKRMBSWoRh9i4+dGZSQV/BVtD5UMOFsfTNG5Tnv2MXoql4q+C3Id9evM
+3Qglih5Nmwld5OxjxhCvUf/FEz+55pibP948GRuhXL0FATabJEkEj3XwUaSvWQpr
+4qu1qUDqfDlCSKBfJLkx8hBF6ZthGBQOZOCNTzIie96ZNEWmZu8iu4JBl/Wm+wTn
++Nkuu75wfTbHNIKPRBpuXysDtc4OvzDV51NW/6DOCJW+qLD+CI6BazdcaiWMoeFS
+irt5deDJdr9C0d8m8iD11XQAM84nTxAKaBi0ihiWYCMRpwUV8j3qxEiziFRa5h85
+3/6WiozTxLgIoJIGPoGFDisJ4WXweeT+PkTgqJ6ZlR1FPk2n7tAaPEn6/O8rdiYa
+HP0r9FhJYadPfjwAZP92JRIiv7buFz5VEq1Hqu8W85+/CeR/OLekTegkSwARAQAB
+tEBNYXR0IFNpY2tlciAoQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24pIDxtYXR0
+c2lja2VyQGFwYWNoZS5vcmc+iQJRBBMBCgA7AhsvBQsJCAcCBhUKCQgLAgQWAgMB
+Ah4BAheAFiEEdI8Vss+bqPAkFV5u18krcPocgU0FAl35lQ4CGQEACgkQ18krcPoc
+gU35ew//TbOSjL0rIy40vPDpdqLH9ulwNLnMx7xDtScYvSQOp43sBarvArtnZipo
+8IHH9fxybVEMaNlqhF/fI+E9vNTYVU9YLrz3A5z82nQlHoWzExahdAV4TnsmmQQx
+TAfp7sHqrfMckF2crZSWk+jiSlKo7BSAFDk3DHU8DPz00q7Q0TrxLQqhGjLbxvd5
+mBtgr/fD15HZdAo9uEnAnzGumuuoDc07fJzxM9tlymM7Y09Ykz+reF569synCA+u
+LIkpp3cVHoXwULZCMGg6Enu4P982BMYVBYtz9mJotyVubxs3g3bkpl+AtFakwJxE
+bXxHo29F+l+HJlte2RvGG8+5b+tLj6HWvmfpF0oRXXcvwnRZoNHPUsF74W0C4Xd0
+Uc4dCT6xdEMvnF0u4cmVaMkJ06vFKv4DGXlgZ10Xy/d1yf6EtWn8z6IrWnfctA6J
+ZC0OYhOL+fXLG9QFqxsUS/KS3JC7zDOqAWL8jQPPDu53Rm3FiUAnzgYjyLfi4pJl
+rnopzUu4VkCZOMuOwiKbvNRmZVKI8E/37UtpYtmn/wFs8e5j1SA0x6tpAX6UfMyO
+io/9k3bvourZ6sp5Mv1gskEE3NuMWZBGWlRQbNzUm8xRIdVLogjzp74nFzQ6R0gw
+/5voofA65kxYn6IKtrC/jsbkzcAKSK4axibD/n3DC34jFSXS0y2JAlQEEwEIAD4W
+IQR0jxWyz5uo8CQVXm7XyStw+hyBTQUCWrNfWwIbLwUJDSe0zgULCQgHAgYVCgkI
+CwIEFgIDAQIeAQIXgAAKCRDXyStw+hyBTfrTD/0WfE75XtR0UUAz10LZ4Eh+S7jp
+N+PxkZ4tXOaE/IqI21pLkz8Ti8oINbym9Boc03e5Y95uiluyIzPL+kRctFPx4Egm
+GBu5/tAPdKjRo7J/P396zvXlE19HXVwLG6W3ZG0q0uDjJ5BC6HjSrU/FGYpFZbRa
+EhvjHWQok8aFuTES0uyHgAmehq3DkMf02OHeqClIiiaOXorWTFhritiEjHqBGBGe
+IGM3EhxHceVW6e2rpRW22i4USxnVIcRNzmjDar9jYbU4aiHdjQKq0bb4/NNTbrkU
+X125HNj9a4hkJpelEr9mPNxB5nNs/APYX7BrrZ7BIVqUfyBjBBfjAIlsUiRLXDFY
+h6F/2duEixAFHbZkKZtv1XMNOdEiLmAo/VugYCoMxANJPc6H79WHd9+m8nwTvJuI
+p5edcj2t/bmmOns4OAJLF3puKUdX0cr7xH75ciSPHaxOR9oddM6p2mJ9368fxP1f
+qBmoHqCHC+Uqc/a4/PWdD/jOCI8XqLoIsucYeq5ZLVCq6Cv1H/CQVBu1CqK1WSwf
+c516UyCM2CXEoLUsyOVCywvHhEZgpcAKmKR8/d6zkDLd650nUng/kjm/ID/Y4S1P
+DWJLULJ5YpCTt0suLQdVPz1GHcUmF36V7QOr3P2xf7MLsB0khnEthx2uESLvzTxj
+Fm/KJJUhkJTqwAbTvIkCHAQQAQoABgUCXNxsVQAKCRCBq66oIN6eVEbDD/4hDrto
+6MsHdoX+W8y1OtTFtmr+6zwUcNCB3i+O9iYKcSX6sOMxlgtlDjdmN68PTLE+N/l0
++EAAb3snqavNietamT0RxxggD6NFOS+bMUys5yGGO7pMhMuiz3Z9iLJxETe8d5Hp
+nwdkxifQDDAMUV4Mu0Ow20IbWY/TepL4V+IxWYPEAncG6sgPeD23k5Fai72VPG6R
+ndqx8f+qQngYQOMSiUwa1kJW/2LkaTpio4wpc97LmzJIYtd9oZYmUzaUPrYh4Ft6
+gKptCcdXlOEIH69U9etZj31rtyn8hFSkIT0utYiuB3YFRbkpMzYkBH5YVhm/0z1e
+hV3J2hMgwUC/cQlIivUGaHaGS42B6OEjlAleIdkPltb2JTjvuhtgnSXNuX7yftDw
+Z6vGAm3hLRwg/3Tx/ZHss9EqT+HWLwbFTILuPfghR2K2Ol2950iHovr5LM4uH5A+
+WDIzC9TiqUKkdw3jfLHp+ocgQgbj1Hp7Mv2VSlFMeF0tilwra5yNIyYw9lkYKCbI
+ySzXwDTLz8shVOBX59Kvify8tK//kwkAqCwkbEw4NwOaoE8XfIQPzie/5Pm75dyn
+BL/99lC72LNtJKss5BC+8+AenraoNkydPa+oSEfswbYZJxYNG0b5AebFf6Pp4TyR
+CDSo9uK+SAUbuUuxwuHk6ygfogG1PMM3ypCK9okCMwQQAQoAHRYhBCnk84ET33B9
+cipu+R/pr3MRjxp8BQJc4JwlAAoJEB/pr3MRjxp8vn0P/2boa5FL1E6KvsIYrNUK
+4eMfQuKWJ3hPPEYpfZNjhxt86bjd2Lt1ADQkJdijhpncWfh+sFiqiV90rCPfoMoV
+AHrYnyj//Yl58gaPC+B5oAghdlNW607OOq+NXENoJbiMfarUz68PxRiATeNKQHy3
+bsne5i3gMPlv2HHJi6ZGHxT407JadMb39e8Ox7D4evs+kw1UwzJ0a2PFnEmr+wfe
+ufC1ME6Vbd5d5G3YjhhrpY61EAZewrY4xspBKgxsGDJiTpZHKkV6ck+klRAtup8T
+fO8PD0XlXeHiwGXzq3NxTvbrdsrhFDfQl/cgwnbgJnR3A9h/GJAJoN7/ebtvmrBl
+dNzIU/tHtbUnjrMyPqTySsEv2bm9HdNdVqyMCidnLoUW5VwGD1tf0Ku1Vqd8vNXk
+XMxQjC3bvRDXa3sMrY4kbArmCaM3x76yPUkRwv1k4nRnsNKVefECmap8uFlX68Ru
+EmqpgwM1cbLvcw0TwtWAw7b5VCHzFmLogH6VVFOCiqpI8oOIcMeiCt8QJO92QZmr
+pO0VS0g4tjGrGb3Ad0UUG684iivexYQSus+0smHOx5BcNanerBIIEi66V7cRTRgA
+7bIrOT7HwvLD/DdlV4FwIvZKNLNOP7hfuhA8VFqKK3UMOOhmS3ODGfEfevs9hcAp
+J2y/JGqdomV0xhZhRd38F4YqiF0EEhEIAB0WIQTolmUg2iTpZC4Rml8Tlx2jlHW9
+XQUCXOy2DwAKCRATlx2jlHW9XTd7AKCLFG+FXUhq8af/NPQ1OnMetctLlACfbu+u
+56pK+3FaTj8EOcocUzTELvOJAjMEEAEIAB0WIQTEe8dt8BksspRlu89HsdatDmgs
+nAUCX2jDDwAKCRBHsdatDmgsnG1dD/98bY5FYqFP6h1ysbo+AWThcnOwIxCCnl42
+75Ruj953V8JHhm9tLX67lXuXNM2YzqL8O/OjnqeQ87/zYobEU1MJK3pHEyRFJv5q
+m+hD3adLKwoZiD3mG7haNFdiTeLXtX8Ky2jnPZCMaPibb9gXbzMqKg923WVjyjWE
++JE9d4wZbgYvTPjRpKf+gAjt5xZaU7+Z7Vq1YRoWO2hIzBHI0D4IVP6EpeGEHi7N
+I1cP3wW/nIvOjLM0CqZRjsSHrzTXLc3DwVWV1VF0xiHmtpcs68U7GCcGgxJUCT97
+bNmXac+a1eZji9v5VLhjaMhF9a1nTU+1dFSwvxAjnYrmLibaeEEEnY1enq1g4Igz
+/ii94/4B9UIp4Lr5UTkngRchQLgKQQjqN3+txZeL4tAmDvYUL+1gvKmkvx3bRvc6
+WlF9ibH8Li4Gn4SU32ALKScg2krKcFn4H6VP00QgkTWhyXSrXFmpgZ9lpaBj6gKI
+HiZP8ykEiTAoJw6FFKchKd5DdcYn1HEuIDJkZlZ4gZMCSf5C1vYdZi2yi5TtewUb
+5liKKyanVBkL3q1ju5y0cRhjzF40kJ5GL2+5C4+hnZzO/I4cZXCyWKR42IWTXcRI
+PnjrJQJKJT/E3Oj5Lf23VDu/FoV+tOhMDSeKi0nXcT0yNopAQ3ee1SSth25zA3aU
+JobIazWQo4kCMwQQAQgAHRYhBFPJNYIapqdVvTN9tTWVOV6z2OG6BQJfaNL/AAoJ
+EDWVOV6z2OG68+cP/1IPhPMuV2fN26b9LX6Ndji3Er/2q/C9dLkPYXsGVHeEvTTZ
+htFLGLZuVzJN+DIeF1Omk7SpJjZpQYu7o7uyn0p3C0e40rgm8pUVRQhzKRZ5Srm4
+sI8eBzfWk/xDAU7CXMDjNmPsgmSOIITPg0rADywc+fYsVtCHKkSnTa6teknODMtO
+Ep3SYKqv0V7PnaNm/NKkOulosIUbqoEOe9066olzVyGNZ7GGT4nKcgnJr9PxgsZ2
+6B518N975KOri9bqLONtcxO3o227KgqEDakeWYsmGHAYd0X1DmYb4onhIoTUws8X
+KLtsOju+yXeF2LGosW8MKxPd41NxGVRCVpmAKtPST8D7UbuxjBiqiJQAARI1CZHZ
+ScYGN4+LhzjoBf/fPCLLblMCQx+I2HXENQRSR7lahVq7/9FlnNRAXKp7Ftvya1ON
+97rNQo+uC6m+0G5PkHezyL40LOTMHpq7DYu4OP2ZMGQcLsl165I6dim6XWm91G+q
+I0nJ8KZTc7GuHkg790P8TeocA54o6YU95y+nSTU6ztgOnLQ9y3jNQM3X7wOqdxeB
+6/wfmLgFFBcey9rRewshgqQEaAdGrW/lmk+nC6gXMiAOGrnMWJAaTChG+aICLftw
+gqXAUqH06vKv2p2NqqmMupR/zcbtMNumVe7RO5Dzvdl2ArmYnVeck0DwzW+/tDRN
+YXR0aGV3IFNpY2tlciAoU2lnbmluZyBLZXkpIDxtYXR0c2lja2VyQGFwYWNoZS5v
+cmc+iQJOBBMBCgA4AhsvBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAFiEEdI8Vss+b
+qPAkFV5u18krcPocgU0FAl35lHAACgkQ18krcPocgU2GYA//V2qBuqfIs8DXjKDV
+xsQEMu6Donci3vj5Xi4kn/f2MRoL9d/pA4k2AL+s835tS79o8oDFcmqLErqaFSNX
+XhhnNoWD/ShE8GqtN4FV7vXb6pK6miNYChCCV94IALqT5fU7kpG0nenD4QZyfnWN
+hCk20eqZy9AmfgtLfML6eEh3Tc23SFPnSx6qrEz/w5hf/1ECTBS2F+HXgROd0oKT
+G8uPw0YdCDrguRX+Wh8gZ7vyc5TeU0rLoEvJUzrgncQTEaaT17EhUfI7IexfJH96
+k3fsIZquAjTHz9KtjAiVBfpUC/egNC0G1/i+vlPmxt0rBPTM9npW69+maBXMKdei
+KvEVywIY69sXju/W1nO0LqJCWxNQ5V5L223tKCNqn2YCUA/hb0sLKNGvox5SRm7y
+S/6QvDHDwQmNY+LXyWqS0uTeXfinlgN5sc4mL4hqceRTGHRj/SoamlfxRfjcFXHJ
+diEcaJIwWA5FRu67FIIZXx37+d1QtispkDqfQg5yiRPbaDTjB9TSlz5p9LAM0PJu
+ZbaFSWIDN9dL5tLRzHVxH0jO0EwcoYRs7eMrS191dHxffINrQIBdwc/cILQwS3/c
+KGvYrL4wOyxvjfQvT1SRHs/kHRES1c5qI6s6cvyYu4/35gFHZNcvLyOMr74x7arV
+OTlQ+tXqYN9aym/ANP91Os+QnA2JAlQEEwEKAD4CGy8FCwkIBwMFFQoJCAsFFgID
+AQACHgECF4AWIQR0jxWyz5uo8CQVXm7XyStw+hyBTQUCWrNa+QUJDSe0zgAKCRDX
+yStw+hyBTa9mD/9YHi+CyW+9OMAoBGANE2xhV3NVMQF7Yg0RA7+tLQdzeYffI2dj
+DN2pcSYbbb7OOMVh9Bl5ikV8tft3BLwUnZm/5LiZcPIKQmv2e5VV2lg12khKL/6A
+xV02mL1dt7EcX89L8HRH/slYJzhcKN5OJRP5dmHmWN8B9eKuGOSuzYbCMV58tokE
+kZyfSUjB/dpIy7670cwJncV5eUV0CwZWYP+4uHkCOnbYplI8uOBaZ602mKLq+AX9
+UWpXcSUi854wyWgJSKicswcxysj2Ryw7QsafticKJa1yh4e3cg2tBKlRguj00EUi
+uSK3mC/AtHuhdjpbNxbO5AJ/XNhGNIwX+1MTNAb7qnV5cmzM9LOUgnF1yxO1dQ6w
+BBSoxbs7rrumIfN+wXyngEyviESCQEI2CIQD9YsnzLGp4Jb3P0TyWH9sYIfdWE7Z
+wBXrFr+VcP3AI5E23aW3CH5VcR1ldzKlU67TAgXpBv+ZM3mufhLBzLFGQsLh6PmZ
+C9X4Z+C92SNoA8mwF4Kn9mXXfjdr504D1mkrqtxwRypmDNiryhdtN9k4vInkTGpP
+k9YORJR+l0LBc0n/vKxRsqmcUDxNK1R5eYeP9jnY3C8NdC+icC+iSnG7KpgygiRv
+ppE8RFeksKUHaYFLc1TP3qgC2ARCO6uCsloUcLgWafUVqUd1yiKI7m+0EokCPQQT
+AQoAJwUCUy9AqwIbLwUJB4YfgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRDX
+yStw+hyBTYsPD/0cQeknJvRxCnA2lQBLFgrppR3+Oksaq6DtVxv0pHFDXfXNr3TQ
+3T4PLe/sBXHQ+NX/wQxukiODkcwKwhB+69420g+c0GwqsBGqgRh7q25GMtq2K8QH
+DVuyPJRpOq6uZFRkMuoh9ctugSOAbDnhdjkybSsgly9wGCOvjKlt/pEs1d5IULUC
+0mJrPwtWoKJ0RidulUJD/D1Z0nzBCX3laq6qTMdE4I98BQJKf9ZQnANGNJCib5v2
+M5cRoT6kyK6P0mSdxA7yqHYJLRIQBFNCFriww2+jn+wgTorE6AZlhaThDmpOIK32
+gPAdxYK5VF16LyOhOcRUE/yw6hDf0NX/51Ny8CqfrwQZAJfl43khTNfMaWXKbCUO
+rWnaX6H0q0w3qG+pIIsKMq1NIQR6Zsadiz3malbo2UAp/S8FpGz3meawj6EU/f0Q
+QxrwR9ffUAJUJ9DWjPSvUloQbIfPqVrNf8xEMQZ//1BoY4pk3mSKYFi+bmunPKmR
+BvsMMKCLlKt2+83QLSd7vbfrZZFwABTt49/BZHzuh4U1PUtYIoul9mDTZBtw2T3N
+yclYwbve4XW+eKmFoIHbyKgfV+e48ID5O+y/gh3wSeYndiztTgd4WWUJv21JgdSi
+af8SEVBdU7pHmKb5hdSlO+RTnHZKiFcomVZxDtFTTVABbMaH2B5C78dR3okCHAQQ
+AQIABgUCU0YJAQAKCRBxhrBuHtE55w2vD/98b0padaLQINFlowq0qeLHoFbpXfOO
++zWbdw9dWJYaPyJgqvZviLLW+TNrOoW1aMNny4lmtj2UZ2OqvGGISH8e1jX8tQUP
+GAgaLP5kWB1h5l2dXGZOh622vs3ePfTysg9oxDBJ9abDgJ5zB5N5e16CbkSvCu27
+WyPomaWNXWv0xdfKu0yOEB9H6H55VP26p8QB7zWmEgph1uVnTRFjcJyOBwGvX/nQ
+TQye8JDkmAsCpc0Nwpy48a0VL0gEXGRxzpVAqyuH91YUJflxw4kLkffWqmLSDKBx
+e2k3KQ05U7B48ap8jG2IL0CahNOfzGbbeuiLh4RWErvEaUhooVXGO9k36gkcOweH
+bKKAy6Fuf+Yo3YzJ/Vb2VPXhPzKoQqiq5hIMw6rGaxX3agtyq2jMoX5opS5roUcE
+YP+SSvv2eR8zyvDpDwDRCD/zzSgYEX9qt12uaOee184pex2ipxmC3fK2MpxaJ/Y4
+044uR2Aii0L1Zl0z7Bj/3ycwDv0o3Ja8TJnZ335AHxBI/Ux/TAOZ+//SvjkKVEMq
+EslmviGrz/T1FtN71D1u50Ncn5cUEBepurmHB3RvrOsbZtFkC3qhGYLjO8Ak35BI
+Th5ydpzPi+yKr2CLrPOyd2zAvvhlRY0azLqLl0Px1MKriuaoaD44YZFg2T5BkP9C
+e7z6LWUhhPL7AIkCHAQQAQoABgUCU0YqxwAKCRC517ARxnq+PyPBEACxeFjewW27
+6sJcPuvUNTKv3CpjJi9y4RTqZRPoE/ytfwK1izVT65MY6drDZXaEP9fDQlSjh/Yo
+nD5nftPNZq8hWk8KKd9IF4EgqvgfDvPaumItcanBwSTv9ogkLZfc6EkvGPqV1TPq
+FsAurloLOZnE4APnHcu5nskjgj2lqIY+E0qHECNFkkorO2xhLPsZGyFCACKt8OIA
+Dp00gFnHa4C7LHVatGHowelAQSNOXM1PMLujtFcf2PYnYkFBv6vPFC/3vKh4Qu0C
+V8edQ8LwXv4mEqUwHT41RhQbFx124S8MtJf6bPZ96oY9K5lkdGdSQ8WMpDf1KWzx
+TRsWUNV2adfXUI20IBobW+Ybiu0djluy77xzKQ2B5ANMKmM0xJV0CBDgkJEUg5Pi
+AqCScWrLj2Sh68aP03E1NJRwum6BVx22L8XB3hb136Eh+7P+eu5qv/uXeYLcPpB1
+5M+e4aeDoTJCicfRCrfwcd5KJMvr1CyUE0GPpZl8llQy2eOyBgkHS0A6rtiaQtL8
+Rv67sG9CtV+YRVqCK7xaiv3Y9CwJJGpibHP/snlv/B6eqpOYQGMD2imjRVie467u
+EvYyWNEVeAf//S4xuMsyt8pBsbrBRwq5wjAi0InAIQyMMPupakE/+g3kHoKPwMZL
+ZgqXT9Zfydx15kaNfhHc7r/iNbL2kI2aR4kCHAQQAQoABgUCU0cBZwAKCRBsRfJH
+owPVX9myD/wOlttGIEg9a0IkymlHJbf5PqaEheGxPHFFUPUfkXauKD21JEXhIWJJ
+8IyQODmX9yZAinSDAeeFSYYwHLkXgtWFSSKouTMkpNFcJYLngQ6X59SZEL89Sz/t
+zpf9S7EbGtX74whWZDJ28viupAiL+/WTiLu+j8w8f0r6rpbFJtmhD3I7ftHGg8Ka
+g2wCw3VR/ZAF1+p9dz8fDe8wak60sK5N4I9FspNDMllCsLZ6ckG1SNqQc79MKlqm
+kN7eGtRDZEZtZcZiTzKUrPv1yMVoq73WpL9f/QJl/9HhCHiwmFWLR9y+SUEfFTL5
+0N/udkxU/XjupI0K8KeuKQb8+9eOXJtrvxMdfJYECYOYx3mZ2encPnfSknH+CDnu
+Im1RllcdJGkYH3WQLowwHqvczEWDQdg6f2lr6lvRNB1i0AJXuMv5kqwPxkXBHPMp
+T7gSP4EtG7uv0Qr7aIOD9oKhvb9JxDhcba2Mt3muebLe5yvNypQOtV1+9ybp1GSd
+ldHgsjQB41Wt4+BaeL3TDpUihhz4ML19LuO9jiSltDqUJRcJUxU8TihKCWWxStuV
+jpLXjl+dJSXoXy+dW00/C7+rOiyscISbKZ357WRvfsi3PMOPqpI+LRauelnVHZHT
+c47fg23fo+EhtILt9qmBQfejX/FdlIB9U5qij/JxPCumbksoRR5wWIkCHAQQAQoA
+BgUCU0h+1gAKCRBi1I+tFqDeAZohD/41Ms1FUMBWWAfFhgb/UfAqsp5ItPZ5l4bb
+eGNcui/FQGX/UPhmNl5A0DupMg8ue0FfnuxRrOpyOSv+a4aPSP5osXAGYc2OmxSN
+NFidefbmR0rY/hZLA9rG9WeMboozfewEUW9+v7EZZ71P/V7ZL30UPMeze7pcYJHF
+tde3JxlshBjO2s9cAXhWU1M8TPpDJ5QEcYA3ItwvcaVkCgUC4DOku3y57zLAkx+C
+VqFKS81k5KMiEbrn2Mn7mR3bJB0HruZFX5WEDpLPVXEdY0dItm+cv6AvFj4Z+sDJ
+QFM6cg1lxod2i0eUfbhWToC/CJ5ri+VKl/zOCY1R3YLcJU2nt7/XACyV0QpGAWu6
+CZinNpUdyGXk66HaG09fDM2H3L/QkPPi0EmeeNBEz6uz0JHtiYsb9jjBmXscleCh
+smJU8TzGVDJ4109Wns8L33GHNqnBBi0Et1rv6cb0bVbv/7mNOGyAhtPKGikXw9Sk
+2oFIwb2lLbkWqykZpdEmzQ0ybr2pQwch4dYTUkbmwhpBy6u6OtR3jv3+VCFBU9xv
+4thfHqU9KksQyXrTrvdIntMuHMB5gNwLFY6pVgqXlPy4hQ6GFmhU9SKPnQh4QpXR
+YBsUNEAbBjJipnAet94a4XqvPdyoZL3SYdm0FcGLiRqRo5suMwfBPrS+XPxCR7gV
+dciUrWUHP4kBHAQQAQIABgUCU0ivpwAKCRDceM+3508zgsxnB/9OAr1+dgmxeLJO
+eI3dM8sSCmg/Fbtqz+GEE3EmxWiDHMYVSV0ADYi2koxhnS6ooN/RpUXviEPbBsRb
+8mvaNkLmS7PjXfmUGmAb6Dnh/Z0wUKOHUQ1THXcxTrg0XGhfhxkfkukwQckaY7LO
+5IAdM70poaAof06lgTD7fsahwpendPJAyYtU5tp9ruXSByLJiWq03mkZfh2p8+rt
+gvGOHP59vIRw93y1EaskiXo7mWBA0JnYHT0xPO5Lap8JJNMnwtJK1r3FwoZr+cTR
+0Iur/ZqzIwptQ86lsey/od4ngwNL0B9VoQFKtgKDvxHRcg/Af5DEvj9aykxyomgo
+kxJEf1NqiQIcBBABAgAGBQJTSrx6AAoJEGFAoYdHzLzHU/UQAJ1uJerezcUwUlLE
+GTuWSP24b55UFvQDpP0yCkW4RpGFzph7Xhs6COGI17WdXjJfaZgzUVhuSBb50Enc
+ia0trlCkdXReqzxYcehop4R7NnbYNMdEnK4FMJh7ViXiEBuEax9IEETp877IYJXv
+ln1owzsZeL/BF87U0yqSxa2XrXY+xLRKChUv6chXL6W5FFOJ0yScsyB/YrxjIFEd
+CX38zy+NkUbNYH2/rzQu02ky22sCPLG5CA5LRzVxRW4fMMG/9obaNGnKFbLSsMhY
+SEQjJh4ZOmi2dGRxfyFpCJfCm9+Gqo/1vuV0Z/fNbV826MghCSccwxedt/swqF8u
+Q4pRllpa6mSSAxfKSFQGToB7GiqDIM7+ZzWsjiIHjV+a5g/AUgQ/1Si0atMwqCys
+kbolQckvO6aqN/drWjAOYwxk/n0lpG2vScn81ymrVnyFBz/fP8KDWTUVIqMoOH14
+wFBkBwtxe+zPl86rJ0xVAgs94Z1/OJV7MiRMa81xLeUXRNi4XAmMCA+oxHPbiHzq
+xzDH7pkL0sAitvpI8U1WPLFGvsxQQ2+AFljzkoA7YuK8oONoZd8LWbpgzKv/PkYM
+R6vhuAGokiBLSRd6fE3a1hMIaZigv61Ii1FxY4lYnVs/OKv6nN2mV0QoBScm85dF
+Elzp1Ep09H74D3i4WbEfJbweXlKdiQQcBBABCAAGBQJTSyB2AAoJEIqviNbYTkGu
+oysgAIz0oF/YUPUhCF7/qPRqHngt9cJ1Ap8b0LQ9dcntrK2czYQwTBYmHdJmQTRQ
+2vG1Y0LmoaHdOAY8jM1zihmes2DHyVIN0PN5m1dQuFCaW5lZq5z7bUk55QyF8379
+8h8A2qhoqXlP5Z7GqBgFy/Dj7AErBJFmRYCNenVi2c1BJBK43Oy/c/9wSVjyqqyc
+40UGBX1jxmlOCbQW4iWhkBVeOVH1ghsaw483GYMMMNgC+xyvo1g58k+630sR5NqQ
+l3fR9KjCcuRrbOqltkEXMVZXPVX6FsEC3cvfRDX2d5uDfRrRd/BWV6xZjiZowR/J
+3f16OFU17NRpDNwTzhrLv2CqierQjTtsAu2o1xzwRbuV9hWhFeJBKTC2TV5yPy5Y
+BiCE7lwKvYC0p5sMu+0rdteejCMh2lzvpom39TrFfM/s3IRv1yNsqfBMCrBUIJjv
+q8kzTXKaY9ozoBRqlRpVsJPJn21YAPjAwTnVJMHTgj/thy3dYlJhDn6ZOhXoxNi/
+wO5xhF8SsGxkhPQnwtuzNe7COK9ktyUVOY7bWWpzLnMa0hPyM8uXF6ahWtyelgJa
+GZIsfY2oezkJ9VPkBWvE4qiYf32Dx8+AbsWIy8PpefZywO7VQwQZZKlwz8+SVqyC
+q3Z79fBWNBn++CEFwED3k2BzWZB7kGrFU5Em/v80V7d9WwwOGluRrqcXd5pbq/Cg
+bOZy0ujwmwaQv/RULnGlnQfWZFeMoJ34uy7YNmhceXB+Wj46xcotI5cZ9GbekMgK
+LUeil0TuDSAptNJLCg5A41FmvtfTnzG3gD2cfSZzLwKfaGlF3TUJ22Sf0uUhUQd5
+lQmK9t+T3MM88fU7l3iP8pQxa0urlybhBxapXa22rN3tfybrVsmijK0GibjSJiVj
+Y1l3MNTmLDdjSHZ+irWx222xRJzIeIJ2vpNzY514KFtjJbrD+WWZUtbStzoF+Z9j
+fBRUIMjfAbA73tQchpSN0xRM7Hi38AgeOp5eQ1jfB4QD9W8ifBj17G3xcZhrPzNU
+qKEppZToTq3dZMCbMpfddUmv8Jfr7v7x/6Hk4YsACSFuikyyPYbeRvsTduC4xl1d
+izKnCCE8Uj6Tm1e5/58Wax0o6HwVtRRXluscVOBo73p2hL1vYullypw2HWCVWw1H
+C1qlFzCzeM2tuFY1qw7XyOaTisbCx/R2uAeXdTaoKsHHA2bLWIvpPeGesjrUK6m4
+7O4iRBFOVfoGPgIhUST6Gw5+43zeEIv3Jnv9AVsG5msYTWxEtJ2GZNQq8zTlmkwx
+2fainP6V0j9/xkFTjLy801JsgrPsPnM9kjen2nZPoGX89vbWtin/q+PeEZRfhT9x
+nC4zoDaukkJC0wXYgStDZfkuQwaJAhwEEAEIAAYFAlNNSPsACgkQ861clKZ/cH7+
+vQ//ePOg5vJYko/eTb2bjnX1+wW5Fo2b6tmMwSCxUtbarOX749SMZ3e0oUC4SHrz
+5AcgVVePp6tp6RgnGjDsxQ/MbUsHhpFAHPX3MrhbhfbIsvxysdZu674KtsE73T6M
+svu8H/AtytonRowdg9O6ZEKVjmUBpzoFDDiPpULOe2muLyYYMH6qlPoAFWuEkeGO
+fZSlIwmPNCFs7ymLIJCZHDjORWjAJ5h/edhK8a+UbZTGfc40+MClEOLfhV5z7TOd
+XniT5cmhVZekhUGuMzGxW1X/JUmaxqrNdcTZkdVCpeBieASsLej/MI7U529Pknwz
+fNcX8LmbE0kKa89kxEA5/RQyhJKXrhVFoCfTIxGMVML4VqY7yKEE0D4D7HARjq2O
+Fn/+BLXXf7tH6jbNo7Snay0Cz5pgVIXnffG7o9ksMtio+inAkN5nzbXkgahEfBpJ
+lMuV0AoOY30J26OmUcmv9zGeRLcb/e96i2j5ifG0ln49u8lleFu4vRcfYJNf/4gi
+bzYe7hCsTFt/+8qvsWVzoyY/3qfDsD41vSurGDKfkU0ExMnvytWUhc9iZrpsixFo
+2ob6uWBIimyFioUWEHLwiX4h3Q062CiNj/Rwvd7H5nL3SuJNYe4787/oGzBtKIQG
++rvHJClcXgmdLDLqGhaGaelY3Nq/ksMr74WS8zD9lIg3DA2IRgQQEQIABgUCU01b
+oAAKCRBc/Tf6zHjIk8w2AKDZFkSUtt/POaXKPRQIrsUC84up2gCgjr35WGd+zT8A
+t9icJsfyeD6HmYiJAhwEEAEKAAYFAlNNqJ0ACgkQzeGjdEknVVMv+BAAtYg4FyQR
+1UjkwsSQcu6q/7wwBD6BSPzfLXQo6/aiQEBclppFJqN8F4Gb3x6+Fx/TGso1bcIp
+7SjHNzRcQ40amfxlTcFMHTIGYHghlbm3k2LmdaWml17s0f0U3LDIOV4DQ7GI4/BH
+owwpgf/Lg3lapnmdMMvlSLJDCs7Zaa0zXLFQSEIbmIGsvFgtCGwjT66S8swU8aHW
+aG98A/yK/Yfd1p0WPtnaKkOoe60CzMBZwtAZ1dTDoRmmxhEJo2yZZGTRe7r5w0AV
+fPW/jdtNKTKeR0fFfT6ic9P3UiqbD0JG0jbrKVpLw95NVbpDbVMqD/d3zic+v7RJ
+/6uI0xJTsNNcDLFQoGqVl1fImU/O1NcAQiHDI/QRAIhaLpwWQwUdKhvaQFU5qIiz
+UosYvZ5bxijuaSli7ZRQ6Kz1OP9HvHjEaaP0IcaWjw//y9k8X8wjBGxcLBEauDH3
+mHoUebAsZhx6H9YmL5ACFRhwNsoOtkVgQG2A1DRmSJgIDKuXIaTSkM56CqBgjct7
+pEg0/ENrAumkK7n7JfrDeNHjRpxjKZBfIjhQ1GR+dYHQvLO9OEd8MChOqiVm4BXl
+8FANYAp8A/oAQZGGZTmq59h2Q733cfvPlguhCc78YdZYwPGFlEKvhGKtSrIhHHjC
+FviMHF9lujuK7U92PHQgdwTVk06fJqxRCS+JAhwEEAECAAYFAlNPfrMACgkQq+nF
+0h76/TkMEQ/9Ek+hE5mlfC0uLaN+1M2/EG3U58aU4Q3QBzsPLTGgC6Ap7HJb/sSn
+ZZoeYRZf5oJ4ZQ/FjCaeuMc6J11hVx+IUE0nDDlehbcWo6dfj5tNbvFqa0oR/Dbx
+WT67yh+cEvL6pGFMGWk61U2bw7s455LOZsTrETAjHAkkgVXt94D+n2pLdqTpR3yz
+iyEU92LVLo7gmBKJhve9Fc9cqqrrcte0K37yTYiWWgCb497h279K7QLa4Sg5Pgry
+sKmjXCAzZKN/QSzkyf9p7opKJ3SJgs07T88W2OR2xY6slzphQSgRzqVwgbXgliKh
+Nf1PBrpsUkzlQs9CsZdzIyq479T22aliVSSJkuVJrA/hn9VMd6rzftb0PYs3G536
+RdK+g9BGHe5sqm22Qmpmx24O5vIKaJXJyTwDDNsL+/6bVmhPEqHEKnigCP9lMVzk
+wUIXWDOqT5aHx2vpic7H1v85EW6Rr+zaIpz9vgackKoUGjZoqrsRSQSKDkAb4LbD
+zfsKFGdjK8mMXWqE7kfXworVV+poiIshea2wrzkuV35U52y/kOhEt5nft6oLcx22
+0B7psVjQPVmL1UA/wjuIKySVbnkNIGSmfk/G5TdyPYVq2u6+y1aJtRR5MdCrHw+A
+8EdE+vyq04ujgdWl1Y/mdud71sLzGVEaPdVyaWwE2Ts+mw0eqRYFC6qJAhwEEwEK
+AAYFAlReKnsACgkQKxGKX6FfMLkVgxAAqUz1DcrAcQ97fl7001X/AjkIje790OgA
+XrCgbo39QIPLPvmb6P2z4Np5BN6XRtKhiSVjPPNPCQw34K40WEb6hAyZofKDJjZc
+yYlxHkzku8I44Qmy1aVIMwGpQS7qav7T5DFRemvcDW96L+LG+JRVEI6lImsxUhRP
+wf8gdOF3YnLyhMhJKH0u6Wku4bMkwOmC87axfPkLEmAkMV1/8nW13K5W+ZdDnvmG
+ObGkB/Dacz08yAzwh8BiucGIpdm2EZJGHQeE/BE//SsnOBlV82fkxkMESj99Xha4
+sVVHqyaxOA3a1xn3juCqaTD65OIi3a61cgPMxjPfcDSxEgNq2id3xu1SsJzgRxz5
+PeEdgS0A9hVAekpOTFRFCFnJ4zk2IgP0Q52GlzmpRyPTSd6Bqg5ulJO8X+xI/ZoW
+83wMN8VymlNacyaoY4JNZI8Zmaupgj8JEykPfALbqAFUxZadMNHvJvY5xAlen3fi
+gqZdZ5H0bH+TtuelzYahzL6pFQQACAz0xLtn7DheWTWnS53W8UizA+m6HkaHxVMA
+RuVyRElwSpHFu1jsX7Lr2Mw9DcpyqJpwWPPBwhle/a0pgObXRiAKu6orXWhxRQi+
+GXL5dIxafr657Zr1vgy0lRXHBvjSWYX0wmPboHnGphs/uIH70OXp9fPpWEKEkUDt
+TlTtnRab/muJAhwEEAEIAAYFAlbPGK0ACgkQGiI6AvqTNvi6UxAAjaum4hieN547
++8b9hv4BjHQUQhPWKBBsd3XHtdMDBuFcpEMZ/sm1c+5FYo9Wm+8OJ8wY3YOFenQY
+VnBPDVc2iVc/+W+S6rNfN9qNZBuuuxsPeFjzt/G3wzIvDX7BR7zOYNmXNhFSAEpD
+JM3rIAquE949Hn3WwS7/X7WWH1tpid5ISIY02+UKnFnjfKilyqq1yIldhoNpqun3
+wT+VuYegpchzU5K5dnErmbQ7a7BOvY5weMJ5ONtVUbNa9ktA2vxeDxw3GX3joNz/
++DLzkHc2OrFsFafN4guBxJNeS4yyeLKwRQrU1x3UnHmg5upbeszGsv+DxBeN5B6i
+Om6/uWv31SBrxfNmvgBTRDlCrBC4JmVBt1kh3SX2cFFQyRj4YKbEsASRb6t1KVMq
+KUchOdfCNA2U6W6I1weNzDNWJUruJTTH/ifCfb0CnYmiq1+I1XTpy9SYwMJWviWE
+6DqV9JNukqTVLpU66/fuWKjHzBUXXl2Wb/kBdVlWGpHNJv/Bq1YhHIowksbpgZet
+eAf5TfrjJRrL9BWsgjtlwn/W5bDCEnXstf34nMJmRcLWQKG8wZjQRg/AbqRyOmyi
+j7ACUuHxOsQiYjf2Lg8SL65asJ9rWgDv5S28LwCKwmGjhWYUYoZ4FLNHbSOWfDYW
+W6LqmoOc8dRCDVz4sL2Q1zUI1rH0RWeJAhwEEAEIAAYFAlbWUvoACgkQP5AsJ27Z
+viGWwg//aUqfPOy1gbEZdlK5r9EpgeUFRkY3vsrfVta7tx7s43ATgfFaPgptMAb3
+k58g32Deajq31YTG8wVM/NHxXzf4A427jS3obvQ/s/23CZu1fKiRiL03tBNuNZdO
+Ali1MPFh8bfmEa8wvTeWWCmpZJG9SZX59irxW2UzMDZmzMc6l11Kq7EnkqDs4HRe
+zjG17XpYhVLL3Ttzzo5/DeG0a7WeGm+a5aBhEVeUUvt8EHcb+IDKXnyyWknLBPLJ
++pJjmk3DHkPGiFJBzWMRyjZsDivWwNs8FOVS7+vqYEJc11irnfXVghrIWX9u62qf
+ZH5YlO/sxbSbekaapM88VC7BtzeTf/OGVqyilHp/1tqZdVIgwFuH1cFsYbCGaOoV
+uqb+a5vGl17pVxanJMNYZyTs9DIRgMSttyh834xN4r1SjO55m8ujW91reh4FU2Qz
+n+Evy67ZKnB9pJ6nl/BydFiSM3+OYjq+5XrQSazRkhxJRxhfGAvVUcAP7orL+V2z
+RQ/8f2/TkkBo41d0jgaBnyU6AtBDke2lA2+2biGrRZdQXHglOYQqoJolEmnQsfIJ
+Ts2tLO2fVAcOnI33K6YU9if4vffCDSqfVH8YoNuS+I5Ily9WF0yh9Battb4uSul9
+VPeeLQiO42YYQReqRzHwwdESTgpP9VxHbNJ2qC19vm8a+1/yvMqJAhwEEAEKAAYF
+AlzcbFkACgkQgauuqCDenlTzYA//Q/ayCDSyaGziOaTb+yhcWOAtwuX3JucIoc7M
+reSh4EXFtRYWmHJAfQnTzaeDKR7GFUEhZz7qMMsQ7YitpskbsLrNneECcP60ZTdb
+H5SHPIV7fSmncVMO/sDUD1Cb7Re2hibfoZ2tD0qI1DrIZbqE2SQqAF/eRkQq5PsE
+iT/vutiQH8hgbqw6bxRukmgeIJ6t714ZYk4VRdtrJFtxeDVgaUcmRzUqvPh95AqO
+UgJdhLoY6mCAJ/6UQkE2htrgOe/4Tr3cqNFjvFe4yvCvl8/yxKtESsG42X3+OWcz
+3AoqsI+sW0KjP7qAnzA1+uy2Z5Pqk+JWsM6+DE/PdqYm3C9tBRArnb3D1AD7Xeuh
+PaAEXBeWmt66RSlvExPJaPqq0x/cIJT777fuB4hSOJ/SzL8uuA431twt3pwsus2T
+107dyskulI1UMzq9nOFHR9q1QVrG4C6gUsW4KaLNUoprXM1RB9wTEL4WmrpwMKMU
+ovsOJbCeB6PNSUufj9kQlgztd1SNlEZ1/MuPGaYFB9ZMqHqiCaIHUduc6hdLEBLp
+L+uZAL8mE1BYwWnIxwEV/LVrWi3L0Co5pGka8RN5WQuZxNMYlMpT4DSwj3Dh+IVC
+Pw19wsFvBZdjwU1o9J8IS/oHlUix+3yvD0fpeMxmtu8o1Wg9FXcOmg2ywLNATHyq
+YFIHVkiJAjMEEAEKAB0WIQQp5POBE99wfXIqbvkf6a9zEY8afAUCXOCcJQAKCRAf
+6a9zEY8afHtLD/wKqREEswojEzHP5vJ2AdkjZbEdldtyJ4vvSk32n9iIN0WP1KA0
+kPmfE0E04Eg6VyiP3m3aMupnvz0/akzgNywuPQU0uoE39Z1u31QVErUMkOAJX+Iv
+LpUWv9LAxW8KEOihBc46LccTz2ayEcbe4wOE1njidLEc1iGvXNDGKpKBEHVZZkFY
+F0DjZvMAbZHmnfcncLZqQU/lmqly/Rjukg1dv7hKjNB0/1OATLvgMVh2vAuW+pkz
+iKrP+6pIgRTCl11xZ0I81IhVeygtG/xpUTYhwkyVq2ZdeDTPEI4BgxSH01+jbRN3
+vsCwioTtCp1LWy+6VJbcEkPrEjzJgY1twuacuC5kO/Hy7OSqniaATxwS+9CGS65Q
+1K0MDs5NNfoTccjSnCE/1ObcdBgIrTOipsD/l6y75Al1MAc26Hxa1yMnjc9BRnuX
+sfSvRxMfPNSiyhs2PnZPE7atlfScfdk8OgJSQtQrdylmlukdljWC+DX0JybcDwaI
+95m/Pa5iEZRzP3UpOeWdSTl715FNrYb6D2KJKBGGkFv4M+MvJeNcb+WWQKl83CJk
+fUwKO9hxTmFXaVApu0X7X9IObso4t/u+wGkv96xQvRep/cOe7Nu3qk8wLgiuqMgI
+sjTazzYJSqHuCK+4xyoaFwwnv4el1le8vecawH6l74kU57T8VT8V0Vyqq4hdBBIR
+CAAdFiEE6JZlINok6WQuEZpfE5cdo5R1vV0FAlzstg8ACgkQE5cdo5R1vV3T2ACf
+TF9eflu4U/IhQOI11yASbvA9TKwAnRCw2oK1N/0WX+Wfb2rqKdc7HnO4iQIzBBAB
+CAAdFiEExHvHbfAZLLKUZbvPR7HWrQ5oLJwFAl9owxAACgkQR7HWrQ5oLJzgTQ/9
+E4n/6bVkgOjGgr+BOQVVor0GE+1XplHYS2pYZ+yNRi7ywppgeO5c4vGDBXmbK5Lr
+f0opekUpMoT83oGrpsIplklGJWb87IOfmvwfIWAOgupbqMxGsFIF7HbuH6N+aqxR
+PN0Y621J2Q4NSPnLOVLfKTjl+tboDfENHrBFF4/RLoVBZG+azn2Iq7Vm8d4cc740
+Dxe+2rOcniMHHBNy08pKMHRjishKf2BiZaCg2BfVtNvvlkSMI3Eo197+n2B36xqo
+DHtnQQdVh7ZTxT6qHGHzdTYfZZOg7SfoQHCtbq/04cLe94UFaOgV5fXrv3PXJd6A
+Zk12S5uFDBaV9S97hyEuOARzZqzVbXAuO3nI6kFQg5K+KfyMRreilK0mHAmHcoyr
+YRoUtit4KDT0xaOXwdde21Iq7AO2yDsLnOJ8xMq5V5ndh020/7EboOAxm5Z+U3i/
+QMAH6XpYdwT/A1JeNHSmy1qvW3Q4zk5V4hK0rxU1A5GZhJ5aYEEjK2M31fwj9aso
+KbR7RP9cVi9YpgPxbVq3kj4A8qKk2D1MOBUPXIWZqMKbZtt3i3T9yyM3qD2AweXz
+sT5iSr7mqfEHciZY0k3/M/MRICfHB577M8P/2B4goLKspaQwC1yeO8SbJgvd2+O9
+xUtLMBio+W5bA34rtL1uJTNnpJ393D5aj7Us5xAu2w2JAjMEEAEIAB0WIQRTyTWC
+GqanVb0zfbU1lTles9jhugUCX2jTAAAKCRA1lTles9jhurXtD/9w4+JHh+ffHb/e
+dHISAjwtRdIe0zRL9iMfKqDKFvpGUgqTPbinfJHGGfzr09pu8eoZmrYMZnFkWCFW
+7pvB1UEQzGWmfWin+6iDg63SKJ10MT3SpCSNAwNCBjhzwJ6+jYedmFab+KkKSZGg
+QGjtp0QjB8/iCOLe1cFeJqBIinrLAdWXe7BVNCVdtLmIkAS9Hznd3RzJP1bNNqGS
+6zGjC0S87A03jixVM5JLiEHA+0/vaa8pOiClzjad2FINGiY+gx1/N4tWM46CcQ5+
+uz8Z7F4rt6wgV3gyxr4eH5I95Ny9X4c1zN41iLa2cbHB9nbU538GMZlHIHURfSrG
+7JbplqkTb897CR1NRKZg1zDDBlW6BX2UGjU7EwNT6Rult2jcypEhUIjh/kfNSijb
+96wzWArNqAPcEIi9e3cSrUCSHRsgNAt3LsVw+aFDwV0a77wiZb/wZVGttNMRsexz
+pZ5hV+ULSNEl+WeaVfg8Q3PukunwXu//b+ljzuWh9++k57AEw6tp/aB2+DpIKikp
+9eCjdTP/SDNVQfAW1lk8Atze8odTjvYNOWazsl9PzgGP2RNm042hanPo/L78JXaW
+mpBSjKnnKDMHyRF4n88KAlAd4TlRvGq+2E+wqakbc+eWkIwImZ1YufjR8nx2Lpmp
+1dHLC/FtZh7G6S8T1VoW3s+oWug1cLkCDQRTL0CrARAAyHiCGHKiZtJLoVjJcQlH
+kyj4QCdoy6omzPSTVgThl/l6z+U/pYvjmW/39ow9fYB5VM8ISYOCSo252FQXaQrr
+VwJouEr1v5C8VM+y6P/TO8kUodaiIJRLZRJt/FmkYAH2a8coJ2lwz4iDyMKNt5XI
+v29v+h/fLasKxUpZ1cQQvjFToivWsO9E9xoUv6f1eSvFGjsTqGEHnC91ICuXhNSh
+8cm2nHviEp00/jMIPcjhZkG6o8oVvBbjqrXQkfcH2HuNohX38C6GpION5JV8AQLV
+T/2+L0DzSr4EsgbxQYfmqytH+RVnRU3eBYiZpq2mCRvSDKhakCO8cN2cqRQ+J4V7
+3/4JPg9A9vCbFSEsF2MEa+x9Oxp1jGazV0+R02jIC5RP2581Nfm2gIpfx9Fa6TJ7
+ZcAd1c8wUqEwzVW2YNEyE9DCIKR2Xmpp0ucChWna+guhjocLF118N5MzDSUtdfRr
+qsUhmp9RpHfvrlnKJombYS1VcS1o/yuVADCJetylLmROq5sZ/11hUgGJsYU/pIUO
+s5ntxHJlXvViVzJkGD/lVCPhSXptm+PBtU9PdpMHAMnbE59tzr1gno9yDBn/TjeV
+2H6R42vfWJXA9qRcr3XkAHVBg/ZHGRXwxWbgObFI1laoS2X6RAeo04GxWcSVbzeI
+eRUMHHKJSj+H6PzOEOneoTMAEQEAAYkEWwQYAQoAJgIbLhYhBHSPFbLPm6jwJBVe
+btfJK3D6HIFNBQJgiaolBQkS/gP6AinBXSAEGQEKAAYFAlMvQKsACgkQtMcIk7Yr
+q+ifzA//Vm60DC7Iedh4cx+e0HWqusD5luXchrGVzCMO/UNkVHZAn9Yn9buReZW8
+HCqr8MJZRDuSbLhmyY1IYNZWtLH1Q6raD/9MJ233nIFDOQqUkq6M8sld+zsMwB5U
+y9iLQaWfgLXBVyoIeMCZ20HjTcRh1cdpMpTfi4S65xBr3Ji2W/zApianwSWK0ZCL
++ItC4PVaRpwWsiZO9p3/In2x9+9DbX7DpCxwEdOVpOXiHmFoaLLSUmWkdos0Tj2A
+zq85s+8ah6Z4g5h07uLMPFWZrxL8jCdsdD2ZcG9zk1+I5VKxuYdzBHiofHcZBMbQ
+CtXUPD4wPuyyeKrN0MVgYvNLgZ4Y5YGuLjhX00b0SgQIDiQOyQrEqJWmYVh0KxYd
+7Zp6Cj0j1X7svGObcpisrPRxzpQHEN3rfZGzghnuHiU4WbZk4QOwxyJkTEo2PIKt
+oY0Uza93TJUhFvj+auEholhOM0qzWV3W8+BWMDpHhHN5OMMy7+4mDQed26OXN2/J
+Z343rqEADpkm2m8T+O+5+y3+5mmF7C9IEOZggs2/t+28jW3SZtQ70KVsKYuLJzLP
+lFYIWeB6reNSAvbpaINjxm0ZKw5X5N1CzmTuKHkTzdCkkeCgiSSFeE+o7yJNurTM
+ERlUCWba/HBabXaKtB8FZstelfccSeRu5DfzESPd25i34YDAS6gJENfJK3D6HIFN
+ERUP/iF3VFTudcRL8lzBZCRfSrJkXxfEHEXlZfXqjheLszP4HemF+/GsuG4Q/g8u
+YUqahWXRY4KfaRcZMfJ4iVGfHsLxUkzsAPm7IpdUB9X8sadNbjWIrph6fTedTySL
+sIZIfV5NICCpx3Nsa/99LKN3Qjvt4MuEaJ30wUJrEPKW0ai/a+bm6JmYd0TI80Ke
++qhGu+Xyr5+Yff4EnR320zxqBFK2wS6+aH0URDYu3TeCCfKwTr3yaMbg4BtLWNeC
+iZGWEL22BtPL85AHX458BdEY2+oIKu+n4mSUED6ldJCChoLgkypa9JLhByhSWM/m
+fHxq55roXiuJ9RTp+pryJZ4Z5vflPX4umBBkkW1ObfReyeTzPfnOEeUAQAcpn9f1
+BX3ufd/GIQlSwZgNHo3zizF0c+/2HwNq3G31PkKdMKrBTvmnBCPRhml+SlMq6V99
+P/nXasOrwN4h3R8Fjd/5WPqyBakwRsCH58MYxST3J9abd0QGvx/wZZlJ01GhFBLS
+2KZYFE1sH5K6zKtQQ39n4KkiPUb/iDrrjRpBZnaFRPLZbJUdzMrJrcViASg1jDOR
+Yo/BgMsvSenLhAD4ewc50NNAghcHIdfORfZUdP4f8AhfZePz8IOhcKLrVsSwzULH
+QahfLc4bv2nznBrDmPC8JwWTgS/m//vJSBGtyFgIp1CfTFQliQRbBBgBCgAmAhsu
+FiEEdI8Vss+bqPAkFV5u18krcPocgU0FAlqzWxkFCQ0ntO4CKcFdIAQZAQoABgUC
+Uy9AqwAKCRC0xwiTtiur6J/MD/9WbrQMLsh52HhzH57Qdaq6wPmW5dyGsZXMIw79
+Q2RUdkCf1if1u5F5lbwcKqvwwllEO5JsuGbJjUhg1la0sfVDqtoP/0wnbfecgUM5
+CpSSrozyyV37OwzAHlTL2ItBpZ+AtcFXKgh4wJnbQeNNxGHVx2kylN+LhLrnEGvc
+mLZb/MCmJqfBJYrRkIv4i0Lg9VpGnBayJk72nf8ifbH370NtfsOkLHAR05Wk5eIe
+YWhostJSZaR2izROPYDOrzmz7xqHpniDmHTu4sw8VZmvEvyMJ2x0PZlwb3OTX4jl
+UrG5h3MEeKh8dxkExtAK1dQ8PjA+7LJ4qs3QxWBi80uBnhjlga4uOFfTRvRKBAgO
+JA7JCsSolaZhWHQrFh3tmnoKPSPVfuy8Y5tymKys9HHOlAcQ3et9kbOCGe4eJThZ
+tmThA7DHImRMSjY8gq2hjRTNr3dMlSEW+P5q4SGiWE4zSrNZXdbz4FYwOkeEc3k4
+wzLv7iYNB53bo5c3b8lnfjeuoQAOmSbabxP477n7Lf7maYXsL0gQ5mCCzb+37byN
+bdJm1DvQpWwpi4snMs+UVghZ4Hqt41IC9ulog2PGbRkrDlfk3ULOZO4oeRPN0KSR
+4KCJJIV4T6jvIk26tMwRGVQJZtr8cFptdoq0HwVmy16V9xxJ5G7kN/MRI93bmLfh
+gMBLqAkQ18krcPocgU1pxQ//ZyvA37f1vdnn5xkLmbvQigGdIK8fniLeV4PzfImA
+wQ+jnKeavODSThkeN7EZB79pOlQsygS3oH5gHCT5gkr327FMLcHkfU9z+E+EAcZU
+cklbSksOWbYjj4Vw4Am8YmYUT1FwibUm6Ry0yB3n6+vozEHMM9POIMcWFCcGMbHy
+5O0alIQPMbA7XF1ivX/kr6mNYUOe/eC+j+hQS/BIOpvnC2jwP3I5eh/dGJ6fnKf4
+DUW+Kf4+yAHLCXE1I4+PHJCV7rvR3XGG2QYi2V8V9Y2NO40TV3XyfJyR+Spdg6kS
+tGdT5xFdCgIJQSPYL607LMaZjqx6Mk92dgR6iJY7A6z+R1uBtKuzWZJkfQ0w7a/I
+ZQ5myAJiVjJYO3g1ILYSRbPD8p3kEqYhMUId5vzVtvXEzFkJWT4l6CBYWLX37icF
+jL4BKIm0MXzJrqueLZF6MuNf4skBegtd0Ge5vWpX3mCOtmRiXrUiGy3yH8kDabNI
+1pkoHMbkLJSK7/c+TM29344e9ngZI0PYwNCyfveS5nAh2bGWtqVkEnfG4MFlMWIl
+ObwRCTrHrv4M+HdZ2u/84HppVJp/1eDuC4IPSb72sUJfSl5qZ856wRDSMKrl+CZR
+D78NdHarmGgqZeHj17qHB3Uwd1X1iBX7vAelJ+U+IW9V4nMFf8+mURwQ59VczGmG
+zpGJBEQEGAEKAA8FAlMvQKsCGy4FCQeGH4ACKQkQ18krcPocgU3BXSAEGQEKAAYF
+AlMvQKsACgkQtMcIk7Yrq+ifzA//Vm60DC7Iedh4cx+e0HWqusD5luXchrGVzCMO
+/UNkVHZAn9Yn9buReZW8HCqr8MJZRDuSbLhmyY1IYNZWtLH1Q6raD/9MJ233nIFD
+OQqUkq6M8sld+zsMwB5Uy9iLQaWfgLXBVyoIeMCZ20HjTcRh1cdpMpTfi4S65xBr
+3Ji2W/zApianwSWK0ZCL+ItC4PVaRpwWsiZO9p3/In2x9+9DbX7DpCxwEdOVpOXi
+HmFoaLLSUmWkdos0Tj2Azq85s+8ah6Z4g5h07uLMPFWZrxL8jCdsdD2ZcG9zk1+I
+5VKxuYdzBHiofHcZBMbQCtXUPD4wPuyyeKrN0MVgYvNLgZ4Y5YGuLjhX00b0SgQI
+DiQOyQrEqJWmYVh0KxYd7Zp6Cj0j1X7svGObcpisrPRxzpQHEN3rfZGzghnuHiU4
+WbZk4QOwxyJkTEo2PIKtoY0Uza93TJUhFvj+auEholhOM0qzWV3W8+BWMDpHhHN5
+OMMy7+4mDQed26OXN2/JZ343rqEADpkm2m8T+O+5+y3+5mmF7C9IEOZggs2/t+28
+jW3SZtQ70KVsKYuLJzLPlFYIWeB6reNSAvbpaINjxm0ZKw5X5N1CzmTuKHkTzdCk
+keCgiSSFeE+o7yJNurTMERlUCWba/HBabXaKtB8FZstelfccSeRu5DfzESPd25i3
+4YDAS6i50hAAoh3GjqrSyYpCH7P2/bL57FYYkgEwgk/RxxzXyvr6M8uFa0glXIOM
+OU07CznF24g6PatBvJhb77IVTfODVwWKa8Jvb1vWeXHdrKdUzbHc5ch1IlTjTiiD
+DOB+zbX+hT6OHCVgVVpptV2WQxUrem/nRg+Y9lD1qt7Fus6zq26ie4WaK70cVuFe
+OJ6KzD9tOMLeKq9HcHhpiYeTqW8qxmhvpArI8DwoLdx9XxMyLWGNpXNueBpy6prV
+xXLp/RjF8ZDtPhMH7zT0ev+I/MzeJXQ0PT2mpYmiL4AWb1gjo9e3JXYtaLc2XoiF
+gS0iZKRrRA8uvVcDVTK8r/BsOca0XX8QwIXJnyhhDauNxMzS2oaIi9XnxLSXrNLW
+CWq4KGrKujNGAlYpk3KFSiclvzhVbqpi63Dc0kxNdXQo9EIrGRPG8RI/A0gc8jpm
+eGF3LfnqCQcz7Bi13IhUyHEYqxODQLj0kuY40OAgY9rOwaRE42vwZyVt9vEsyOZz
+l555gHHyLozgXr/FAZhtXGNjVpeOPmi8isDo0/V8ImiMJvLob9Y1vgegFlU9HGQJ
+oO7YrodAHYa6vMfKghphbU9hKbdiSRvWmhsPJRWDXIjVrsjGMI9PYje4h1KHzfSW
+XGfM5rCFVX83cckNyPjWgGBYCH9saqelPdXlXc9kBGZI5oa52uG4DzE=
+=K7VW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D7C92B70FA1C814D
+uid    Matt Sicker (Apache Software Foundation) <[email protected]>
+uid    Matthew Sicker (Signing Key) <[email protected]>
+
+sub    B4C70893B62BABE8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=K7VW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQSuBEwVyy4RDAC9hprQuF4fCPCYdtMlb0Mfb+6G2TqerT1MebLm8/KHCRnPbFLg
+PwGgcyynLX5R2nXUb6oBZQByDN/Dal0UMuC19KeZX83LTcFE9vr516BMXLXXKmM9
+Hz5kygsu1iwP4oqow8U+ih16rxdYDmM3KUGhPqXYExpYH777NxaxxCyPJn7Mz/Lg
+QdPkO0awyl86sex6THr0fYJqR11XW2BkbK6Pfs5ubfxrMZxy1JujUw0UmzzEkQqU
+1+lncxecrevglH1R2WdIHx2sjkHQtwqT2rcsk9gJ8ISL4gKJ7LEYfLooKRwro54x
+WVi8Eu/XZ7OHfQfgF4+JDofIrd7zN0/Dia0qKpkZWJTrYhxj6ouvYqMPr7+XEBub
+eHFU6S7Zzo62zkm4dv6bAhvT/M1WWKih+dOvYJ6+qhBt9RsHJdUePAVYLOjTcvl1
+Dn7YKRczBpeiGQTGaquSkWh3HPCw9Eom5wPs/J1L5eeLdKoqyGUQvdGMJxuFLpSM
+BVN7Q1Voom8XBt8BALG8oGuCkFZUN6ukJQn1SWXGeBr4IUbFU9gnfZUVeLMpDACS
+erCIYBhSRHK2XaHWxPppw0yMm9e/eO6WWpVBZLd/cbxtxwJUandSfOhKn5bGRsGs
+phhWXjmT4w5DF3cngfe9aMSAV6xTwfnzJ5nSBwejU/UYCiKTnGVqVkMV1N546ZoO
+XCEJLRK8GeHzBXf4bvPW+4DVhfx/LBz3h8VJ0vy/cjkEqVWPCvb05WqZ7bhnk/kc
+N5F9NzHzCnze3fMfOtUnLgPCaAwWN3S9fJpKumhwAXdkp7qZv6CuvKsXsETmAPYe
+j9GYWiUpbL4bm4C+QEC18F9VkDs5BA3PhukNWutFcYJuRoJ6gYyUaA1PSqvcTaE4
+RM7Jjn3/fbMC+PQTNOYdixN5u+ASAsgjEDDaQJYj0Nzm8hy4uDbFH8TIqU/RLs6w
+pK8oLonItiu2UQWPnExvIN+iYGCfeMWDT8Lcx9cDxpshVZTEyjImPMlQBD3dE9Ov
+Fhh1nVjAZhyVvPbfshtBC+FphC4///lHumxAVJqu5oWdVj0cTlEqEAlOMNHBzJwM
+AIwXYkRklTogkJUCSZb8g1FB+fn6DJCu7CB4Fjd596IJn46fkCZKyxQ+L16KNl6Q
+g+oEhzsGWrpiHcBDZk7Oo5II4Ajjs2IiNhEkbUKbKn1aF3fdnpByOR07Qs0fKYCD
+xuUIgoW9aLtkJiXnQv9ddgpOvNpiqyBVs9dw4c9wWJon6q87dSRv3ZnvR+x64A0I
+82gtiE/gWnv9T7n1ri/P8J0/wMN9G4mL0bs7wTSSyd/rM2dDruYysYQ+CtMD8oIl
+VhV53qEB+5/IGb24OVileRPCVW7jGSdfWLbrV93C7GOh7gLsm+M7sZYqDTLgGkq/
+JNZSiVocTCxnZbi788kT+S6LsDdjYzGwqTqrdH/kOFToxMaen2mG37vB6BjA80t5
+lg79qALXIOKWPDI3UJ9LMavq8MXILghSbgJD78QwmPEROZh+ywN11cDw6yc1HSFw
+NrSZZuKPnj01amo5/Z2N9VMw/DWCYVA0HkPGnnxLsyboIA4tE2JR/QdNuy0CGrmn
+8LQyVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluLmxlZUBkYXRhYnJpY2tz
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJgXoAqAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zON6NwA/1oYHd9ChpQGGO/D
+lKwqijmomSpy5eEz/U8iJeq1eF8JAP9nOLHArkcDUvLqXxwPyY3SD2GE19khrbRD
+w25IWil3qLQsVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluQGxpbmVjb3Jw
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJan8rAAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zONyTkA/3PTaqRvtsm6iKSU
+FD2qe6805NtersLkzPJkChAHCp7SAP0VOOoX8tDOc7f4kkBDTnSwIYdLexqaWuwg
+7HUowhiSLrQhVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0QG1vdGQua3I+iJAEExEI
+ADgWIQSIWNRb6bJ2gCMYFVuW+52yGfMzjQUCWp/KjwIbAwULCQgHAgYVCgkICwIE
+FgIDAQIeAQIXgAAKCRCW+52yGfMzjUO7AP9nd0SjT5u7bVzZ7WIDNhKc3ux2nOv/
+ixSKtENArECA0wD8C9b7o0lW0bODrhoPWyi2GLhcy3M5LD5sDTZ9LmTugc60J1Ry
+dXN0aW4gSGV1aXNldW5nIExlZSA8dGxlZUByZWRoYXQuY29tPoh6BBMRCAAiBQJM
+FcvwAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjURTAP41
+zJKS3mNA0J2q0n/pAkqMd7EZ4SDGp/BG0lyKZvZyEAD/RZmkvpGWHemaNTRpuhed
+rHv7M0LnjMftrIVSpoyDynq0LlRydXN0aW4gSGV1aXNldW5nIExlZSA8dHJ1c3Rp
+bkBnbGVhbXlub2RlLm5ldD6IegQTEQgAIgUCTBXLywIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQlvudshnzM42ERwD6A6ge7K7+/QokKj/wFdTzgxOfocpV
+ttSqLxEsmhG04WoA/Rga2VZAQ6gHxgcCIx4Ot5XJJ1S/U6duv+jlYf1OT9HjtClU
+cnVzdGluIEhldWlzZXVuZyBMZWUgPHRydXN0aW5AZ21haWwuY29tPoh6BBMRCAAi
+BQJMFcsuAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjU1P
+AQCAhboUjDQx18iRbYdtpgeMZa2GP0Go25Ms/TsyKOx/dwD/YmAwU8c6cO1qf1vM
+UgqdOMpCjxTo+qUcbU8nIwrisJ65Aw0ETBXLLhAMAP43xB9VDluJa3m0EBTwOswy
+MgHbCJL6iK/MwvBGrTbwdu93jdhNBfjSUsEExMV3YsyIK/0oBDf1s33o6y51OZFP
+UC/NrUmx+QycHcSL8D75+D4M7324T6q3dqNpg0+jFTDixHi3FmNpj8NY+7iIS+Wr
+Q1qkBCfBbKkGrUe6lxgXksenvRoDQFrBndxlZ4JLKNdmY8UL8hhFDVO2ekD50iKL
+cXGTgRaFN3NlU2BLunC+ja0iGCnTVclvAznhmtw4QL7S9aqQIo00LhZlxfZyEQi4
+ljpSrB6aX1eu6VFCrsdldA3vJ31sCPhykrJhoEph6A92a0ewW94+Eun+m7YSVoU5
+noZj5IQlQ1YZ9acQN+7blEAqUBoresm6XJMo/ago2VooTt3bUQlKyoNJhZKfQBwX
+rQr60oskczUkVTMxy2KBTKqMV4BGWEdrkPrrs1wFXUXq8adNUHJ30X3y00Iy58VU
+aRZqLx/J9n+40LsERil+9YoajUMaxa9Xnl1eATq0kwADBQwAkJG2ODt7UZPzcPms
+4eE3az26d+jSPDqNnxgZPYxeW2pidwpva7homwLdIbMT6D52WU/DC+N9LNtuo/2h
+35hnHJ7fasEhXax+ArUzWBkdi61PxP31vM78fV5h7xxFJ2JPv4t6Wmqt2i+d9GCQ
+911lHGwtwV/iAVk4FY3i4f+bs0dkJs+yNhUWsVRzSd87cfvxij2jB7qtIB5aPWdc
+qRsZtSd5T51NtGmGtIrhVr988svcecOrdATU9qBBDTPDW5AacFIWu537nultWrot
+x6S7Wwm7mU8KnOP14b7BVB4rMiQJclSYjduBe+aWHNSxOJeZmAq0JBLdgIt+nerQ
+FeMr57q0q0qqooPIVvrVlxFxzXHZGISIt/JsrOUPJFkI95T7+2huRzNUHFmfHE3A
+eHrcLTsKRMe5nx4OYw/FDgk+qgFfUtUpu6RqH28WTlGtPW/6cZIkCyzc2wtAlpkp
+iiUdIA933CtSpEQ/KiDOj+gKsdtaZb9tiBkhke+OSd7JtoThiGEEGBEIAAkFAkwV
+yy4CGwwACgkQlvudshnzM41tWAD/Qq8DwaDw114pXn00eXN7Qck0v5F2xGpW5ktW
+CO7Aci0A/1mTmMrlJszx6YZuTkJHvAVGLVGR2/uo53VEYjcEN7vR
+=PCTs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQSuBEwVyy4RDAC9hprQuF4fCPCYdtMlb0Mfb+6G2TqerT1MebLm8/KHCRnPbFLg
+PwGgcyynLX5R2nXUb6oBZQByDN/Dal0UMuC19KeZX83LTcFE9vr516BMXLXXKmM9
+Hz5kygsu1iwP4oqow8U+ih16rxdYDmM3KUGhPqXYExpYH777NxaxxCyPJn7Mz/Lg
+QdPkO0awyl86sex6THr0fYJqR11XW2BkbK6Pfs5ubfxrMZxy1JujUw0UmzzEkQqU
+1+lncxecrevglH1R2WdIHx2sjkHQtwqT2rcsk9gJ8ISL4gKJ7LEYfLooKRwro54x
+WVi8Eu/XZ7OHfQfgF4+JDofIrd7zN0/Dia0qKpkZWJTrYhxj6ouvYqMPr7+XEBub
+eHFU6S7Zzo62zkm4dv6bAhvT/M1WWKih+dOvYJ6+qhBt9RsHJdUePAVYLOjTcvl1
+Dn7YKRczBpeiGQTGaquSkWh3HPCw9Eom5wPs/J1L5eeLdKoqyGUQvdGMJxuFLpSM
+BVN7Q1Voom8XBt8BALG8oGuCkFZUN6ukJQn1SWXGeBr4IUbFU9gnfZUVeLMpDACS
+erCIYBhSRHK2XaHWxPppw0yMm9e/eO6WWpVBZLd/cbxtxwJUandSfOhKn5bGRsGs
+phhWXjmT4w5DF3cngfe9aMSAV6xTwfnzJ5nSBwejU/UYCiKTnGVqVkMV1N546ZoO
+XCEJLRK8GeHzBXf4bvPW+4DVhfx/LBz3h8VJ0vy/cjkEqVWPCvb05WqZ7bhnk/kc
+N5F9NzHzCnze3fMfOtUnLgPCaAwWN3S9fJpKumhwAXdkp7qZv6CuvKsXsETmAPYe
+j9GYWiUpbL4bm4C+QEC18F9VkDs5BA3PhukNWutFcYJuRoJ6gYyUaA1PSqvcTaE4
+RM7Jjn3/fbMC+PQTNOYdixN5u+ASAsgjEDDaQJYj0Nzm8hy4uDbFH8TIqU/RLs6w
+pK8oLonItiu2UQWPnExvIN+iYGCfeMWDT8Lcx9cDxpshVZTEyjImPMlQBD3dE9Ov
+Fhh1nVjAZhyVvPbfshtBC+FphC4///lHumxAVJqu5oWdVj0cTlEqEAlOMNHBzJwM
+AIwXYkRklTogkJUCSZb8g1FB+fn6DJCu7CB4Fjd596IJn46fkCZKyxQ+L16KNl6Q
+g+oEhzsGWrpiHcBDZk7Oo5II4Ajjs2IiNhEkbUKbKn1aF3fdnpByOR07Qs0fKYCD
+xuUIgoW9aLtkJiXnQv9ddgpOvNpiqyBVs9dw4c9wWJon6q87dSRv3ZnvR+x64A0I
+82gtiE/gWnv9T7n1ri/P8J0/wMN9G4mL0bs7wTSSyd/rM2dDruYysYQ+CtMD8oIl
+VhV53qEB+5/IGb24OVileRPCVW7jGSdfWLbrV93C7GOh7gLsm+M7sZYqDTLgGkq/
+JNZSiVocTCxnZbi788kT+S6LsDdjYzGwqTqrdH/kOFToxMaen2mG37vB6BjA80t5
+lg79qALXIOKWPDI3UJ9LMavq8MXILghSbgJD78QwmPEROZh+ywN11cDw6yc1HSFw
+NrSZZuKPnj01amo5/Z2N9VMw/DWCYVA0HkPGnnxLsyboIA4tE2JR/QdNuy0CGrmn
+8LQyVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluLmxlZUBkYXRhYnJpY2tz
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJgXoAqAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zON6NwA/1oYHd9ChpQGGO/D
+lKwqijmomSpy5eEz/U8iJeq1eF8JAP9nOLHArkcDUvLqXxwPyY3SD2GE19khrbRD
+w25IWil3qLQsVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluQGxpbmVjb3Jw
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJan8rAAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zONyTkA/3PTaqRvtsm6iKSU
+FD2qe6805NtersLkzPJkChAHCp7SAP0VOOoX8tDOc7f4kkBDTnSwIYdLexqaWuwg
+7HUowhiSLrQhVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0QG1vdGQua3I+iJAEExEI
+ADgWIQSIWNRb6bJ2gCMYFVuW+52yGfMzjQUCWp/KjwIbAwULCQgHAgYVCgkICwIE
+FgIDAQIeAQIXgAAKCRCW+52yGfMzjUO7AP9nd0SjT5u7bVzZ7WIDNhKc3ux2nOv/
+ixSKtENArECA0wD8C9b7o0lW0bODrhoPWyi2GLhcy3M5LD5sDTZ9LmTugc60J1Ry
+dXN0aW4gSGV1aXNldW5nIExlZSA8dGxlZUByZWRoYXQuY29tPoh6BBMRCAAiBQJM
+FcvwAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjURTAP41
+zJKS3mNA0J2q0n/pAkqMd7EZ4SDGp/BG0lyKZvZyEAD/RZmkvpGWHemaNTRpuhed
+rHv7M0LnjMftrIVSpoyDynq0LlRydXN0aW4gSGV1aXNldW5nIExlZSA8dHJ1c3Rp
+bkBnbGVhbXlub2RlLm5ldD6IegQTEQgAIgUCTBXLywIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQlvudshnzM42ERwD6A6ge7K7+/QokKj/wFdTzgxOfocpV
+ttSqLxEsmhG04WoA/Rga2VZAQ6gHxgcCIx4Ot5XJJ1S/U6duv+jlYf1OT9HjtClU
+cnVzdGluIEhldWlzZXVuZyBMZWUgPHRydXN0aW5AZ21haWwuY29tPoh6BBMRCAAi
+BQJMFcsuAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjU1P
+AQCAhboUjDQx18iRbYdtpgeMZa2GP0Go25Ms/TsyKOx/dwD/YmAwU8c6cO1qf1vM
+UgqdOMpCjxTo+qUcbU8nIwrisJ65Aw0ETBXLLhAMAP43xB9VDluJa3m0EBTwOswy
+MgHbCJL6iK/MwvBGrTbwdu93jdhNBfjSUsEExMV3YsyIK/0oBDf1s33o6y51OZFP
+UC/NrUmx+QycHcSL8D75+D4M7324T6q3dqNpg0+jFTDixHi3FmNpj8NY+7iIS+Wr
+Q1qkBCfBbKkGrUe6lxgXksenvRoDQFrBndxlZ4JLKNdmY8UL8hhFDVO2ekD50iKL
+cXGTgRaFN3NlU2BLunC+ja0iGCnTVclvAznhmtw4QL7S9aqQIo00LhZlxfZyEQi4
+ljpSrB6aX1eu6VFCrsdldA3vJ31sCPhykrJhoEph6A92a0ewW94+Eun+m7YSVoU5
+noZj5IQlQ1YZ9acQN+7blEAqUBoresm6XJMo/ago2VooTt3bUQlKyoNJhZKfQBwX
+rQr60oskczUkVTMxy2KBTKqMV4BGWEdrkPrrs1wFXUXq8adNUHJ30X3y00Iy58VU
+aRZqLx/J9n+40LsERil+9YoajUMaxa9Xnl1eATq0kwADBQwAkJG2ODt7UZPzcPms
+4eE3az26d+jSPDqNnxgZPYxeW2pidwpva7homwLdIbMT6D52WU/DC+N9LNtuo/2h
+35hnHJ7fasEhXax+ArUzWBkdi61PxP31vM78fV5h7xxFJ2JPv4t6Wmqt2i+d9GCQ
+911lHGwtwV/iAVk4FY3i4f+bs0dkJs+yNhUWsVRzSd87cfvxij2jB7qtIB5aPWdc
+qRsZtSd5T51NtGmGtIrhVr988svcecOrdATU9qBBDTPDW5AacFIWu537nultWrot
+x6S7Wwm7mU8KnOP14b7BVB4rMiQJclSYjduBe+aWHNSxOJeZmAq0JBLdgIt+nerQ
+FeMr57q0q0qqooPIVvrVlxFxzXHZGISIt/JsrOUPJFkI95T7+2huRzNUHFmfHE3A
+eHrcLTsKRMe5nx4OYw/FDgk+qgFfUtUpu6RqH28WTlGtPW/6cZIkCyzc2wtAlpkp
+iiUdIA933CtSpEQ/KiDOj+gKsdtaZb9tiBkhke+OSd7JtoThiGEEGBEIAAkFAkwV
+yy4CGwwACgkQlvudshnzM41tWAD/Qq8DwaDw114pXn00eXN7Qck0v5F2xGpW5ktW
+CO7Aci0A/1mTmMrlJszx6YZuTkJHvAVGLVGR2/uo53VEYjcEN7vR
+=PCTs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qke8BUYtUZHb+6jndURiNwQ3u9E=
+=NSh+
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qke8BUYtUZHb+6jndURiNwQ3u9E=
+=NSh+
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qke8BUYtUZHb+6jndURiNwQ3u9E=
+=NSh+
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQSuBEwVyy4RDAC9hprQuF4fCPCYdtMlb0Mfb+6G2TqerT1MebLm8/KHCRnPbFLg
+PwGgcyynLX5R2nXUb6oBZQByDN/Dal0UMuC19KeZX83LTcFE9vr516BMXLXXKmM9
+Hz5kygsu1iwP4oqow8U+ih16rxdYDmM3KUGhPqXYExpYH777NxaxxCyPJn7Mz/Lg
+QdPkO0awyl86sex6THr0fYJqR11XW2BkbK6Pfs5ubfxrMZxy1JujUw0UmzzEkQqU
+1+lncxecrevglH1R2WdIHx2sjkHQtwqT2rcsk9gJ8ISL4gKJ7LEYfLooKRwro54x
+WVi8Eu/XZ7OHfQfgF4+JDofIrd7zN0/Dia0qKpkZWJTrYhxj6ouvYqMPr7+XEBub
+eHFU6S7Zzo62zkm4dv6bAhvT/M1WWKih+dOvYJ6+qhBt9RsHJdUePAVYLOjTcvl1
+Dn7YKRczBpeiGQTGaquSkWh3HPCw9Eom5wPs/J1L5eeLdKoqyGUQvdGMJxuFLpSM
+BVN7Q1Voom8XBt8BALG8oGuCkFZUN6ukJQn1SWXGeBr4IUbFU9gnfZUVeLMpDACS
+erCIYBhSRHK2XaHWxPppw0yMm9e/eO6WWpVBZLd/cbxtxwJUandSfOhKn5bGRsGs
+phhWXjmT4w5DF3cngfe9aMSAV6xTwfnzJ5nSBwejU/UYCiKTnGVqVkMV1N546ZoO
+XCEJLRK8GeHzBXf4bvPW+4DVhfx/LBz3h8VJ0vy/cjkEqVWPCvb05WqZ7bhnk/kc
+N5F9NzHzCnze3fMfOtUnLgPCaAwWN3S9fJpKumhwAXdkp7qZv6CuvKsXsETmAPYe
+j9GYWiUpbL4bm4C+QEC18F9VkDs5BA3PhukNWutFcYJuRoJ6gYyUaA1PSqvcTaE4
+RM7Jjn3/fbMC+PQTNOYdixN5u+ASAsgjEDDaQJYj0Nzm8hy4uDbFH8TIqU/RLs6w
+pK8oLonItiu2UQWPnExvIN+iYGCfeMWDT8Lcx9cDxpshVZTEyjImPMlQBD3dE9Ov
+Fhh1nVjAZhyVvPbfshtBC+FphC4///lHumxAVJqu5oWdVj0cTlEqEAlOMNHBzJwM
+AIwXYkRklTogkJUCSZb8g1FB+fn6DJCu7CB4Fjd596IJn46fkCZKyxQ+L16KNl6Q
+g+oEhzsGWrpiHcBDZk7Oo5II4Ajjs2IiNhEkbUKbKn1aF3fdnpByOR07Qs0fKYCD
+xuUIgoW9aLtkJiXnQv9ddgpOvNpiqyBVs9dw4c9wWJon6q87dSRv3ZnvR+x64A0I
+82gtiE/gWnv9T7n1ri/P8J0/wMN9G4mL0bs7wTSSyd/rM2dDruYysYQ+CtMD8oIl
+VhV53qEB+5/IGb24OVileRPCVW7jGSdfWLbrV93C7GOh7gLsm+M7sZYqDTLgGkq/
+JNZSiVocTCxnZbi788kT+S6LsDdjYzGwqTqrdH/kOFToxMaen2mG37vB6BjA80t5
+lg79qALXIOKWPDI3UJ9LMavq8MXILghSbgJD78QwmPEROZh+ywN11cDw6yc1HSFw
+NrSZZuKPnj01amo5/Z2N9VMw/DWCYVA0HkPGnnxLsyboIA4tE2JR/QdNuy0CGrmn
+8LQyVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluLmxlZUBkYXRhYnJpY2tz
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJgXoAqAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zON6NwA/1oYHd9ChpQGGO/D
+lKwqijmomSpy5eEz/U8iJeq1eF8JAP9nOLHArkcDUvLqXxwPyY3SD2GE19khrbRD
+w25IWil3qLQsVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluQGxpbmVjb3Jw
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJan8rAAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zONyTkA/3PTaqRvtsm6iKSU
+FD2qe6805NtersLkzPJkChAHCp7SAP0VOOoX8tDOc7f4kkBDTnSwIYdLexqaWuwg
+7HUowhiSLrQhVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0QG1vdGQua3I+iJAEExEI
+ADgWIQSIWNRb6bJ2gCMYFVuW+52yGfMzjQUCWp/KjwIbAwULCQgHAgYVCgkICwIE
+FgIDAQIeAQIXgAAKCRCW+52yGfMzjUO7AP9nd0SjT5u7bVzZ7WIDNhKc3ux2nOv/
+ixSKtENArECA0wD8C9b7o0lW0bODrhoPWyi2GLhcy3M5LD5sDTZ9LmTugc60J1Ry
+dXN0aW4gSGV1aXNldW5nIExlZSA8dGxlZUByZWRoYXQuY29tPoh6BBMRCAAiBQJM
+FcvwAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjURTAP41
+zJKS3mNA0J2q0n/pAkqMd7EZ4SDGp/BG0lyKZvZyEAD/RZmkvpGWHemaNTRpuhed
+rHv7M0LnjMftrIVSpoyDynq0LlRydXN0aW4gSGV1aXNldW5nIExlZSA8dHJ1c3Rp
+bkBnbGVhbXlub2RlLm5ldD6IegQTEQgAIgUCTBXLywIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQlvudshnzM42ERwD6A6ge7K7+/QokKj/wFdTzgxOfocpV
+ttSqLxEsmhG04WoA/Rga2VZAQ6gHxgcCIx4Ot5XJJ1S/U6duv+jlYf1OT9HjtClU
+cnVzdGluIEhldWlzZXVuZyBMZWUgPHRydXN0aW5AZ21haWwuY29tPoh6BBMRCAAi
+BQJMFcsuAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjU1P
+AQCAhboUjDQx18iRbYdtpgeMZa2GP0Go25Ms/TsyKOx/dwD/YmAwU8c6cO1qf1vM
+UgqdOMpCjxTo+qUcbU8nIwrisJ65Aw0ETBXLLhAMAP43xB9VDluJa3m0EBTwOswy
+MgHbCJL6iK/MwvBGrTbwdu93jdhNBfjSUsEExMV3YsyIK/0oBDf1s33o6y51OZFP
+UC/NrUmx+QycHcSL8D75+D4M7324T6q3dqNpg0+jFTDixHi3FmNpj8NY+7iIS+Wr
+Q1qkBCfBbKkGrUe6lxgXksenvRoDQFrBndxlZ4JLKNdmY8UL8hhFDVO2ekD50iKL
+cXGTgRaFN3NlU2BLunC+ja0iGCnTVclvAznhmtw4QL7S9aqQIo00LhZlxfZyEQi4
+ljpSrB6aX1eu6VFCrsdldA3vJ31sCPhykrJhoEph6A92a0ewW94+Eun+m7YSVoU5
+noZj5IQlQ1YZ9acQN+7blEAqUBoresm6XJMo/ago2VooTt3bUQlKyoNJhZKfQBwX
+rQr60oskczUkVTMxy2KBTKqMV4BGWEdrkPrrs1wFXUXq8adNUHJ30X3y00Iy58VU
+aRZqLx/J9n+40LsERil+9YoajUMaxa9Xnl1eATq0kwADBQwAkJG2ODt7UZPzcPms
+4eE3az26d+jSPDqNnxgZPYxeW2pidwpva7homwLdIbMT6D52WU/DC+N9LNtuo/2h
+35hnHJ7fasEhXax+ArUzWBkdi61PxP31vM78fV5h7xxFJ2JPv4t6Wmqt2i+d9GCQ
+911lHGwtwV/iAVk4FY3i4f+bs0dkJs+yNhUWsVRzSd87cfvxij2jB7qtIB5aPWdc
+qRsZtSd5T51NtGmGtIrhVr988svcecOrdATU9qBBDTPDW5AacFIWu537nultWrot
+x6S7Wwm7mU8KnOP14b7BVB4rMiQJclSYjduBe+aWHNSxOJeZmAq0JBLdgIt+nerQ
+FeMr57q0q0qqooPIVvrVlxFxzXHZGISIt/JsrOUPJFkI95T7+2huRzNUHFmfHE3A
+eHrcLTsKRMe5nx4OYw/FDgk+qgFfUtUpu6RqH28WTlGtPW/6cZIkCyzc2wtAlpkp
+iiUdIA933CtSpEQ/KiDOj+gKsdtaZb9tiBkhke+OSd7JtoThiGEEGBEIAAkFAkwV
+yy4CGwwACgkQlvudshnzM41tWAD/Qq8DwaDw114pXn00eXN7Qck0v5F2xGpW5ktW
+CO7Aci0A/1mTmMrlJszx6YZuTkJHvAVGLVGR2/uo53VEYjcEN7vR
+=PCTs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    96FB9DB219F3338D
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+uid    Trustin Heuiseung Lee <[email protected]>
+
+sub    684EB33FB007E676
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQSuBEwVyy4RDAC9hprQuF4fCPCYdtMlb0Mfb+6G2TqerT1MebLm8/KHCRnPbFLg
+PwGgcyynLX5R2nXUb6oBZQByDN/Dal0UMuC19KeZX83LTcFE9vr516BMXLXXKmM9
+Hz5kygsu1iwP4oqow8U+ih16rxdYDmM3KUGhPqXYExpYH777NxaxxCyPJn7Mz/Lg
+QdPkO0awyl86sex6THr0fYJqR11XW2BkbK6Pfs5ubfxrMZxy1JujUw0UmzzEkQqU
+1+lncxecrevglH1R2WdIHx2sjkHQtwqT2rcsk9gJ8ISL4gKJ7LEYfLooKRwro54x
+WVi8Eu/XZ7OHfQfgF4+JDofIrd7zN0/Dia0qKpkZWJTrYhxj6ouvYqMPr7+XEBub
+eHFU6S7Zzo62zkm4dv6bAhvT/M1WWKih+dOvYJ6+qhBt9RsHJdUePAVYLOjTcvl1
+Dn7YKRczBpeiGQTGaquSkWh3HPCw9Eom5wPs/J1L5eeLdKoqyGUQvdGMJxuFLpSM
+BVN7Q1Voom8XBt8BALG8oGuCkFZUN6ukJQn1SWXGeBr4IUbFU9gnfZUVeLMpDACS
+erCIYBhSRHK2XaHWxPppw0yMm9e/eO6WWpVBZLd/cbxtxwJUandSfOhKn5bGRsGs
+phhWXjmT4w5DF3cngfe9aMSAV6xTwfnzJ5nSBwejU/UYCiKTnGVqVkMV1N546ZoO
+XCEJLRK8GeHzBXf4bvPW+4DVhfx/LBz3h8VJ0vy/cjkEqVWPCvb05WqZ7bhnk/kc
+N5F9NzHzCnze3fMfOtUnLgPCaAwWN3S9fJpKumhwAXdkp7qZv6CuvKsXsETmAPYe
+j9GYWiUpbL4bm4C+QEC18F9VkDs5BA3PhukNWutFcYJuRoJ6gYyUaA1PSqvcTaE4
+RM7Jjn3/fbMC+PQTNOYdixN5u+ASAsgjEDDaQJYj0Nzm8hy4uDbFH8TIqU/RLs6w
+pK8oLonItiu2UQWPnExvIN+iYGCfeMWDT8Lcx9cDxpshVZTEyjImPMlQBD3dE9Ov
+Fhh1nVjAZhyVvPbfshtBC+FphC4///lHumxAVJqu5oWdVj0cTlEqEAlOMNHBzJwM
+AIwXYkRklTogkJUCSZb8g1FB+fn6DJCu7CB4Fjd596IJn46fkCZKyxQ+L16KNl6Q
+g+oEhzsGWrpiHcBDZk7Oo5II4Ajjs2IiNhEkbUKbKn1aF3fdnpByOR07Qs0fKYCD
+xuUIgoW9aLtkJiXnQv9ddgpOvNpiqyBVs9dw4c9wWJon6q87dSRv3ZnvR+x64A0I
+82gtiE/gWnv9T7n1ri/P8J0/wMN9G4mL0bs7wTSSyd/rM2dDruYysYQ+CtMD8oIl
+VhV53qEB+5/IGb24OVileRPCVW7jGSdfWLbrV93C7GOh7gLsm+M7sZYqDTLgGkq/
+JNZSiVocTCxnZbi788kT+S6LsDdjYzGwqTqrdH/kOFToxMaen2mG37vB6BjA80t5
+lg79qALXIOKWPDI3UJ9LMavq8MXILghSbgJD78QwmPEROZh+ywN11cDw6yc1HSFw
+NrSZZuKPnj01amo5/Z2N9VMw/DWCYVA0HkPGnnxLsyboIA4tE2JR/QdNuy0CGrmn
+8LQyVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluLmxlZUBkYXRhYnJpY2tz
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJgXoAqAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zON6NwA/1oYHd9ChpQGGO/D
+lKwqijmomSpy5eEz/U8iJeq1eF8JAP9nOLHArkcDUvLqXxwPyY3SD2GE19khrbRD
+w25IWil3qLQsVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0cnVzdGluQGxpbmVjb3Jw
+LmNvbT6IkAQTEQgAOBYhBIhY1FvpsnaAIxgVW5b7nbIZ8zONBQJan8rAAhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEJb7nbIZ8zONyTkA/3PTaqRvtsm6iKSU
+FD2qe6805NtersLkzPJkChAHCp7SAP0VOOoX8tDOc7f4kkBDTnSwIYdLexqaWuwg
+7HUowhiSLrQhVHJ1c3RpbiBIZXVpc2V1bmcgTGVlIDx0QG1vdGQua3I+iJAEExEI
+ADgWIQSIWNRb6bJ2gCMYFVuW+52yGfMzjQUCWp/KjwIbAwULCQgHAgYVCgkICwIE
+FgIDAQIeAQIXgAAKCRCW+52yGfMzjUO7AP9nd0SjT5u7bVzZ7WIDNhKc3ux2nOv/
+ixSKtENArECA0wD8C9b7o0lW0bODrhoPWyi2GLhcy3M5LD5sDTZ9LmTugc60J1Ry
+dXN0aW4gSGV1aXNldW5nIExlZSA8dGxlZUByZWRoYXQuY29tPoh6BBMRCAAiBQJM
+FcvwAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjURTAP41
+zJKS3mNA0J2q0n/pAkqMd7EZ4SDGp/BG0lyKZvZyEAD/RZmkvpGWHemaNTRpuhed
+rHv7M0LnjMftrIVSpoyDynq0LlRydXN0aW4gSGV1aXNldW5nIExlZSA8dHJ1c3Rp
+bkBnbGVhbXlub2RlLm5ldD6IegQTEQgAIgUCTBXLywIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQlvudshnzM42ERwD6A6ge7K7+/QokKj/wFdTzgxOfocpV
+ttSqLxEsmhG04WoA/Rga2VZAQ6gHxgcCIx4Ot5XJJ1S/U6duv+jlYf1OT9HjtClU
+cnVzdGluIEhldWlzZXVuZyBMZWUgPHRydXN0aW5AZ21haWwuY29tPoh6BBMRCAAi
+BQJMFcsuAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCW+52yGfMzjU1P
+AQCAhboUjDQx18iRbYdtpgeMZa2GP0Go25Ms/TsyKOx/dwD/YmAwU8c6cO1qf1vM
+UgqdOMpCjxTo+qUcbU8nIwrisJ65Aw0ETBXLLhAMAP43xB9VDluJa3m0EBTwOswy
+MgHbCJL6iK/MwvBGrTbwdu93jdhNBfjSUsEExMV3YsyIK/0oBDf1s33o6y51OZFP
+UC/NrUmx+QycHcSL8D75+D4M7324T6q3dqNpg0+jFTDixHi3FmNpj8NY+7iIS+Wr
+Q1qkBCfBbKkGrUe6lxgXksenvRoDQFrBndxlZ4JLKNdmY8UL8hhFDVO2ekD50iKL
+cXGTgRaFN3NlU2BLunC+ja0iGCnTVclvAznhmtw4QL7S9aqQIo00LhZlxfZyEQi4
+ljpSrB6aX1eu6VFCrsdldA3vJ31sCPhykrJhoEph6A92a0ewW94+Eun+m7YSVoU5
+noZj5IQlQ1YZ9acQN+7blEAqUBoresm6XJMo/ago2VooTt3bUQlKyoNJhZKfQBwX
+rQr60oskczUkVTMxy2KBTKqMV4BGWEdrkPrrs1wFXUXq8adNUHJ30X3y00Iy58VU
+aRZqLx/J9n+40LsERil+9YoajUMaxa9Xnl1eATq0kwADBQwAkJG2ODt7UZPzcPms
+4eE3az26d+jSPDqNnxgZPYxeW2pidwpva7homwLdIbMT6D52WU/DC+N9LNtuo/2h
+35hnHJ7fasEhXax+ArUzWBkdi61PxP31vM78fV5h7xxFJ2JPv4t6Wmqt2i+d9GCQ
+911lHGwtwV/iAVk4FY3i4f+bs0dkJs+yNhUWsVRzSd87cfvxij2jB7qtIB5aPWdc
+qRsZtSd5T51NtGmGtIrhVr988svcecOrdATU9qBBDTPDW5AacFIWu537nultWrot
+x6S7Wwm7mU8KnOP14b7BVB4rMiQJclSYjduBe+aWHNSxOJeZmAq0JBLdgIt+nerQ
+FeMr57q0q0qqooPIVvrVlxFxzXHZGISIt/JsrOUPJFkI95T7+2huRzNUHFmfHE3A
+eHrcLTsKRMe5nx4OYw/FDgk+qgFfUtUpu6RqH28WTlGtPW/6cZIkCyzc2wtAlpkp
+iiUdIA933CtSpEQ/KiDOj+gKsdtaZb9tiBkhke+OSd7JtoThiGEEGBEIAAkFAkwV
+yy4CGwwACgkQlvudshnzM41tWAD/Qq8DwaDw114pXn00eXN7Qck0v5F2xGpW5ktW
+CO7Aci0A/1mTmMrlJszx6YZuTkJHvAVGLVGR2/uo53VEYjcEN7vR
+=PCTs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5ED22F661BBF0ACC
+sub    31ADCD8BFCB760B4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBExyNhsRBAC/W5cMapoP7NUn8S22iWG5bPw0bconApJHP4kQdT17gT2JgNJz
+BmuGWV59ZOGQkc6woeFKc1s6twlsgIL51jMeVOtgLJRGTS4So2hthNqDcgO4j8Lm
+yXpqbTkbD7/ZlRzL2hhedrMz4NQOZCvsZpQ1RaCDrr2hxDq/HhD2omGdlwCg/9Mt
+JNc7897LgfCMmtPOvAFt+rsD/0K87nvW37nlRqHdEtzvwUlyLJmYxdW9hDr8tm4Q
+Y/8rDvNFlhKV/yXmxQuhtgQ1qpBo75dwD86aJmzIMIWM0iei9Ecfu2DsWiWvArq1
+heDjMYSeQl6k37cmD59afo6e/jQmg2/ALC6mRf3912SfmqV5spw0k+NYdFxAnbot
+9jOfA/41shIdZloZ0aDcJDTNe22wFFh2sW8RwWtJJO8rmOCgh3MmkPn7LHPI9idJ
+bSdD1dRcR7UTyeigEeDTu0PAKfKZutc91lfcIGSZdk39SEEhUkL2JdPKVRBotiZZ
+Jsi+NxDdsprF/yQtr00XSGJYzh2TW/Srnb5nZQm2Iyokod3M1rkCDQRMcjYbEAgA
+k0wzZq25ZX73DIlxw30u8Qmy0HM2cVmRe45Pj857FlSQsO82YNPOMxSkACCmHAAT
+3pACuMCf5Z0HO5iLbHrxegFPGWLkNE3CJ5yga1zIiFgzNc9qNqWtPQISJIQjABit
+4SseMY8i+3t6A89NjWc/AOK1BloHdjAmtvT54oYtqFYCMlNMtCLaR6ioSUH38qLV
+jXtFvmTY4OqokNaz6JXxzTymyo8gJff9JRpcm2S2Xksr0dLNYm5QwJEN7KX4E8iH
+8Rz8TWxfAhrf0zn45D7bgHOk3JFPEXzKGV1l96Tb5h/yy9wuN4JePyXDGfigub+1
+grV5DBKQ3srkEwy6iwAYwwADBQf+LXoUj24Evhce+OJ9ZCaPEppmV6xJ+LaU/9D1
+hwMkQ6CXc0IH3oeNGAbbOHhXM2GymRfg8nmzbIHVueTP8ISeO7Dc+gMr7l7l5kB1
+W7IstMlS1xI3Vdg9D8HaPJa5gB3qEGrIPdDP1KRRwJflw+DmQXB5jOj4vW1xECqX
+0bGY9XNFFaSMhkr5XRVT3xgQ8d0wuCB9otuUZC9pxmwFiH2w/FvKzMTKMRwK4IRO
+n5FPhSO2VBHBnlvF/mSbED22jjB7DngUC4rF0fE1MrA6DDJIAKrsDlk0VI7x/tIO
+YbkEOyypDgBf4JLrxgrI6jn3iCRdmi51hS7dtXX3ZIkmDVJrOYhJBBgRAgAJBQJM
+cjYbAhsMAAoJEF7SL2YbvwrMplIAoP5GSTgknFm3ONZ/W59iK+l+XJWhAJ9Bru7L
+aSKZGs7jwqXqGNrZ0ZzxNw==
+=HDKU
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5ED22F661BBF0ACC
+sub    31ADCD8BFCB760B4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBExyNhsRBAC/W5cMapoP7NUn8S22iWG5bPw0bconApJHP4kQdT17gT2JgNJz
+BmuGWV59ZOGQkc6woeFKc1s6twlsgIL51jMeVOtgLJRGTS4So2hthNqDcgO4j8Lm
+yXpqbTkbD7/ZlRzL2hhedrMz4NQOZCvsZpQ1RaCDrr2hxDq/HhD2omGdlwCg/9Mt
+JNc7897LgfCMmtPOvAFt+rsD/0K87nvW37nlRqHdEtzvwUlyLJmYxdW9hDr8tm4Q
+Y/8rDvNFlhKV/yXmxQuhtgQ1qpBo75dwD86aJmzIMIWM0iei9Ecfu2DsWiWvArq1
+heDjMYSeQl6k37cmD59afo6e/jQmg2/ALC6mRf3912SfmqV5spw0k+NYdFxAnbot
+9jOfA/41shIdZloZ0aDcJDTNe22wFFh2sW8RwWtJJO8rmOCgh3MmkPn7LHPI9idJ
+bSdD1dRcR7UTyeigEeDTu0PAKfKZutc91lfcIGSZdk39SEEhUkL2JdPKVRBotiZZ
+Jsi+NxDdsprF/yQtr00XSGJYzh2TW/Srnb5nZQm2Iyokod3M1rkCDQRMcjYbEAgA
+k0wzZq25ZX73DIlxw30u8Qmy0HM2cVmRe45Pj857FlSQsO82YNPOMxSkACCmHAAT
+3pACuMCf5Z0HO5iLbHrxegFPGWLkNE3CJ5yga1zIiFgzNc9qNqWtPQISJIQjABit
+4SseMY8i+3t6A89NjWc/AOK1BloHdjAmtvT54oYtqFYCMlNMtCLaR6ioSUH38qLV
+jXtFvmTY4OqokNaz6JXxzTymyo8gJff9JRpcm2S2Xksr0dLNYm5QwJEN7KX4E8iH
+8Rz8TWxfAhrf0zn45D7bgHOk3JFPEXzKGV1l96Tb5h/yy9wuN4JePyXDGfigub+1
+grV5DBKQ3srkEwy6iwAYwwADBQf+LXoUj24Evhce+OJ9ZCaPEppmV6xJ+LaU/9D1
+hwMkQ6CXc0IH3oeNGAbbOHhXM2GymRfg8nmzbIHVueTP8ISeO7Dc+gMr7l7l5kB1
+W7IstMlS1xI3Vdg9D8HaPJa5gB3qEGrIPdDP1KRRwJflw+DmQXB5jOj4vW1xECqX
+0bGY9XNFFaSMhkr5XRVT3xgQ8d0wuCB9otuUZC9pxmwFiH2w/FvKzMTKMRwK4IRO
+n5FPhSO2VBHBnlvF/mSbED22jjB7DngUC4rF0fE1MrA6DDJIAKrsDlk0VI7x/tIO
+YbkEOyypDgBf4JLrxgrI6jn3iCRdmi51hS7dtXX3ZIkmDVJrOYhJBBgRAgAJBQJM
+cjYbAhsMAAoJEF7SL2YbvwrMplIAoP5GSTgknFm3ONZ/W59iK+l+XJWhAJ9Bru7L
+aSKZGs7jwqXqGNrZ0ZzxNw==
+=HDKU
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    F6D4A1D411E9D1AE
+sub    B5CB27F94F97173B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE89LqsBCAC/C7QToaRF8eZgGOxcvp9aG+mFFCMjaRAb4Mh59OYdmUb6ZjfO
+9388HPebGbPNR8SHYs0dBIuWY4ZJ7oUTYPswasL8vB0iPFdyHhvkCca+yk0b8ZBM
+DmFlISm9HkYpoVjcFUp1oivyeJ5LRTJTd5JGEd/SWFRbB4TimdKXBzej9fIm2zVl
+KInEMMd8HnSYE6nm3aNkbyiqhx81bFvl8x6X3ZMWcKs+TAVXdP9uLVvWowUwcApk
+xpee442Ld1QfzMqdDnA6bGrp8LN8PZF9AXQ9Z6LTQL3p9PIq/6LPueQjpJWM+2j8
+BfhbW/F2kyHRwVNkjaa68A544shgxJcrxWzJABEBAAG5AQ0ETz0uqwEIALmEZ0xN
+tuX1cLsNUzzq0HVzwDiw5IquPWy33McESXvkaMyqyQtYisW++dY06MxBCS3uV4+1
+nKI6oA7Lk482ixwzbwws0Rb8H5CeLHDEwGXfthmLAvDdxoNCUYAtpVOMGcbGpy51
+TG3V9i9JWe1px+kvhieX9BLfDzP4Pldho9lK2gYRhmpPDgUOjYZgiQXMmIPAYfdH
+IA/VdYTETC0lu4Adb56SzOwvGMpnd3rXWUiJbZg7lW97hvbOFMKudbNjBCrF7LhW
+Ah089MU9rvunuz7mquVdNtfEBkdVrqZJdvYiFBee4RUe3+qGCpHnLzynOGHr+iIt
+DG73NR9fZCzl1K8AEQEAAYkBHwQYAQIACQUCTz0uqwIbDAAKCRD21KHUEenRrp0k
+B/wPuP2W69oweOqtSRDf1FeFNzAUIjbwjkg/bTjzJwb1cyedx7rbxhpJmn27W8A2
+WjfmDLOn4orQTKoxf3kP6SeeGhYLkzxjBa5Rco89p/6X35By6VR4LPFeTOACyE7b
+cAjqPFb+7t1YzvnmuZIgpvTKickq1D9g7+JT1Qd9nqBFKlg8aMngAooVvlLXaPEw
+Q1XfkfMN+ltwlEr7o1ts/YzDUxflaFVg0FnN7qezam/s7VvcK46rO95yQr/Wyz2o
+VDzc34e+Nr/b2pN05MDHA0dXmb/irwPBl0mTOgAgC805qkR14xhd1GeL6MEA34k8
+2Sq/O3gWhBaB3KOy55/lvvKp
+=CmMl
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0729A0AFF8999A87
+sub    6005789E24E5AD1E
+sub    6A0975F8B1127B83
+sub    3FF44D37464BBB7E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+khD1P8/4BedOSN7DqsnvIUfFaQ==
+=33eI
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A40E24B5B408DBD5
+uid    Robolectric Developers <[email protected]>
+
+sub    6A2038967E03726F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFRdA40BCAC0zSALsOjfjr+gO8q+HV4qPWuIRB8S4z//jCEpKypyCRR9sA0W
+IDHG6OqG5fO1bP6VsHvSx32E8YUf0bi8eGgpKj5gJ9jmausRvRHtUHJ0pvZRBw51
+z4amYVr+NdVoyqLXBgBYeFlEYI04rQH9W8r1bCk8RKGJFNvO6ikTN9opLRkvZ7A6
+7VKlQGMd0sSJ3MAhzKUkM+ZWeCb/TG0xSrhJHcrFUORdV5zaX61anOTSst4HOTuL
+ByIZq1RMxKP4UJIWH2NYVUC1Bdn5CbY5mJysqQXjobPwG/cNAyBjsDBCh2VMnFY6
+geCHL3BowNd8gHUr0wjGKOipRmyfOJoTspMfABEBAAG0NVJvYm9sZWN0cmljIERl
+dmVsb3BlcnMgPHJvYm9sZWN0cmljQGdvb2dsZWdyb3Vwcy5jb20+iQE4BBMBAgAi
+BQJUXQONAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCkDiS1tAjb1Z24
+B/4iAEYvEFhBGjOuXhAPmZSyYyiHWrehY2yZGKmjPKoDKxD05PC6lCNOsdYn5WQ4
+sO32Yi2MbCRpOdphJDJORuGapMeEdrbNqAZ3kzCyMEI7AojH70B7/g99bY9bLq4c
+MYS1udCVPBzfNNSZok22S54fJmFg1evzJbOynZnIFKAhSWL1Ns0zQ9RXQ3gddhAF
+zE1ciZTwmRwdkObd/oxjs/g5ps3VuB25b88+WxGRaZf1vlZN8fNvK4AEDhbH/j5+
+VjcI7R5zLVsYNHEZSspckuoxn+1PNOKDZvhrSrDlqf1EUSmPb4j/nrW07c1p/91/
+T/R02aGSzbwqbbI17ZuxYMU3uQENBFRdA40BCADhMeWEVcUNBLRWDatdlvc7q3jZ
+EyejhSl3zw0I15yhoBbuW+ZnOTG4fkIr9SRo4whm2NZ7eemEnQ6tuGhVXUqPIxWA
+wBteY0ZBhwNGhMql+IIdOE9WIo82yV4gj1Lo2rjxaxG4Rd7FQnys5f+XyFZ8vaXp
+mpH9VeFjc1Ls550DUP8iVvIoKI65Ve5RMZc9e3AeP8FZqJpc3q+Al2f/FAO8+tiD
+/J849aP4aqUKiwvHk/nxle8FwepQyvXRrSpFNz2uK5bgIXQrxgcKLPjl6s9l8SKn
+Twg6ok0EcJjGuHjzCeFNp/WFpAeJAxmAZ/qUbr0TBp6jxXoMc/RqdO79MPX5ABEB
+AAGJAR8EGAECAAkFAlRdA40CGwwACgkQpA4ktbQI29WOzgf8D487fhQSsH87OJfp
+oSPf9p2wGzgNFAc+sb0gUy8rMmc/xySKGfZ2BZFT/CAQsOzGZ/KSM3og+FFgDcm8
+GWpSfZNymXnmM8aCaEyNj4arENxwhU4BEnKYFf8PIDoCjAqBbSWuTa2RzaWlawEE
+g4hItheFmw/My/tbo62N4zn98IYU//50PNDuDb1lvOi4SVFglXRoM+jS2X6E9R3Z
+7sYceClr2EDN2k+RbvB6ngOiu52FvC9ZZPJnfK9/XHFtKcQ64yu3pbeXwiuqyr4T
+SpzGJNm7czyVylHZfvkZYVhmZCEG9xQ0lzHshaXmkfqi5ZJMEtXwNP1dWIMhIGgY
+4aLehw==
+=LRPz
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A40E24B5B408DBD5
+uid    Robolectric Developers <[email protected]>
+
+sub    6A2038967E03726F
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFRdA40BCAC0zSALsOjfjr+gO8q+HV4qPWuIRB8S4z//jCEpKypyCRR9sA0W
+IDHG6OqG5fO1bP6VsHvSx32E8YUf0bi8eGgpKj5gJ9jmausRvRHtUHJ0pvZRBw51
+z4amYVr+NdVoyqLXBgBYeFlEYI04rQH9W8r1bCk8RKGJFNvO6ikTN9opLRkvZ7A6
+7VKlQGMd0sSJ3MAhzKUkM+ZWeCb/TG0xSrhJHcrFUORdV5zaX61anOTSst4HOTuL
+ByIZq1RMxKP4UJIWH2NYVUC1Bdn5CbY5mJysqQXjobPwG/cNAyBjsDBCh2VMnFY6
+geCHL3BowNd8gHUr0wjGKOipRmyfOJoTspMfABEBAAG0NVJvYm9sZWN0cmljIERl
+dmVsb3BlcnMgPHJvYm9sZWN0cmljQGdvb2dsZWdyb3Vwcy5jb20+iQE4BBMBAgAi
+BQJUXQONAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCkDiS1tAjb1Z24
+B/4iAEYvEFhBGjOuXhAPmZSyYyiHWrehY2yZGKmjPKoDKxD05PC6lCNOsdYn5WQ4
+sO32Yi2MbCRpOdphJDJORuGapMeEdrbNqAZ3kzCyMEI7AojH70B7/g99bY9bLq4c
+MYS1udCVPBzfNNSZok22S54fJmFg1evzJbOynZnIFKAhSWL1Ns0zQ9RXQ3gddhAF
+zE1ciZTwmRwdkObd/oxjs/g5ps3VuB25b88+WxGRaZf1vlZN8fNvK4AEDhbH/j5+
+VjcI7R5zLVsYNHEZSspckuoxn+1PNOKDZvhrSrDlqf1EUSmPb4j/nrW07c1p/91/
+T/R02aGSzbwqbbI17ZuxYMU3uQENBFRdA40BCADhMeWEVcUNBLRWDatdlvc7q3jZ
+EyejhSl3zw0I15yhoBbuW+ZnOTG4fkIr9SRo4whm2NZ7eemEnQ6tuGhVXUqPIxWA
+wBteY0ZBhwNGhMql+IIdOE9WIo82yV4gj1Lo2rjxaxG4Rd7FQnys5f+XyFZ8vaXp
+mpH9VeFjc1Ls550DUP8iVvIoKI65Ve5RMZc9e3AeP8FZqJpc3q+Al2f/FAO8+tiD
+/J849aP4aqUKiwvHk/nxle8FwepQyvXRrSpFNz2uK5bgIXQrxgcKLPjl6s9l8SKn
+Twg6ok0EcJjGuHjzCeFNp/WFpAeJAxmAZ/qUbr0TBp6jxXoMc/RqdO79MPX5ABEB
+AAGJAR8EGAECAAkFAlRdA40CGwwACgkQpA4ktbQI29WOzgf8D487fhQSsH87OJfp
+oSPf9p2wGzgNFAc+sb0gUy8rMmc/xySKGfZ2BZFT/CAQsOzGZ/KSM3og+FFgDcm8
+GWpSfZNymXnmM8aCaEyNj4arENxwhU4BEnKYFf8PIDoCjAqBbSWuTa2RzaWlawEE
+g4hItheFmw/My/tbo62N4zn98IYU//50PNDuDb1lvOi4SVFglXRoM+jS2X6E9R3Z
+7sYceClr2EDN2k+RbvB6ngOiu52FvC9ZZPJnfK9/XHFtKcQ64yu3pbeXwiuqyr4T
+SpzGJNm7czyVylHZfvkZYVhmZCEG9xQ0lzHshaXmkfqi5ZJMEtXwNP1dWIMhIGgY
+4aLehw==
+=LRPz
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9DAADC1C9FCC82D0
+uid    Benedikt Ritter (CODE SIGNING KEY) <[email protected]>
+
+sub    923C08F9417B222D
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFKws7QBEADEy9+PqF0cjeS1yG4xMRBV+teFNsS+WZW1ATDBl5ETASqMZT7R
+zFWjMWq8Kf3iTMfmPlKVCPIFH1FG+SgMvWpQEEcLCOmUkJR7UYtn2y3vaXXYqawz
+sDozHQtDs8WvoegtrhjzB3BhmMY0BCgXcTR944OTmc2lqYmDNJC7Picge9ql5a79
+MMqOv8H9IS4jYKyZzUrVhVf+bRD8qBEi6Ne/5C2Vnz/4gVfTs2joH5FlyDmhwtgU
+0m+/5x7CMIfBvB5+oAKgActuHAJZqZiNL+mFmN0m0UtnKkNMlFzrOR17EiT2kA4i
+ZuFrqOkl+Iw0NwTFn4gzkv5XArxDrpK0lDTwXFpEs7jYN/1odHUm3PrHMT5TsfMf
+dSC/Mq2fMTTMKALOne6fH6g1G4bkeeacBvdFbO3il+OXw5p+HDDZOe4ZwgibVgZP
+SjQeeFVevTaOJSIDI1tKQ2O3Zgn4uA27V5BZXOK8pn0BSF4i9XNJvJMRo9+YEec6
+dhe6qlyoU/HX9V8M3s1A3f036YyTXwbl+bcf+eW7koA1I2mppTxOwLeviPsr3BIN
+gJVFr4E30bnkcxJUnbQs7W7HTZ4wts1zE16Aot1B5XNe+VocwtBEQpWRSKvEkNMZ
+p/1Dp3ceba9h1VJmWpmIYa342DUALUqb8gtWTyP8uZWyAynnHq0/W1py1QARAQAB
+tDdCZW5lZGlrdCBSaXR0ZXIgKENPREUgU0lHTklORyBLRVkpIDxicml0dGVyQGFw
+YWNoZS5vcmc+iQI3BBMBCgAhBQJSsLO0AhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4B
+AheAAAoJEJ2q3ByfzILQvisP/RBeRDMIFctJqRzxN9xjR8/3++SMW4ntXqinqbO+
+5l5vreGIypzc16fl0KKFwqJLs5LnzRqzE4kvoIuUCb0Si4vL0UDpOfm2dP4BYscg
+UWCsgy5p+KLent2dHAccdPtFnlYU1rXL/qDev+PMNIvpypz352+6mHVQvS0NZxlD
+gjDJgAWbNGnb8LXdv2D+uk26rB9YQL126u8asYBY32oBYC0R5g5ExfLPwJ5RGUo6
+zSaoUyHFgfq9FQwf+yLd7CF0RijvLRZf5oWC7yC0AJtSo7WxzuQk/3u1iDXxgezl
+N7tw1+n0f/ZP7vLaD4AoFTs60bqquBBGirfehuTvo+BLqX4tT2ezq8W1skq7ZIum
+v6aFOdKhgVkKJzoEqOWuGGrb1YNa+E7hbcn/0+nE7cUPV1000H6u5Q+AtbMfGdEI
+JvCwitNpx5hrz5SXGXyaAI2u/NMPTA1pbNKy8an8f+yyX0RWXxAxC8gweR1uku0c
+NjI+d6ftG+wUNpv5WgrBfhonlnoKFd2yyCKydui2ZyPJV4xANyUDl+1rRSYi3ib0
+8UzeNdcv4/zY/EbPr21JMr5DnwwOsOFUENP8A+zKQ3KeLFnlNPNfQg9aGVqmu++d
+gupkrfSxhaXnZLtKOydCXeE0iktaCwddAeXp6bN2WLIt4d3AbcUOBH9oB3VbNAf/
+i6cuiEYEEBEIAAYFAlK0EFgACgkQohFa4V9ri3KpMgCgjPSswdS3RABpoY4EKsep
+MosyZ8gAn3roNj/QVskCtnbjAk5EPsgFn2+YiQIcBBABCgAGBQJVsixAAAoJEDlF
+RqR7tA4SNrsP/0p/5yW3H5tvFLSbX6x9C9oJeaambRcsYTZrZiGrT3yh3c4cT/Tw
+XV8DOB142vSYRTiBPG+83aKOvQwkeeO1/AzRP2F7YITEYwkDYDIoLnObi7AfPLfu
+wkLk4ODCtGEApuLoYI6/VfAjVk49tq3Pi4yrh3tpZynMz7lbxEXJ/g4rfZhPklpP
+mpPifiqA2M+9fYbvbTx01sdXOF/t8KVfXmWQW6tClN5QCIiwswE258w8UMRSuNyi
+HdFyKw9l9QzUWj6yzkdYj8GVCzpEjj5YV0+dnm99KSU/jlDSEyAhcdrfviFJkn62
+n95SQ0IkLkW++5jndyMbIiYyTazWMZcd8bi7x7Vy3mydZt5ZQIUNlW+2aYoRm4x9
+REkgO2HBSRC0uDjkcXkBiyMH16yf1v8cRU69cpLQarGpOyfwgOIpKOZuMyF9ZIeE
+4BLcFrJDmezxKXvVyX8yS+W7EQ1i9GtnL8F0+QvcwBqKB1zRZ0TB0tgjRmIqOVs6
+nUpqw048e01Sm+QCF4y+Aal9W0WOTiFLySgYpBCE4Pl+vOxYYxva8tTPRR+xFH4C
+pNvvzSD3nXpV6NBNe/KcAXPCNj6KEjQKzkkUWqS9PG2hADttsd7BGItTzFNbbnnQ
+ozMUUNVpNE38s2w/ZJKWLVYL0/DSh6sb79bd+koOcWCCEfIhFgt+BdgjiQEcBBMB
+CAAGBQJVtekmAAoJEHkD+BGQkQqDAUkH/28+xR9XIZZIIUzMqevFx528H3pCQ4u6
+fK5p7ZOBQtCGrxZLSJcDJG0McmVPomTRO1Rb3cfcaalZLf5Q3gNaq/535Uawls7W
+wWvxFJULpWTifUpMA9SM+G6TxJOn5zWk92vo5FN0zQGjCCbn3r/o3HDatMPlSwrj
+V5IjUnXxjhU0FSKHsV64Ku0o+7H4LStXm27xAlNupr7mtYVBINC0RfihVkJgTG9P
+cB8qba/ZP9oeY7YxPSVdzMDvGz0AA0ubMXEIUbyVBEO7rqpOZe96PzCuXZ4XEAKy
+yKb6LRp25rBkm9tznGZB4/LHiMeIex6Fh9ruR/Acjv66FSTE1XNSmc6IRgQTEQIA
+BgUCVbXpOAAKCRCI889MItf27B/JAKCjwjoVcGdB3tLeGy2GA0SV4H3gbgCg0LRZ
+oyqhFXRJyo6S6kDbCR7fJt+JAhwEEwEKAAYFAlW2DSIACgkQCJEnwVxg1rnIEBAA
+mw0NvJaLkPAZSG7mfoC17UwASaK1CfoRMlbUqW81DLJ0RtvY6I8HgK2Pv3Ls1beo
+vx+dGc+gnugG5SMhPEVN+SGkf+hQKQ3eBbYJEh/QBDe7vvax0jnvPKHuqsh0vJpu
+baqs1KCGFYubygiJV7xCm+rIDk4CpXLxi/5/ucU+ICCG87R4HxOygV22sZf/lYyf
+vjjP9hibx+wsREf5Dyp07A2OfTUSVB4mdYyQc2qtJVV8Xt5bIYmTfQIw4wpDnNU0
+gBk9W33Xr9fa5v1m/9txSxyPqzM5ltVphWkV+URLReBss1IYVw5YceNsJUEYDcd2
+dt2V5oVmOkyBnMURuDgI0XjQrHLoQeI8dILtN/jzmlHCKKYbp6qcDTFnnsaWK9yw
+feQPFQ7oo86CF0oLlx+jIO8Vjf/kuJZbfnF8VGh9gDVwQjHVxnHiPKdHJA/WG3nu
+1u18gnaNhWMrzeHyU2X6WO2JGw23nc2ATfFJKiOS6gaQq7KoNUH3JNoawM5U3iQV
+zoSEo2cL4ICRqwIP1M5Qd/wE1kfKwsffwHmUeqQEmhe9QTwTDkGzgLhMpZzgc9lm
+JUffrCFgQuXSe7R/yYbVtTodU0JunsK3tfXa06wsF/AMRiVM2PC4gikP+ZSRYZuA
+iDpyrX3dHlH7SnnNXE9grBBK3bjRrLE2LJC9mVOAB+GJAiIEEgEKAAwFAlcYeXcF
+gweGH4AACgkQcZc+a1hpAvmdoxAAj7pCLD+6OgbVwIAm48ZcwZNoZ9rbd5zkZnZl
+QvYJ2QVsWaaylTL71mHSUdAb4gbs9ijUgopVOGF/Qyob7hP5SZ0z5/WhDEnHlIUe
+jeaAx48MdcPsSCOKWhO689VuJyCMhtxpULd3/V0OyR2b+wpY7nU0FgTGNirrfIU8
+nA2ibfXXWbQXZWnbyTgiTVAAWzmLqjaBjCKIw1QSiwCcBLPhyK84CPSIuvVfgQjs
+sEPW4EbVwpPeWk8qHHeymT6lWjIILByStxYROFSJtT1d+K59d0xju/vK9ca6vlwD
+J+448fwGnDfpk/PPuzUQnq8Lco/OI13IMq3Q5XiqEPOvlVqTjcrKmROWNy84Nnku
+VCprYeF4YNsoyKcSn8TaCXn0vRTFKWgKKzULOiHX5afXjo3XJ2QlACjz4ruN8YVP
+qbL2BN1s7XBlCWHk1eXOC3vJ5m0iyySEtLHiGz+B6oVFyPQpMsexY3l7PNgsCkkV
+Kcjzb0esAeempt8JZ1wvEXvbbztwrYmdHcHxJiA1+4dmJHACyQCX6pqyjqdF+qUx
+G+OslG8aNMXa9vO0I1132S+vAUmqX3P3pd5UW7JNJX9GwUUnPwO/YSm/cCMz7TtQ
+NwCGakx7mwFA0tCbF+Ml2Ie9VpUL/8AucxqnFqZNEjrzm1jGIujZsV/6rOvv2nX8
+wELs+HuJAhwEEAEIAAYFAlkbmgMACgkQ5AMtxO8M84qDnA//Xj0iq5Cn67YAHnOn
+TOTQxbvsdCwKvLLwUZI/mH30+WgQ+sHMuVxgwsnp+z/Qn7GWogvcNYPfllsDM9J6
+JxkP8XBmqarenWvi+EG/MKdVvMnSY4wbhBXuAhHkKSRx2ukyEi2Y8Tp0rhcGl2wd
+Da1r2m+xpA6cb0HK7/mLql/DxQC1ZvqC5SxYatotnVFarACIrT10R2xvZTJmhin/
+Z7xOksMZAzDSOhxpN3gJ3FxrrnIngbWIlxYEIvnQP1Se76at0C5MVT5cx+DQL9tq
+BgTCXV8MykMySczPz34nDsMr9duL/XDySeaxbENM+/29Fhi19P0iNqgq8raE87A4
+g2TECibbVZce3gushFmOmey+oyJ+N3qOiWPlAUriWz1ZTsFTrUW25IIcgLt1+tDe
+v9fwgfW9/4lJa+RZoSB1805j3Z31mG0pXzBPmVcLd9+DwbuBF+E/Vmj+7S1ixDMu
+1MqmzPG9H19CyTGhYRj/zV9cC0ajSgPqM41LaC4NrhLvYlMaaM1vHSX/bOGYcNU9
+9wpvr5Ke3g8K+5KKcjDmD/FfhGm9pwQ/REpSx0YdlGyEtNOLus88wgOZvxqxlSwX
+3Y2Ob/cZZe1pYcufsh9v9K9AnpPdGgxgncSKzdAjqG0uMMg7v8ZzgUEO2s5cSFns
+4I+lkFHeNsCGno2T4k2fdvyazMmJAhwEEAEKAAYFAlkbqWYACgkQbwza5wC2iZ38
+zQ/+IouZOLCKUF8yfvw/rpdKUOZ9+72mByoApDIMcQXGA7rOkxQWX0RbQqf8iot4
+p7iCkqRFt0tBNFK0VN/7d9FC2QfHh0n0/NdniR/1yG39v001cqQv19+C/ISfGi5v
+yokA81Yt6AbtxKpFV5iOXmrOTrJ2F6ohvVuAbAhe+dfy0/57WzT0v6Xjs1AF239A
+vlD7cMpuhf4tdC60cSk6y3HkB2LFlXc2+2UZGxkU7u6Z3vAd/SMoW46sFqJVKuo1
+hckQ4wBc2urAiHX2yb5PcYfWlSosXRIYTQVNrfcD6FtKSYAqmXUJHiaDbxxQ/Xfv
+P596cRcIjPvITWblTPhYiNkZSosuIIVxI4CPxjQ3xzMhFBwXC1dSjz4LTsEF8aJ2
+v9fEpLGewkzB4Ye5oj1ys3huDzj6X7tvcRDjjYN3etezLj/fa8d8Q6Dx/DjY0ttS
+lvxyijr+q6SaNlXQdxfOeJnXKl3vkEOgQrZ4NqfAzhjlh7KanzQwnhpvplMR6RhY
+RTVgBKSNT2+1ThTBDwxbyts7v5Mf9T6qyOOYXM5EsCShv1r716ByLYDC7i+SZqLz
+2YvoW4nm+8tUa1PrrXtLGBmqvf1QYW7DWVCi8rTBYAo3ZYuinf0VS3aXLzdFDUPw
+FSCe4EpMkAM7KxM7fmcptHdn4FkgvNrGHXtUGBdaZhmnILCJAjMEEAEIAB0WIQTn
+r5fDHwkQslqOARyLDhA8/P6AvAUCWRw0oAAKCRCLDhA8/P6AvJT/D/4w+/an05z8
+6dbS1K0GEv9h13Qy9/lHwkSZFAqm4rgfZ4yHYlRJEAHaX+bGyaWy15PqTrHPKqwW
+wyFl1/vdEKtn03H5BLYu3qz2w5fedGZtmaAwL6F8u45WoFrRbzqjOwqbfEbzOYwU
+PPrYcUvhgIKl4kaSBfemmibbnYOQjra2Qt1cJD9JV9MOazaf4VPxHGjnhoQLQfW9
++zMNUtspTlMMwLhalpSBpsVUvbqTGZ7VoRjWweNJpDRmy5VEjAfWLa4WjSXIyPTX
+MFw0yZgYmMHlk6UaxexRE4mV3sI+6MqkC7O1DG0CNhAl3zWO/eqY9IFbYvGnMXy4
+QrbcrPIXGpkHDeaR0DWNtGZRCbkcX0H64sGWlwrHFHQ620SD6io1X7bkhB8sgAOS
+ytFZ6sAjIb+bZcluNciJCYqZz3aroVt2jQeyOlCgeQP7nYTJfdEJH75KW1GgSK+2
+/zm5Vfz8aBQK5aDW/gMr5aefOsN33WTNoID3kXnXfKa1g2EomgXyETxbKdiBqkd6
+tZDz161zMsC7OCaccmOX7tSwp65a5TQ0n5vzU08C0uYXUE92H4HYvnibK2opKGZl
+lPB4aSQ/WQ+KQAHPrSlj5Hy29RUs8UK+f90cH+ofqHXlM0YFtji4ed+BRH/Qe5Js
+ahHWA8J4bRDux826hlejoIy7ieRyG/wQMokCHAQQAQgABgUCWRyU8gAKCRA/qtLN
+XsuzFC71D/4hE8Mnltc/tLDbeFu3G9xShfjI2dSAIjv5hLMGrQMXb8psz2wWIBZv
+MaDlg5utgTGjpkbDZXIlHV7jiA3RRE+OUGJ6YNe7CXfqir9ui5clKYzWYmRe/AeK
+qkAjG+PqBrFfkFemfzncstv6dkvrdkjEPFPnXfhJxA7WnXtkDizakvoHUqypgo6v
+Px9Kw1L0sVK7Ve6Bp/iggdYxmn+kkbiLszm19/WbftFAkXvBkoxaEN2GpTMhWpvb
+yyT7kVoBeXonKRdloQg4hXf7jeggsDxliRH8LYrAH1z6p4lwLbYNPURUhiFyDf+Y
+dKJ8Qb1FwTWsndE4gqW0X72yrG+QexfwKRvkRgARV0pozvCNJH12Tn8FxZI0eMyo
+qMXd9InpX+N5rLBQYi2itW9UDkpxE/v2qf9Am0iIywHXPSh5Q6xw9DYhTawVZ+XQ
+615y75p+uVq7/i8/74GDK67s5i8bkLo/4HOf4anWIyzhx9ImoXACP0g3sae4wTnX
+MBamL8hREaVHJj6o9LYUnR8g/udsPDM+srWhbGlgDCXdQZ8RGg+dRg0mhSs5HPjL
+pbT+lR+w3QysvexD8H5wMYvbdsGZ246V35GSU9cl57r6C6TmwBxhl1r0BWmfdNTN
+C6IeFjqXWfm7ZnT/ohcvIwSQO2OYoOskc45YXuSB+pIDTKR044/2/okCIgQTAQoA
+DAUCWSNEWgWDB4YfgAAKCRAD4r8eD7UrxhgwD/9kPTyUsnrtjWJWBB/kGemFqb0H
+IKhYNu0D/Y4tWdxYtF+wEGjqrcq8pWCRfs7u0a4ip/QeiQdRpLIYqwu0hT+t5VbN
+fKu6ouJ8AHL6yMhB5u+DWk/8hWrhwGw8UYcT00uK9cltZwF6kKUtaTmljF/WrSY0
+Xc/jz5KsxJk2PqiMP97nolIyqnxgHL12i2TMn+5JQBW9eUItPBrKnE1648KklH6q
+MxU8f0W+pTKY4uLYjKwbj6C0gxlvz1sNHFrh/KNAIMAPJiFgMvqcF1W38o1t5TKy
+1oN7cw/6dW5AAbmRQ3PoN4Wz71EoypaTAn0gbbPzRsTkxt6d5p83A4G6pq4spDUV
+rPj0BiSuruYC7nI2d3DOCJknjAHTpj3RqB6oJVv4G+SswayXaMqv98ppjrhjH0KF
+3xGx6cKQFpsOBXql+lODJyqsA8CD2LlZwroVCmKf1souXYN11oOEEQSxHX1L5nW2
+PviejAMZob1IkXC+GdPCz9uHXaFRUj4Ht9zBZqA6NH0eg1YUeWCxb5OTx6Ts5b59
+wx9VJ8o/27oafq9iNdS5l6p3DB/0z0FGUoH6qpCseJ0DISQYRS9kB4/S/qdSUWkN
+HGB3Tn1xPQzf9k1OS7x519WpdNe/iRA+pkAFNqj5AohdnRcTKBGL4vYditgZNGjV
+J3DU3rcRqj7xnUcP5okCHAQQAQIABgUCWSSC2QAKCRCZ2YmAuB6mKLxKD/0QGVML
+MR1kdrr649O2AjLhxwuCPmY3AVv63Z8f03aaARvMSbox83k/XNM0b66VOSRAa3sa
+j91qiau57uboATiXI7Q7k1ZVTPdg9ne0wrLmKz56U+XtqDPKWLQU3fTIk+t0mGvT
+K6Tm9DjH+EyD7UVT9mHqC8AdwRXU4t0SBKt6r8pIY8tOhUkyKRZkvR6FznKyMT5t
+Qc1B9e51jgfPPLwQZ10TjRBHUTyH4t5vcW+Pn4j6HssCDmpDO5Hnzqq6cfLdr12+
+n/PRu/Kj0VrjAraK5BWp5G9oShojT0swmDFI8OboTdXTRxmzk4pinoF+05ywqvDD
+9YFyKZLDaib44eENDrvTjo1rgyES31sHrQJKJSSdZkkBhnxt+D+SrtGlcPrL8+Ez
+jn2uXb0dTAyjC+wzCdtpGDe+10tsvKhM45+pYKJ/IMSQ07bUANzGgJa7pEOV3IVi
+hEE/pccQb54SuKUD53LGrjzX/7XsIGL10cXYgeWItr/c2WuR2U0FEbDLaBDY32fW
+TifPkiBSYy98NdRdHO77grI61R9K0ANcgOM6YD9ZRvijnNJiklqIJYj4f+6Cxdnj
+8nCIR1yLCGbNKdDTPUTun3n87jEmOGgLtlinBny6JLoyrzrq1VNWctzOYwyktpB5
+G0LIZ5l8MkTBP6300glxgPaarJtn6e/BgIA5JYkCHAQQAQoABgUCWSiOvAAKCRCc
+SfQhRwhVGK/pD/94UQK2u6JPXc6VmbmhtPRd44qNNZdSfJYZgj+DBp/ben9tHyo7
+XWLLKAmI754sPYtxLn8RhJVb4gxW7fhJsyAPLiYV+lGBw3LfV6lW0kQaoyEuNq3p
+Jm0HSKWDcqjKqQ97VzdK0Ap8F6ii8El45j1BF8S7xmf26rjXNhj6Ue2EWU21VFsz
+vcPGD/cEKu6Pq/PDcPy992W4CZFJTQgrXLfjUwneg7MelIggELasV0jpE6tXacsF
+y7Xce1i7wNm5qdi49L1jPDjg9LozjdW5kctdY3XmzCCbNFg0cCdW5XeqXnVXkQLk
+BySDtyd7O0SiqNDQDdTWJtXN0YZocwW6Qp5Wb41UEam5961ghyK2i41xup3wEZRP
+RoW17xas4TzHyywjY2vq/ThAtroq2/5P61ZHWJlj++KqDNUUOhK75zbpzdc8SfsM
+IYl9Qj/uVIff6We+YNBl3IomTKF+HGmJBbZxtXV0OxrWteCbE5Sopy3GSRikvF4l
+GtHEuqCsgr5Bzhxgaz0uUG38/frB/0ymCHY7EZwA1AbcXQz9VgkrMh4qnz7OLTVp
+TMujFDB2yFcEhG2oi/nz9GUIPDe3CTMgd7atkDK6g8ROJTlI3IfWTUSmRUGzFcQa
+1ikj+/pcFYWKDfiPKZhslbZzcph3PstvVQxcaW7PyIgJmuiOSya51hvCUokCHAQQ
+AQIABgUCWSilCQAKCRAhdGSii9Hc6ApnEACWbbidWraeVbwlCedEwsWHIRRFwE1J
+wVJAMdqO0g856CKLV0I/XRojC+64KISTVgS9/YlXDth2KLXrPZqGMQiVNw8Ea0BQ
+AYU6z5R/V7CNUoMX0y6aBoBL0XwApk+SsW3hz2dK+XgXgCkKWJEnBxxOgTRyLqds
+vytad8VLU4P00gxm5qJE66e8ZztF2ofGVKAfrzVb23zxK3N2zE1+04DJY74lAzoX
+IKdWBnF5tttiztyLdhblPnzJn0D1kGogXJJeFOHI8BmUc0xvtCJchmdnYIsafcvd
+HenkYvmI7V6Be6W/oukBiShGpZB9FxGo9xVJukQSbGQ9qrMTe9BWiq0P1hpCcp/o
+yPlNKXEEWdmXxqdkQuh0iyrI8Viv4YXx6yPvcjc90dS/HPKNPk8OPwWF3L1fsCrL
+aifn6lGqWpdsX6VuLO5vZ2O2yI7ntPLCWl1ZEIK+CMZ1oGs95lbPiDW2pDGzkcC0
+1U2kCWS6ZMq5rvsVefiZASKQFkgW58QlluZbhy3UGH5mYajI5JQSqnKZ+TbB1E2u
+/YjbtuFzbqHEweD10iG6ise3RxUkg/xP0u+z/fi6j35mKKhMxDjJ7uStYuT16ckL
+IQnz8RLMw0umRIOXk0/n0pjztV4g2yinF4BI0hIIOIdgtxzVh1Peb/t4NI8bOodo
+cPAGW9hL1bQENIkCMwQQAQgAHRYhBEW+vuyVCr0Fzw71w1CgTQw7ZRfyBQJbN5Br
+AAoJEFCgTQw7ZRfyibkQAJStyYpTmItMJKpyCnbMTtYLmatb26165NOJOOr9rt/T
+EiCQzgY2VkrdF6tns9DKw4ZUQSKiC0M0lU0c0uQqCZRTqSNLj/O4910NrE5NPHP8
+FJWxEOrE7JSmwvhL2K2UyM6gNpx0UfIXyxlnZkKqXDBQWtKU1tgNhKSpYvoENogc
+Is8Zh7zgsG0ijhqjLCAJGTkrVJH96haf/mqIqfPIcL+4N+WwihTYfBQjAINhRlQ1
+889FSjxclW4caqwoCEEufeoYg09wUVToqI2gelnvkhyDAfeKSUoo349e3pte57ce
+70+OeLvwof2X37EHTOXmlspEsrJRSLR/+caKWZkPHlKskmYAm8/y2NHpW8C+P6sp
+saVrkVNsYO3jU9KGoWhYX52+L2B2rmIoxI0ZhPFDyen5otJna4fXqxRYvVynBOWG
+5HoqIrSK/4JWH80try0zyLBCKv/vfAwEl5CZ1m7iYuC/oq1kBDjOUK3cx5rDBhHu
+gRf0NROp0FjzkzyITd8nE9zqxKB8n+aGLW8Oo2SEWUfJ94t5cjfO4RbASmj1U2xl
+Mw85jZsJCh9EO4OW7sOYv2Ywb6zwnaUyb7LSsPCFVKmGI8Qq51ez8/6wzdJ7EDgg
+NzD6oOSxCZ5ZK0wAPF5pj+rgg/B1gAEaQ0NhstjbTLZ386A0gYbHDOsoSgltKFds
+uQINBFKws7QBEACfb82u9+A4kyyzAvGZJPvwTZI+yQ6tHKFHAXr/GcMP9J9E/ZRz
+IQa7Sx/MNlTxHRe9fnSrKclZPw/HTvgrUAH9NchW56eXa8ypsHI2sHI3CM6M2KV0
+HWHG++1hHP+cYmqI4KZ1x2MdCgC+b0S9F25lGfArd0PhkeojWf26rPP4upDceJLX
+M7mhi6umZbGYnBYg/VKhmCuy0bPz20bYuc6HTi8rov428geyHhBGTfsHjd5m5qGs
+Ql+U7TBFyHdqJDsY1DyaZ1k5pj//A1xuxE2CSjEazJBCG3VxYLJxbL6Tr4dWpPc0
+PSqn0MeYmF9RA/8vY+56edq9ohIsvXw5+BR5FSR6sXKL05EDem0TWYgW7ATmn1/W
+SbsnVjWclrxcT2uJVdG7vIh7/qhkzVwhYIi1CyO8+2i/r/UMgqB3UBMUrGAE/K1j
+0S19rMISkwPnEprpcSjiVVEa6ubX3gxSFfbIaLPbIBE6nv/DLA0xgMljUvESg90v
+v3tmuApERPmOsU7k28juu5ggWPT5G8M39Rsyms36ZZvN8dpjGcNSuMJxU2KrnFVR
+sokJ36drb73cWv51bc6ir3VnUTr1fWeYODjRqxpRw1K1tfaZoGyBRmxyAVjYSEZh
++uenFly42CHEndiJRy7b9NYxp8rjwSi541R1mNcpKyMRrXjWDk2/AitcBQARAQAB
+iQIfBBgBCgAJBQJSsLO0AhsMAAoJEJ2q3ByfzILQBrgP/ifLPf487prZqHBk/b/l
+wCWEwROPPM4xGAfu/X6apsIU6h37VQ/2+V0ZIX5XoleDEQEW6Zmhcbke1OiIb838
+cTQ1a6j+ONGKR6N04+2+mmdX4+dK6iKt0vkmfCygxMdY5MQExtG6jtSb2pt9pTTD
+2V7fQs+G7wH2jdRbZd0tTg0OWyEkzIBx6rlK4phfwsXcdn+7RvIZjiEBOcj39uif
+M3hAqa0lALlA4CZ77Pn2od8Z03WDHFQCH1FxqoRUHDpEKPsf0EFByQ/YFskdF336
+B43t0WjMJfOYdj7HVokkvmulSAXTXZEx5LyqCQ1HPhc57FCwgbQp5/u7JYI3RQdK
+pAIO0YxD/Pk1ulJz6Xgg7gYdaNUODrSNCq2KNtEP3mgj74no4tN8pOecZfIgR0AC
+fEI4/m59WprhopTEk4X43x+swbaRgcpXXxVv+UvSTBa6eVMSHSm87UgRH02ULPjy
+FbNI3I+a9jM7IANxavGzhHT9XWwPNqGeSV0uTFWbcadw/pDr8t8MCztAx1txkePc
+VzRcV2BB+XG0lcGW4e6SV6d9jSoSn2HkL32xPOIxxwFPgYEjmT06XNO7ZiaxI16p
+TXZk6+QmjKpUb2jNf39gCop3uD4vpDkXAORGahhBdXxaHNM/Ds+0zW9k+nXG/umt
+uGWBaZVODvhr9hDoUpp2+qte
+=rXX9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    379CE192D401AB61
+sub    0CFE993CDBE1D0A2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+N9IFsU1/E/XhP4QkRJrZI1F/
+=N8tg
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EEF9ECC7D5D90518
+uid    Daniel Santiago Rivera <[email protected]>
+
+sub    AE7B5A78012824FE
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=3gTW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    EEF9ECC7D5D90518
+uid    Daniel Santiago Rivera <[email protected]>
+
+sub    AE7B5A78012824FE
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=3gTW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
+=IIN3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+uid    Liam Miller-Cushon <[email protected]>
+
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+mYUp5X93bS4y8yo=
+=eURh
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFKD+PgBEAC8IkWujQlmU0/7+QPZFsc/z/rXgg7BQyo330QK4HeMzeCK6WHa
+SWzVDM9h6nFDs6Xln6YexbZUjLsxS/a/Ox2i26Qg8B+NghgiratbdJsByRrU/3la
+0d8eYXrKO8BU024o+go+LzJEBqOb3+bn23dwF96dyCUfnhabYz+ZbPd3VmZV5D3G
+fv0vBMnQnJkToOW6fVEoqjzCpEQmSFCWe6Cryj0veci2JmFIiiLA45hwuMg3hj92
+Czd+mdxcURtwm4XFfUoO32a5nAhNfrzKfz2eoV4my79MC8JA8OwQau5aksVu0Ohs
+3z5IsdXi2hUqPF3s+j6BQFwSPmLo3r5XwZWTx9RAM7D6cOHWr2jW61o32t6ABSiI
+cfhECTb0arEvjGtr56kD2JhgTA5GTIBGPwbdNBHMKZc4VmIFITnUlJ7MLoRv/gP6
+XyCerPB4Cm6kOTcNZnm33yUMNB6GfR1/l/+3hCFP+0z4/WJ0aK10d3/9opikkmep
+gmNtedS6ScgOnU3pj9UF8jEMleK47nD2njc7FhGKdB5+I59L1ri0tSUdMhpuBAEd
+u497Ei/Q1rt+vkNwA8uMQgXOGka7NLpgPcNw6sDCq1fecCEpt/HgmGrHdK6pY8KE
+3I1xEGP6GG5DcBs57cbZv1Jdjf3A8fIozX7Ntn+7nBCHUVEWCzaASlQYrQARAQAB
+uQINBFKD+PgBEAC8ZqGlqxaPZ+Y9QNsroptbfZ8/YL/+09qEki6bJ/bPn1wwAOpf
+Q57LSHryrVFZXnqMO/+oSTb6zNRvy4C5VG8Lvoc7JqGSo/fc5nfeZwFS1v58j4d+
+6AfWPPmg0f4mt3JASoHqJVwsRTEQsZsuaykPulA9DUsB5/wMQXlJLU/YewcmkDig
+QHw1bhG3KROTFnnFp1bWwEQ0C3zTaB9mJcrCswKUnauDIWGeR0r3ALGllPwvzr4R
+cwwTLUHzaQeeRzJL39oRpU+iq/3WW4HN6at8BQ2jHiat6QidtWOQNKQTvrjybs6X
+gkRskZniombGiTbDgsTp1/4BRMDb+0nRGh2z3QIj4ZPVg0d2ISf82M0AMdZpzPXX
+6Jw3o/A7Tv4pJa5gHzOUTDThkOFiQROgVP65nvPt8JPBIvwL5eaG5rzDXm4iWq6a
+cMnREGz7jQdC07UvVxRAbVa4mCHGJKNskRDbWdGZDT4clYFoMQbMup2CMMkObJac
+OTxiZ4xy7vQWZ2obNkb37RNrIKqCFxCcuQl/9AhlkbAFFrodEqTjNHOFH0uq1/0B
+uH3XiW9Xih3AZ0fL1wq7qrl2DXBIYMAbzABoQviGYoRXvApSSfuozFnV9B/y8hyJ
+DQRInzHslXW/lkdrBWiBYDb9rxKKXCzE1WYYHhcw0BG8dj3T1LJ3c4NKcwARAQAB
+iQIlBBgBAgAPAhsMBQJSg/tMBQkJZgPLAAoJEJolnH7mNsXtTUsQAJ/1rn3dybrt
+DaSuNA397bhQBFslfN44NYsaRh9vsVLp4FFqtMGKEF8NxbLtTX9CUdgh27Ip6lyc
+b2Gh5Uy70TyIEss2E8gfLoCmbnezQnfAUFjXjb7d+Mtd1XrE/aj3cJftoEh8FvNZ
+U2EfCHGWD7c4j86EI6lZ9qIoUzdSOxDG6Vf9qBJIbHGf6PofvDD8NX7SGzuNoNaB
+UqMKOnmT1OLk4x4ElU2wtNWNx1c0zDIwto2ObfVBzYqocv/9G3fVeuhYsm9a1eOH
+kA/UzXbP9tzE+d9senUawLCDupYb96coa+c3NXRyCdjI86VtlCyDZQz+nd5xmD08
+DZ+D3MMkAndi9LtmjTaTjDcTYfipioxGmLnVQ7uXxrHLFsFfKsjrKH7/s3OwmyJ+
+HyGnDkADYoRNBDnn60V9HZw95o6Kft65K9QolHq+bgDlQPe+JJ6iZBw7AuZX+scM
+yOXHiDvRfI1dt9rOJGR0+G6GQ0gQedycJd/Y4AO2LPqFo7/qomIHG/eN6NAL+/nB
+YQBg2Hyr0SbcsWyzuSfs4chyZ35zQZ9qw85oTN5wYivsqduHxfFHjq+7fS1huCzq
+ZX37OEGYrg2BwLzH9U76zQRiKFhkmlpiMWbH6cAx9cdDK2RmcaPgrDdwknykEfhY
+DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
+=IIN3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
+=IIN3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
+=IIN3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
+=IIN3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9A259C7EE636C5ED
+sub    D66472CF54179CC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
+=IIN3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1F7A8F87B9D8F501
+sub    7D1BE4480B61E2A7
+sub    C2148900BCD3C2AF
+sub    CFF46EE3C17E53E9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Lx/KSjFhpjYYPWtx15xNpdqJ8g==
+=Le9W
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1F7A8F87B9D8F501
+sub    7D1BE4480B61E2A7
+sub    C2148900BCD3C2AF
+sub    CFF46EE3C17E53E9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Lx/KSjFhpjYYPWtx15xNpdqJ8g==
+=Le9W
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1F7A8F87B9D8F501
+sub    7D1BE4480B61E2A7
+sub    C2148900BCD3C2AF
+sub    CFF46EE3C17E53E9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Lx/KSjFhpjYYPWtx15xNpdqJ8g==
+=Le9W
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1F7A8F87B9D8F501
+sub    7D1BE4480B61E2A7
+sub    C2148900BCD3C2AF
+sub    CFF46EE3C17E53E9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Lx/KSjFhpjYYPWtx15xNpdqJ8g==
+=Le9W
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    E0CB7823CFD00FBF
+uid    Jake Wharton <[email protected]>
+
+sub    F3DBCE882C3A01AA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFsNoY0BCADIvRrJEX3k7UeuT6zt+F4++xH+5Qo7QzdicjFhhyb22PLPyIsI
+Ema+T4QqiPDegUv8yKKTTBmHNw/vSUHTPX9ZUpglckopuOgdfnuQjTKEOEzrN7V/
+ZGLB8yR+BoKEJBLdp6W4fGHIxza/o8Iwg8nV0/C9X1gvQI0I63aexqqA5Y0eYt4y
+12mQur5sKabJRRWxkn1U8oQmcFs+P/KPVtS4lUb1nsGzFJbsiKY8AOI1RbnYgtIu
+c6mzpiUk0NPO27xKScyDq7lKBwwOZMwRzX/6yX7jcAtyTWZnWS675MCbT2K07ubU
+Ykrs9NObwDXlKZWLk6JuADgzQaueYIrjLRYxABEBAAG0H0pha2UgV2hhcnRvbiA8
+amFrZXdAZ29vZ2xlLmNvbT6JAVQEEwEIAD4WIQRHv1kiYc0aimm3A7Tgy3gjz9AP
+vwUCWw2hjQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDgy3gj
+z9APv/tcB/sFtJIfaqlhEMDI2o95mhd/IOpCkN+aECpiciquE2RkRPj+lUY9qYZG
+0mbcQkeXWQjkuD30DuiwHSsSqDzya+lFVHmuXfL8uxbDWJ5YYNnq/Xs/7NA5BwtF
+PVItqJVUGNSVzA/HmKtCF8ztc/o374v2UsNSxoPe0k2XirZ9XPaRchBKlYulLYAi
+mwsOI5O2+CvWojRXl/p9/NKtHYCDyVtaU4ujwJbrs2MEn0X5vPfkzphXA010T6If
+l1MwLjH+WGYiR3Sxs3dWuP6m4acACT3itSZ3sgoUYZ17aKaO99zzHKEPx8ov5/OX
+pAX71SdwRYph8/EVgsnk/E8zOW+DeXgJuQENBFsNoY0BCADL7NCKWHi1931saO7k
+RdrOE947qnMqHLaPe0J8mVLIsYE0PntBE5cBRz3VAUi7cJG6oXWKaDfEclKPb5Bo
+y2SZA9M50gUusXmv1jSY9fLgT9kID1zbTNVKYvKREXmeUQatG6GM/o23d3GxuUww
+BGEKJUpgoGdk7roCLnDGD/TbpqCg3YnRMLpxo8ou0qZOxbIHaxfQWqXWomK0kKgL
+F8KR/ptW/5uNSLVheNn1v5qTpPF2hHcxgPMS0gE6UPPQFp2Ivd30q+xE6HVH35+d
+Z9+n89ejOVvQjNbRzHR2uYJnS70YfgcdTFPfOcMU4g1H8AzfupNX21/rfOFCx+mr
+CzbRABEBAAGJATwEGAEIACYWIQRHv1kiYc0aimm3A7Tgy3gjz9APvwUCWw2hjQIb
+DAUJA8JnAAAKCRDgy3gjz9APv0lMB/9DrHctoZd4iCOzicjv/8t3i9ZM5o+z8lo+
+LDCXSt++VG7OcbFHLf3uPalP0P6M9M4oPpR2mEp3yxTMeKqX7VulTGf4hpf5npF6
+AnTq1MWf9PrK6XyTKSAycqM3We592xbZatp6NU25v5MlK8LtzPEP2ti5IfI8MoCw
+Rqpbs9D3zbABAgBpcaahsEtb1o64R7TyH0W91A9x6PvjhZs+cyijm47NMewJXGCK
++znvg2tjL0zIGVICjBqrCYb3R7DKmUSlemlW0nT7NzyYLfFLQ9sGgOJS0QOcZS3Y
+E3TeXafk5ruGsCO5A33as9VebOaayxpZKD4QAlMUWXs509ybOzVR
+=bCXo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    E0CB7823CFD00FBF
+uid    Jake Wharton <[email protected]>
+
+sub    F3DBCE882C3A01AA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFsNoY0BCADIvRrJEX3k7UeuT6zt+F4++xH+5Qo7QzdicjFhhyb22PLPyIsI
+Ema+T4QqiPDegUv8yKKTTBmHNw/vSUHTPX9ZUpglckopuOgdfnuQjTKEOEzrN7V/
+ZGLB8yR+BoKEJBLdp6W4fGHIxza/o8Iwg8nV0/C9X1gvQI0I63aexqqA5Y0eYt4y
+12mQur5sKabJRRWxkn1U8oQmcFs+P/KPVtS4lUb1nsGzFJbsiKY8AOI1RbnYgtIu
+c6mzpiUk0NPO27xKScyDq7lKBwwOZMwRzX/6yX7jcAtyTWZnWS675MCbT2K07ubU
+Ykrs9NObwDXlKZWLk6JuADgzQaueYIrjLRYxABEBAAG0H0pha2UgV2hhcnRvbiA8
+amFrZXdAZ29vZ2xlLmNvbT6JAVQEEwEIAD4WIQRHv1kiYc0aimm3A7Tgy3gjz9AP
+vwUCWw2hjQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDgy3gj
+z9APv/tcB/sFtJIfaqlhEMDI2o95mhd/IOpCkN+aECpiciquE2RkRPj+lUY9qYZG
+0mbcQkeXWQjkuD30DuiwHSsSqDzya+lFVHmuXfL8uxbDWJ5YYNnq/Xs/7NA5BwtF
+PVItqJVUGNSVzA/HmKtCF8ztc/o374v2UsNSxoPe0k2XirZ9XPaRchBKlYulLYAi
+mwsOI5O2+CvWojRXl/p9/NKtHYCDyVtaU4ujwJbrs2MEn0X5vPfkzphXA010T6If
+l1MwLjH+WGYiR3Sxs3dWuP6m4acACT3itSZ3sgoUYZ17aKaO99zzHKEPx8ov5/OX
+pAX71SdwRYph8/EVgsnk/E8zOW+DeXgJuQENBFsNoY0BCADL7NCKWHi1931saO7k
+RdrOE947qnMqHLaPe0J8mVLIsYE0PntBE5cBRz3VAUi7cJG6oXWKaDfEclKPb5Bo
+y2SZA9M50gUusXmv1jSY9fLgT9kID1zbTNVKYvKREXmeUQatG6GM/o23d3GxuUww
+BGEKJUpgoGdk7roCLnDGD/TbpqCg3YnRMLpxo8ou0qZOxbIHaxfQWqXWomK0kKgL
+F8KR/ptW/5uNSLVheNn1v5qTpPF2hHcxgPMS0gE6UPPQFp2Ivd30q+xE6HVH35+d
+Z9+n89ejOVvQjNbRzHR2uYJnS70YfgcdTFPfOcMU4g1H8AzfupNX21/rfOFCx+mr
+CzbRABEBAAGJATwEGAEIACYWIQRHv1kiYc0aimm3A7Tgy3gjz9APvwUCWw2hjQIb
+DAUJA8JnAAAKCRDgy3gjz9APv0lMB/9DrHctoZd4iCOzicjv/8t3i9ZM5o+z8lo+
+LDCXSt++VG7OcbFHLf3uPalP0P6M9M4oPpR2mEp3yxTMeKqX7VulTGf4hpf5npF6
+AnTq1MWf9PrK6XyTKSAycqM3We592xbZatp6NU25v5MlK8LtzPEP2ti5IfI8MoCw
+Rqpbs9D3zbABAgBpcaahsEtb1o64R7TyH0W91A9x6PvjhZs+cyijm47NMewJXGCK
++znvg2tjL0zIGVICjBqrCYb3R7DKmUSlemlW0nT7NzyYLfFLQ9sGgOJS0QOcZS3Y
+E3TeXafk5ruGsCO5A33as9VebOaayxpZKD4QAlMUWXs509ybOzVR
+=bCXo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEWjofgRBACePEiXmSvjcjUgWkNAFQ/w7w2VSEqe1vuTCrta+ER9JsvhwipP
+2/BEHigFf99TlU0p1UC591LMeYP2UXfQnb3jiyEPKxA06aj1fTGGMoNMAilymvgd
+pcixjlSJBvsmyFYuUdYK20UghL7fAU1lD8Y7TVXz0XT0n1oMOwf78qB4vwCg/bIQ
+LlFGTwqgEBBJpFJnaVk66hMD/0wMKe5Lk3rfdm/9Ku56ddZ6GTjyuNFI6sc9gOIJ
+XWuRpZUO4d7LKq7QaKLKBQeAI1NqqZuB7gtdU6ILy7OjI2C38KTCpyu+8lj97CNQ
+gJqFh26lqhtFfMOUwKvNUUsEABDy+vnI+VCW32ZT/E1xjA+nVTSjGM9lyv4Gls7M
+8pd5A/wJ3rD8XDiriM3ZV1Sn7/pt9OBxc25YHhfbTinIQBYCBhTw3wbS3d+PLQOL
+/TmkeaZcuFA0KQW5hHEjTIY2YbOd2lPNa9ynq+/1OvJOGAseCWL8uorYAmk6ztkc
+Sy4UZuNbupNSPGOt0hZixQpSB3Tv49XlFyupd7rPnYi4F37nPLkCDQRFo6IbEAgA
+oPx5Bm4+wUuVea7pqi8NTs/CkhAdAWgNnsj6tS/YzyncXD6mjc9Sx12Y6DRCkzC+
+ZTvy89nt/IHOvbaCZ8etLuBonv9PyYXu6HmGNihqg8rBQzXUlbIPdZD/1GeVwH3k
+O2DaZ+Rt1EKjnloXlpwLGMnn2n9isWUCMWjyWSZbnNBca30tooXp+cWGBnClv+Ay
+ez3jvroWCe9vVbj8/AWM2Pn5pB6Ewzw9SLmC3kgcq15XXBTgeeEZohuTvrmsNOHG
+Nh9HFEp+Y56JD8ufPOsNayRHW3ex8btx4sZhLO2Ixj25cOjDfoKZ2aj8ByCsJAsN
+U1qgWeyn/QTrrHavOTLpmwADBQf+K5Fi7IcpD+doMksWWpu68+2F4sDiHybwi1sr
+kV9oy/R6vG0SkO4DuV2/k9rCquavHQSW7jXzfZuOoY/ErK/6/bd3GpLjZNR/K2ZN
+T2aOcHVFJoQTQgKf3GDlSmecNuskHpe1pUhbaY+zWKx+DMEjcwThchArABW2djcy
+Tk0YRygxQwqWBPGI8sjquxsrqKKrjallTVokbx9rr1VwCLcxg3HFI+GJjhHkjmYX
+JANSqzaPyIamcfR8wBQEV9+IiGx/EdRTvASx7uveg5119pPtwb0g0r95SlJpoYQe
+4wiTAagxkwwSb3qWktA06gWykX5NQkMX0VK6lsNvP0tAOvY134hJBBgRAgAJBQJF
+o6IbAhsMAAoJEJsf2p88BiIxBmoAoIrGOelJKnwyAjageLevUw4Mu9J6AKCfO5KK
+tBZLsV3Wq6hCI55+iA356Q==
+=kt5X
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+uid    Brian E Fox <[email protected]>
+
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=o0/H
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEWjofgRBACePEiXmSvjcjUgWkNAFQ/w7w2VSEqe1vuTCrta+ER9JsvhwipP
+2/BEHigFf99TlU0p1UC591LMeYP2UXfQnb3jiyEPKxA06aj1fTGGMoNMAilymvgd
+pcixjlSJBvsmyFYuUdYK20UghL7fAU1lD8Y7TVXz0XT0n1oMOwf78qB4vwCg/bIQ
+LlFGTwqgEBBJpFJnaVk66hMD/0wMKe5Lk3rfdm/9Ku56ddZ6GTjyuNFI6sc9gOIJ
+XWuRpZUO4d7LKq7QaKLKBQeAI1NqqZuB7gtdU6ILy7OjI2C38KTCpyu+8lj97CNQ
+gJqFh26lqhtFfMOUwKvNUUsEABDy+vnI+VCW32ZT/E1xjA+nVTSjGM9lyv4Gls7M
+8pd5A/wJ3rD8XDiriM3ZV1Sn7/pt9OBxc25YHhfbTinIQBYCBhTw3wbS3d+PLQOL
+/TmkeaZcuFA0KQW5hHEjTIY2YbOd2lPNa9ynq+/1OvJOGAseCWL8uorYAmk6ztkc
+Sy4UZuNbupNSPGOt0hZixQpSB3Tv49XlFyupd7rPnYi4F37nPLkCDQRFo6IbEAgA
+oPx5Bm4+wUuVea7pqi8NTs/CkhAdAWgNnsj6tS/YzyncXD6mjc9Sx12Y6DRCkzC+
+ZTvy89nt/IHOvbaCZ8etLuBonv9PyYXu6HmGNihqg8rBQzXUlbIPdZD/1GeVwH3k
+O2DaZ+Rt1EKjnloXlpwLGMnn2n9isWUCMWjyWSZbnNBca30tooXp+cWGBnClv+Ay
+ez3jvroWCe9vVbj8/AWM2Pn5pB6Ewzw9SLmC3kgcq15XXBTgeeEZohuTvrmsNOHG
+Nh9HFEp+Y56JD8ufPOsNayRHW3ex8btx4sZhLO2Ixj25cOjDfoKZ2aj8ByCsJAsN
+U1qgWeyn/QTrrHavOTLpmwADBQf+K5Fi7IcpD+doMksWWpu68+2F4sDiHybwi1sr
+kV9oy/R6vG0SkO4DuV2/k9rCquavHQSW7jXzfZuOoY/ErK/6/bd3GpLjZNR/K2ZN
+T2aOcHVFJoQTQgKf3GDlSmecNuskHpe1pUhbaY+zWKx+DMEjcwThchArABW2djcy
+Tk0YRygxQwqWBPGI8sjquxsrqKKrjallTVokbx9rr1VwCLcxg3HFI+GJjhHkjmYX
+JANSqzaPyIamcfR8wBQEV9+IiGx/EdRTvASx7uveg5119pPtwb0g0r95SlJpoYQe
+4wiTAagxkwwSb3qWktA06gWykX5NQkMX0VK6lsNvP0tAOvY134hJBBgRAgAJBQJF
+o6IbAhsMAAoJEJsf2p88BiIxBmoAoIrGOelJKnwyAjageLevUw4Mu9J6AKCfO5KK
+tBZLsV3Wq6hCI55+iA356Q==
+=kt5X
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+uid    Brian E Fox <[email protected]>
+
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=o0/H
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEWjofgRBACePEiXmSvjcjUgWkNAFQ/w7w2VSEqe1vuTCrta+ER9JsvhwipP
+2/BEHigFf99TlU0p1UC591LMeYP2UXfQnb3jiyEPKxA06aj1fTGGMoNMAilymvgd
+pcixjlSJBvsmyFYuUdYK20UghL7fAU1lD8Y7TVXz0XT0n1oMOwf78qB4vwCg/bIQ
+LlFGTwqgEBBJpFJnaVk66hMD/0wMKe5Lk3rfdm/9Ku56ddZ6GTjyuNFI6sc9gOIJ
+XWuRpZUO4d7LKq7QaKLKBQeAI1NqqZuB7gtdU6ILy7OjI2C38KTCpyu+8lj97CNQ
+gJqFh26lqhtFfMOUwKvNUUsEABDy+vnI+VCW32ZT/E1xjA+nVTSjGM9lyv4Gls7M
+8pd5A/wJ3rD8XDiriM3ZV1Sn7/pt9OBxc25YHhfbTinIQBYCBhTw3wbS3d+PLQOL
+/TmkeaZcuFA0KQW5hHEjTIY2YbOd2lPNa9ynq+/1OvJOGAseCWL8uorYAmk6ztkc
+Sy4UZuNbupNSPGOt0hZixQpSB3Tv49XlFyupd7rPnYi4F37nPLkCDQRFo6IbEAgA
+oPx5Bm4+wUuVea7pqi8NTs/CkhAdAWgNnsj6tS/YzyncXD6mjc9Sx12Y6DRCkzC+
+ZTvy89nt/IHOvbaCZ8etLuBonv9PyYXu6HmGNihqg8rBQzXUlbIPdZD/1GeVwH3k
+O2DaZ+Rt1EKjnloXlpwLGMnn2n9isWUCMWjyWSZbnNBca30tooXp+cWGBnClv+Ay
+ez3jvroWCe9vVbj8/AWM2Pn5pB6Ewzw9SLmC3kgcq15XXBTgeeEZohuTvrmsNOHG
+Nh9HFEp+Y56JD8ufPOsNayRHW3ex8btx4sZhLO2Ixj25cOjDfoKZ2aj8ByCsJAsN
+U1qgWeyn/QTrrHavOTLpmwADBQf+K5Fi7IcpD+doMksWWpu68+2F4sDiHybwi1sr
+kV9oy/R6vG0SkO4DuV2/k9rCquavHQSW7jXzfZuOoY/ErK/6/bd3GpLjZNR/K2ZN
+T2aOcHVFJoQTQgKf3GDlSmecNuskHpe1pUhbaY+zWKx+DMEjcwThchArABW2djcy
+Tk0YRygxQwqWBPGI8sjquxsrqKKrjallTVokbx9rr1VwCLcxg3HFI+GJjhHkjmYX
+JANSqzaPyIamcfR8wBQEV9+IiGx/EdRTvASx7uveg5119pPtwb0g0r95SlJpoYQe
+4wiTAagxkwwSb3qWktA06gWykX5NQkMX0VK6lsNvP0tAOvY134hJBBgRAgAJBQJF
+o6IbAhsMAAoJEJsf2p88BiIxBmoAoIrGOelJKnwyAjageLevUw4Mu9J6AKCfO5KK
+tBZLsV3Wq6hCI55+iA356Q==
+=kt5X
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEWjofgRBACePEiXmSvjcjUgWkNAFQ/w7w2VSEqe1vuTCrta+ER9JsvhwipP
+2/BEHigFf99TlU0p1UC591LMeYP2UXfQnb3jiyEPKxA06aj1fTGGMoNMAilymvgd
+pcixjlSJBvsmyFYuUdYK20UghL7fAU1lD8Y7TVXz0XT0n1oMOwf78qB4vwCg/bIQ
+LlFGTwqgEBBJpFJnaVk66hMD/0wMKe5Lk3rfdm/9Ku56ddZ6GTjyuNFI6sc9gOIJ
+XWuRpZUO4d7LKq7QaKLKBQeAI1NqqZuB7gtdU6ILy7OjI2C38KTCpyu+8lj97CNQ
+gJqFh26lqhtFfMOUwKvNUUsEABDy+vnI+VCW32ZT/E1xjA+nVTSjGM9lyv4Gls7M
+8pd5A/wJ3rD8XDiriM3ZV1Sn7/pt9OBxc25YHhfbTinIQBYCBhTw3wbS3d+PLQOL
+/TmkeaZcuFA0KQW5hHEjTIY2YbOd2lPNa9ynq+/1OvJOGAseCWL8uorYAmk6ztkc
+Sy4UZuNbupNSPGOt0hZixQpSB3Tv49XlFyupd7rPnYi4F37nPLkCDQRFo6IbEAgA
+oPx5Bm4+wUuVea7pqi8NTs/CkhAdAWgNnsj6tS/YzyncXD6mjc9Sx12Y6DRCkzC+
+ZTvy89nt/IHOvbaCZ8etLuBonv9PyYXu6HmGNihqg8rBQzXUlbIPdZD/1GeVwH3k
+O2DaZ+Rt1EKjnloXlpwLGMnn2n9isWUCMWjyWSZbnNBca30tooXp+cWGBnClv+Ay
+ez3jvroWCe9vVbj8/AWM2Pn5pB6Ewzw9SLmC3kgcq15XXBTgeeEZohuTvrmsNOHG
+Nh9HFEp+Y56JD8ufPOsNayRHW3ex8btx4sZhLO2Ixj25cOjDfoKZ2aj8ByCsJAsN
+U1qgWeyn/QTrrHavOTLpmwADBQf+K5Fi7IcpD+doMksWWpu68+2F4sDiHybwi1sr
+kV9oy/R6vG0SkO4DuV2/k9rCquavHQSW7jXzfZuOoY/ErK/6/bd3GpLjZNR/K2ZN
+T2aOcHVFJoQTQgKf3GDlSmecNuskHpe1pUhbaY+zWKx+DMEjcwThchArABW2djcy
+Tk0YRygxQwqWBPGI8sjquxsrqKKrjallTVokbx9rr1VwCLcxg3HFI+GJjhHkjmYX
+JANSqzaPyIamcfR8wBQEV9+IiGx/EdRTvASx7uveg5119pPtwb0g0r95SlJpoYQe
+4wiTAagxkwwSb3qWktA06gWykX5NQkMX0VK6lsNvP0tAOvY134hJBBgRAgAJBQJF
+o6IbAhsMAAoJEJsf2p88BiIxBmoAoIrGOelJKnwyAjageLevUw4Mu9J6AKCfO5KK
+tBZLsV3Wq6hCI55+iA356Q==
+=kt5X
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9B1FDA9F3C062231
+sub    458AF764D812A037
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEWjofgRBACePEiXmSvjcjUgWkNAFQ/w7w2VSEqe1vuTCrta+ER9JsvhwipP
+2/BEHigFf99TlU0p1UC591LMeYP2UXfQnb3jiyEPKxA06aj1fTGGMoNMAilymvgd
+pcixjlSJBvsmyFYuUdYK20UghL7fAU1lD8Y7TVXz0XT0n1oMOwf78qB4vwCg/bIQ
+LlFGTwqgEBBJpFJnaVk66hMD/0wMKe5Lk3rfdm/9Ku56ddZ6GTjyuNFI6sc9gOIJ
+XWuRpZUO4d7LKq7QaKLKBQeAI1NqqZuB7gtdU6ILy7OjI2C38KTCpyu+8lj97CNQ
+gJqFh26lqhtFfMOUwKvNUUsEABDy+vnI+VCW32ZT/E1xjA+nVTSjGM9lyv4Gls7M
+8pd5A/wJ3rD8XDiriM3ZV1Sn7/pt9OBxc25YHhfbTinIQBYCBhTw3wbS3d+PLQOL
+/TmkeaZcuFA0KQW5hHEjTIY2YbOd2lPNa9ynq+/1OvJOGAseCWL8uorYAmk6ztkc
+Sy4UZuNbupNSPGOt0hZixQpSB3Tv49XlFyupd7rPnYi4F37nPLkCDQRFo6IbEAgA
+oPx5Bm4+wUuVea7pqi8NTs/CkhAdAWgNnsj6tS/YzyncXD6mjc9Sx12Y6DRCkzC+
+ZTvy89nt/IHOvbaCZ8etLuBonv9PyYXu6HmGNihqg8rBQzXUlbIPdZD/1GeVwH3k
+O2DaZ+Rt1EKjnloXlpwLGMnn2n9isWUCMWjyWSZbnNBca30tooXp+cWGBnClv+Ay
+ez3jvroWCe9vVbj8/AWM2Pn5pB6Ewzw9SLmC3kgcq15XXBTgeeEZohuTvrmsNOHG
+Nh9HFEp+Y56JD8ufPOsNayRHW3ex8btx4sZhLO2Ixj25cOjDfoKZ2aj8ByCsJAsN
+U1qgWeyn/QTrrHavOTLpmwADBQf+K5Fi7IcpD+doMksWWpu68+2F4sDiHybwi1sr
+kV9oy/R6vG0SkO4DuV2/k9rCquavHQSW7jXzfZuOoY/ErK/6/bd3GpLjZNR/K2ZN
+T2aOcHVFJoQTQgKf3GDlSmecNuskHpe1pUhbaY+zWKx+DMEjcwThchArABW2djcy
+Tk0YRygxQwqWBPGI8sjquxsrqKKrjallTVokbx9rr1VwCLcxg3HFI+GJjhHkjmYX
+JANSqzaPyIamcfR8wBQEV9+IiGx/EdRTvASx7uveg5119pPtwb0g0r95SlJpoYQe
+4wiTAagxkwwSb3qWktA06gWykX5NQkMX0VK6lsNvP0tAOvY134hJBBgRAgAJBQJF
+o6IbAhsMAAoJEJsf2p88BiIxBmoAoIrGOelJKnwyAjageLevUw4Mu9J6AKCfO5KK
+tBZLsV3Wq6hCI55+iA356Q==
+=kt5X
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1F8CF885D537A431
+uid    Niek Haarman <[email protected]>
+
+sub    B7D9C5C3EEC4A9A9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFkyw7oBCACtGFos6g11ycruiWMuXwrE4+XbU85+1jR99AN5PcKjgXo/J3T9
+XaZLjJ+oTWCVgEHu5PTxAftbkq9+lmDAUEWZ1Q8dKrnVgBLsFNn+G2pcvVschorz
+CYFu/WT+eORA2UkdPZ7LH00iMx8DFpGtL2dBZY+tS3OpLi1LdNw4Dh/dJO7x7gas
+GWVUnL7+Cv53rmvwj8bQEuvrQjaeXMGxJKUSm0qpJ7BvkSEmQZ7qnRS7vZ05Iz4m
+uJsTNnuxtf0+fmWNrIqpv/J4RvaZVdA5OW/zA1kKYaGlZoLtWhKOht9gPAKlBk4k
+/fBfHoKqm+vnaOnxSzuYpQkYWqeEu6qzfZOHABEBAAG0JU5pZWsgSGFhcm1hbiA8
+aGFhcm1hbi5uaWVrQGdtYWlsLmNvbT6JATcEEwEIACEFAlkyw7oCGwMFCwkIBwIG
+FQgJCgsCBBYCAwECHgECF4AACgkQH4z4hdU3pDF9hggAoh6EV67Ep7HGBScS+Ow9
+X/gxOWzFS9aMVJw+MzSRRBm5YDSsJ3QfSEZHSDc7gkD6cHUjpUCaB2bAnrfv2wKO
+4EawnXkj9vhnZ/M5lVl2TOi/95Yep3aa+qCgl3jNefzANgrRgXhW3m5ao3YazHVy
+eBezQGKbuBfLTuLd5sknl369zY7IOuP59KaB2BYZfPYqpRrquFzZhdQoReSyhu0Q
+DFewliiCF5QA2AkW7yqrQOh7mEpCPvjX2GfqCsvIF0HoIL6zQuBcif7ELoSnFWYX
+RRpD7b3zshMX4Yt6yOMkcoN/JOGe0F9L0eoK/Cl1oPW1j7tdnnEn0+56CxbNExQx
+mLkBDQRZMsO6AQgAwWzQyChoPMNa3OER/72w/G6EtbS15PxNNktkPYFz2ibrDhkf
+z3av4G/mxYpYgvPhGHlgHbnGGfmhetEXVebc2iaWYih5AXxzCBQfDQNB5gsVg4x7
+SAp5rVmTnmgjtPV0domsbwK/vNepUK4dw5jMwxIbVO8Hsy66B4yvEMj3lFKkOg3a
+8uY19DaAlxehYAWyiWfcbduD9GeDGaiIXnbTgaf0x8s8bC1zWUlShRISrPnMOvPx
+D+PCJ/Qna2ixES7IpkzHKJCX1NMwKk20rH4saiwIpQwL3A2ktF6VRMmv1xHwZUl6
+3xZYGN7u9cJ2pd64xSGkTZxVw3P5KVoMOPTY2wARAQABiQEfBBgBCAAJBQJZMsO6
+AhsMAAoJEB+M+IXVN6QxkUgH+wTO3xI0072PDGNFgkDcItRy7G6tKphQNAy2ylDH
+y1QZ2uHWqNBHy9LuR0lzWVqWgeDudQQL2MAENnxJIV3mKeiHGspOaj2RgQcuIF6g
+MvFUODfme/vahJMoe7JhmX7xCMVWDEMpOg8gIyr3qix0s4DnkXKXgE+v1qmVoYb5
+qoPguSQnOyrHYxWN6qc3I6mwBi4sJ3PsCrkKDUXgJBiRjgbSkemkDi7naK0sRRYE
+tujjOSICJy1rc7jjeEPRcsk1unydI8aLPO2fIooiLrWJJPr0feeZVrGHS2Hpr2Tj
+kB+5IR1A1FK4o7oFcZTLcXVlQFgkac8BPyRuUGhF1YX1JA0=
+=rXm+
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1F8CF885D537A431
+uid    Niek Haarman <[email protected]>
+
+sub    B7D9C5C3EEC4A9A9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFkyw7oBCACtGFos6g11ycruiWMuXwrE4+XbU85+1jR99AN5PcKjgXo/J3T9
+XaZLjJ+oTWCVgEHu5PTxAftbkq9+lmDAUEWZ1Q8dKrnVgBLsFNn+G2pcvVschorz
+CYFu/WT+eORA2UkdPZ7LH00iMx8DFpGtL2dBZY+tS3OpLi1LdNw4Dh/dJO7x7gas
+GWVUnL7+Cv53rmvwj8bQEuvrQjaeXMGxJKUSm0qpJ7BvkSEmQZ7qnRS7vZ05Iz4m
+uJsTNnuxtf0+fmWNrIqpv/J4RvaZVdA5OW/zA1kKYaGlZoLtWhKOht9gPAKlBk4k
+/fBfHoKqm+vnaOnxSzuYpQkYWqeEu6qzfZOHABEBAAG0JU5pZWsgSGFhcm1hbiA8
+aGFhcm1hbi5uaWVrQGdtYWlsLmNvbT6JATcEEwEIACEFAlkyw7oCGwMFCwkIBwIG
+FQgJCgsCBBYCAwECHgECF4AACgkQH4z4hdU3pDF9hggAoh6EV67Ep7HGBScS+Ow9
+X/gxOWzFS9aMVJw+MzSRRBm5YDSsJ3QfSEZHSDc7gkD6cHUjpUCaB2bAnrfv2wKO
+4EawnXkj9vhnZ/M5lVl2TOi/95Yep3aa+qCgl3jNefzANgrRgXhW3m5ao3YazHVy
+eBezQGKbuBfLTuLd5sknl369zY7IOuP59KaB2BYZfPYqpRrquFzZhdQoReSyhu0Q
+DFewliiCF5QA2AkW7yqrQOh7mEpCPvjX2GfqCsvIF0HoIL6zQuBcif7ELoSnFWYX
+RRpD7b3zshMX4Yt6yOMkcoN/JOGe0F9L0eoK/Cl1oPW1j7tdnnEn0+56CxbNExQx
+mLkBDQRZMsO6AQgAwWzQyChoPMNa3OER/72w/G6EtbS15PxNNktkPYFz2ibrDhkf
+z3av4G/mxYpYgvPhGHlgHbnGGfmhetEXVebc2iaWYih5AXxzCBQfDQNB5gsVg4x7
+SAp5rVmTnmgjtPV0domsbwK/vNepUK4dw5jMwxIbVO8Hsy66B4yvEMj3lFKkOg3a
+8uY19DaAlxehYAWyiWfcbduD9GeDGaiIXnbTgaf0x8s8bC1zWUlShRISrPnMOvPx
+D+PCJ/Qna2ixES7IpkzHKJCX1NMwKk20rH4saiwIpQwL3A2ktF6VRMmv1xHwZUl6
+3xZYGN7u9cJ2pd64xSGkTZxVw3P5KVoMOPTY2wARAQABiQEfBBgBCAAJBQJZMsO6
+AhsMAAoJEB+M+IXVN6QxkUgH+wTO3xI0072PDGNFgkDcItRy7G6tKphQNAy2ylDH
+y1QZ2uHWqNBHy9LuR0lzWVqWgeDudQQL2MAENnxJIV3mKeiHGspOaj2RgQcuIF6g
+MvFUODfme/vahJMoe7JhmX7xCMVWDEMpOg8gIyr3qix0s4DnkXKXgE+v1qmVoYb5
+qoPguSQnOyrHYxWN6qc3I6mwBi4sJ3PsCrkKDUXgJBiRjgbSkemkDi7naK0sRRYE
+tujjOSICJy1rc7jjeEPRcsk1unydI8aLPO2fIooiLrWJJPr0feeZVrGHS2Hpr2Tj
+kB+5IR1A1FK4o7oFcZTLcXVlQFgkac8BPyRuUGhF1YX1JA0=
+=rXm+
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1B2718089CE964B8
+sub    A182F48D9C2C0825
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+yEpqZGNE2g==
+=OLRp
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1B2718089CE964B8
+sub    A182F48D9C2C0825
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+yEpqZGNE2g==
+=OLRp
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D7C92B70FA1C814D
+uid    Matt Sicker (Apache Software Foundation) <[email protected]>
+uid    Matthew Sicker (Signing Key) <[email protected]>
+
+sub    B4C70893B62BABE8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=K7VW
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    14A84C976D265B25
+uid    Rafi Kamal <[email protected]>
+
+sub    0190A8A50D88C2C9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+sPa3uBnylgYyUnzuNZB3kLz3zAM04/jc8Vk=
+=/GAm
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D57506CD188FD842
+sub    63F72A7A8658D653
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFj2NXwBCADPJcGfWz4Zsfa/UEUF6a4aAIjqCy+rNmLf9Vs3HD6B5p1r7VkC
+e0HhxrfbkDkQu6aEmAwV6GwYiwWBf/LQYNdKm1FYZFhKLhyuTPiirFqIouEFqiK2
+HPFdil0d6Bi6HB27qe3NScpqMK21ectpQfTGlmd0HrSN55pSnb9k+Dnx5MdR+XNl
+pfA4f5jNBIrnsCvaY5jccyFfvGpzykVF0yaSikbcs9hJ3pbfddLuBJ4Tk+yePDjR
+FWJ2Rtau0Pbaz4CebAIQprLfdOuxKQ8l7jhMZpRE7+sz1mU6fvDnPyj5kvnoU4SB
+tVvsnSuILeewp99/MG/wE+B5uqxG6KNpxRgvABEBAAG5AQ0EWPY1fAEIANhZYkCh
+aM7zRmJZhzbwoHNfuKfSVYfNjCpRdu5PkutVxBsjqGWs47SjXEjhiTjAD/s3cgj8
+x/uHKmXXJoHUhnU+9RPlRiEwt6xdaEgRqMJyqrqIJ/PqmerMZsZsnAC4dFFDbR19
+lfDBNa5RjF7f2s+rHtaAPSMbn7lfeBpP7V/r4qUg9E2pRqoCCMqCtFRFlNgLwv7A
+jgMhaTaO1Am2sxfsTOVyoxCxC6kpJE8r4iRVstdfKifZrfStE7ZmtKmRjqLmblla
+GkQXWAlcayc6SLJa6bj61Ln043+qum9l5H5xUBHwfv1p/UPzNpZVGgZ/SVfV9rxL
+/DktPZ5S+HPSyBUAEQEAAYkBJQQYAQIADwUCWPY1fAIbDAUJAJ40AAAKCRDVdQbN
+GI/YQsl1CADJMZdQGxuAOmK16/0k8q7sNSbGtrdyD9n3yLsWg9cCTI9ecJdM1cXT
+RglhAfsm5sr+xJnyA6ShTn8KCxgRHPqLTIwSfmFNjePKmWUK1iBRdbNdbfHiKUKb
+Xc2CMwkwHj6hWo7rwh7WWS3gtKzldUirfIJoA13AXrtJQRq0qgV9qN5sEpVGr+fe
+5whzG9BallTirYztskrI82p3e4thRPr5XDK9r8SWJKPuhL9zEfStSMVnR0gO4n6w
+pFryXcDaWuA6/+hIzS+RwTQKpQYNbb/OKrkAUH6jDLzKtixWNwxuDJpVz5YHDJVI
+LCwzEShVwuejAYnuG+xpgw1jIxtoj/bGiQElBBgBAgAPAhsMBQJZnMEmBQkBRL+o
+AAoJENV1Bs0Yj9hCzpQIAMMZ7J4QXPur6jDgjpbWESvLbSSYGEt6uIMB8SEHBEJ1
+DdMNdRKu6AvUn7doVOhVDbzof6jGpycRFG4goL1fJM7pLljcOwJ+75FrYZCdC0sy
+JPd+QkpueUHyE+/lZpvWuu0vlgfDkfIFFhC96/h659oTt5j82l5YIXanpgQg/AiK
+l9joXXxvVt073y+ngFHpYhCkrdna6rxN4WRbVN2OlUJx8BP4tfFagYKaMSlPkA40
+03nUlwsPKQ8Bj4tASVSpCihlR5ijmxR3YxNlMET2f1ljvj8Uu3N0LrR9wVr2g7t7
+nqTzRs0OjV+r+qy7eoZ4NBugYFXpP/RMAXZJezpKfKU=
+=FXUZ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    85911F425EC61B51
+uid    Marc Philipp <[email protected]>
+uid    Marc Philipp <[email protected]>
+uid    Marc Philipp <[email protected]>
+uid    Open Source Development <[email protected]>
+
+sub    8B2A34A7D4A9B8B3
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+bpJ8mdzS2PJko7mm
+=NMA1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A41F13C999945293
+uid    Thomas Neidhart <[email protected]>
+uid    Thomas Neidhart (CODE SIGNING KEY) <[email protected]>
+
+sub    8183E80D264EE073
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+25lhPkZ/FaSYF1lb13TNIRT1q1My
+=pAbP
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    55C7E5E701832382
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mI0EVdDLQQEEAJMtYCaTA56YsP5RzQzPvqVTaR2nZ27qRk36blHB9WmXK+NHpGeH
+PHgq59mLPVueo2/M5k/fFrCe36jHePP31gYpFtueeYDfsofHwod0WhsHyC7JfG8d
+jEnSczTCmOHRZ3ed9ef6SeWUozYCQAX/tAbpoCthe0lTDYhFhkzVCe/FABEBAAE=
+=45ZY
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    10066A9707090CF9
+sub    2B9F5DBAEAB53FE8
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFGKp5ABCADTyMhDq+7Kcv2wXOpOmZgp++JNO1erNUjVqFX7n9bT77DciEML
+LNxWVF1tkNqgkn0ughZTXK5EGdjUfZaJaDDfG4BIsox/ng4nDvIp4CtXqHbWqrlc
+SPsMl82uABh7ZJgsZM4Z7c8KirxYL42MiWu6hhRqfJZigWUd+ceKEDuFcNHcEA6h
+98LWFCZ7KHjKhZpUbMBurd5f+N2mn06YnVZrHVzX+q6REWGToF3p+mrBwstrGaiU
+j78gMgZnI2tiJ99HqmocjLXbwXxdvFmLkniBHAQ91D9fHfYL3odTEkjZ/Wi7DSZt
+PAbEhbBIKpFKnbazyMB8ACeF+m7jQ/Nq1+g7ABEBAAG5AQ0EUYqnkAEIAOMb65Q/
+m/7+A8XBVNXgoyGDksgTDSIfvePi4saGdSJOcQWc2HbEHFhqcOqr50h0aOEBN+7W
+B7X8ZMqqeCub1BlXLAs9gWhw5QK4mAKCtaARpmWj4sr22JscpMi4uutgcsfakRae
+Tmd1J7efjcDNL0/EsQKQSGht1AakJN8zfyb6IBuuAqj3xegwFCu3MRanRyY8DP4C
+YXfIyLBPLWfDVBViK0HOjEMEO7tdvsZ8h6ptLNqAYQQYcHFi75lKa626RVeEbxK3
+dptWfA7vQ59PlnsMhUZkiDDPzhnIatpfdBgA8EpBJ2Lrq7hE0nZI4/0rn/wxIPT9
+Ibl9JWeSfoT7Vc8AEQEAAYkBJQQYAQIADwUCUYqnkAIbDAUJBaOagAAKCRAQBmqX
+BwkM+aaFB/9TyOSAJtb7qonJ8Q5Un4JLIhfTIaBj3cMHzP0ZbotpskDqnvRhUe9f
+OM0KG+OibqaW8hKT3ZQVVIJeSVUCDYyrWX93KPV/tiL5F+5WWN+/L6Uvp6598oiA
+ZvYBNNA5Gzn8kh4b5d68Qyr9W/2TAWm+jVYywlguNHsysLLTvPVG5OGK48/dYSeO
+2PyCy7hpxV0z+xDinDDiVjwXc+vHoTg8ZDILQG83ZsICO7dO5FACCpFuKu2mjDvo
+bcV4ajxKHNvnnNwFUxuGNogQOiMaeH62T/WBCdeyE8X0A+UsH6WVXmXkCSDxRD96
+UdK1vJJR/sRkoSFvf8E1KmFZR351/wZQiQElBBgBAgAPAhsMBQJX8oreBQkZM+ZJ
+AAoJEBAGapcHCQz5ax8IAIMnwmPs5nvuo6A8mSEmKXzW2M9K4CimmR2HhLtFoo6n
+HRcrL05I/XUq4YxqQLMmZeQ+N3lk5RVfZwJDIY3NzR/R0dGiRP4z6F1sz7qRPYxL
+faFA8anPzrfW8tNtD9QeXhG9k2H4WVYdPwQe7zKmyf42XrJSX8bpgxAoRdGR6atr
+VZFf4Dwgua+SdIrSpeiqXCqPVSh6xoQ6svNXwnee94zY8/R8I+6gqI7E0XaZY8ub
+q4Ep950wDEkOIBB3HsTgUauXd9vdkFMnO20JWZRujDcE6U4GJsG6OsgllB2e0m9V
+OL8rBTxpelg6gJCVVXLOLUbuZ9UUebjIiAABCA6V/9A=
+=HrWq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    E0CB7823CFD00FBF
+uid    Jake Wharton <[email protected]>
+
+sub    F3DBCE882C3A01AA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFsNoY0BCADIvRrJEX3k7UeuT6zt+F4++xH+5Qo7QzdicjFhhyb22PLPyIsI
+Ema+T4QqiPDegUv8yKKTTBmHNw/vSUHTPX9ZUpglckopuOgdfnuQjTKEOEzrN7V/
+ZGLB8yR+BoKEJBLdp6W4fGHIxza/o8Iwg8nV0/C9X1gvQI0I63aexqqA5Y0eYt4y
+12mQur5sKabJRRWxkn1U8oQmcFs+P/KPVtS4lUb1nsGzFJbsiKY8AOI1RbnYgtIu
+c6mzpiUk0NPO27xKScyDq7lKBwwOZMwRzX/6yX7jcAtyTWZnWS675MCbT2K07ubU
+Ykrs9NObwDXlKZWLk6JuADgzQaueYIrjLRYxABEBAAG0H0pha2UgV2hhcnRvbiA8
+amFrZXdAZ29vZ2xlLmNvbT6JAVQEEwEIAD4WIQRHv1kiYc0aimm3A7Tgy3gjz9AP
+vwUCWw2hjQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDgy3gj
+z9APv/tcB/sFtJIfaqlhEMDI2o95mhd/IOpCkN+aECpiciquE2RkRPj+lUY9qYZG
+0mbcQkeXWQjkuD30DuiwHSsSqDzya+lFVHmuXfL8uxbDWJ5YYNnq/Xs/7NA5BwtF
+PVItqJVUGNSVzA/HmKtCF8ztc/o374v2UsNSxoPe0k2XirZ9XPaRchBKlYulLYAi
+mwsOI5O2+CvWojRXl/p9/NKtHYCDyVtaU4ujwJbrs2MEn0X5vPfkzphXA010T6If
+l1MwLjH+WGYiR3Sxs3dWuP6m4acACT3itSZ3sgoUYZ17aKaO99zzHKEPx8ov5/OX
+pAX71SdwRYph8/EVgsnk/E8zOW+DeXgJuQENBFsNoY0BCADL7NCKWHi1931saO7k
+RdrOE947qnMqHLaPe0J8mVLIsYE0PntBE5cBRz3VAUi7cJG6oXWKaDfEclKPb5Bo
+y2SZA9M50gUusXmv1jSY9fLgT9kID1zbTNVKYvKREXmeUQatG6GM/o23d3GxuUww
+BGEKJUpgoGdk7roCLnDGD/TbpqCg3YnRMLpxo8ou0qZOxbIHaxfQWqXWomK0kKgL
+F8KR/ptW/5uNSLVheNn1v5qTpPF2hHcxgPMS0gE6UPPQFp2Ivd30q+xE6HVH35+d
+Z9+n89ejOVvQjNbRzHR2uYJnS70YfgcdTFPfOcMU4g1H8AzfupNX21/rfOFCx+mr
+CzbRABEBAAGJATwEGAEIACYWIQRHv1kiYc0aimm3A7Tgy3gjz9APvwUCWw2hjQIb
+DAUJA8JnAAAKCRDgy3gjz9APv0lMB/9DrHctoZd4iCOzicjv/8t3i9ZM5o+z8lo+
+LDCXSt++VG7OcbFHLf3uPalP0P6M9M4oPpR2mEp3yxTMeKqX7VulTGf4hpf5npF6
+AnTq1MWf9PrK6XyTKSAycqM3We592xbZatp6NU25v5MlK8LtzPEP2ti5IfI8MoCw
+Rqpbs9D3zbABAgBpcaahsEtb1o64R7TyH0W91A9x6PvjhZs+cyijm47NMewJXGCK
++znvg2tjL0zIGVICjBqrCYb3R7DKmUSlemlW0nT7NzyYLfFLQ9sGgOJS0QOcZS3Y
+E3TeXafk5ruGsCO5A33as9VebOaayxpZKD4QAlMUWXs509ybOzVR
+=bCXo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGNBF0uFrIBDADbJkwrWs0qPrv4bNmPZMWHcryANAwodvFF4f51Z6S3pBkuBxx0
+vW8ZKC9/scJiAzSqJRf4im70GPNE3MZjNyfuRdaedXw2rFc4Ip7lBsCtklYmTWmC
+vA9DXI6gIhvQ58s13fHcLGepIfKZcIXntyXp3DcPz8XJpfZTwgpS6RlbJjr296p4
+ya1LiyH5GBaWal7DcKwgIBSSAbtEyZH0tNp9wfkiILiTI1RE1D+DrQ9MJa1b7Gag
+qBMn2A74TFEzx/bSPMMllwdKTRurvjz33TTdNuyd45bkteMKiw5O+6c26Q29o6hw
+oQG8efNDrzWOCjW2Sj91DPdA52UfJ9T7C5dcf+EcCLmpV7hWrfkDdzDX3NXnMU7A
+r7kEPKeF608jEcqS46YB8lIBqC6gPMwluLqmukRpxrlyMwsygc7bbieMZRhczCLo
+tj9CUAUW2dvXwY32N7zUqFgVnJ26t4/bHRAW5QVVqrfDC0WmoUVyOsPh9/KKGmIf
+3ocDh93eN6x0UH0AEQEAAbQgRXJpYyBDaGFuZyA8ZXJpY2hhbmdAZ29vZ2xlLmNv
+bT6JAdQEEwEKAD4WIQQOudfEaPl+RAUdZQrXPGjuQVLCVQUCXS4WsgIbAwUJA8Jn
+AAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDXPGjuQVLCVSyzC/9UHsOGJ3px
+qNcSYm6UJGnaco1XNw/znMBUFbhxO6R0dhgfc5YEDm6cQlMlKskX5VgdbwXKD85X
+YJx9O6Xew9GQJJy+xVBm8di0AqCes/0mfRsANeMWsxZ9c77zSZdWHjyYxZSvVFAl
+0UL66S1lYuMxeBrBdWn1Aq85g6O5vQI8a3OiBWu6Fx90GwX9DY96BSwTqxKFkn9s
+Pt3VL7moJAxSBUEeWKezD3C9RlkOqmjuEtsQ2mnF0NPWgIO0tABMUXJiOR65YXNq
+V9sgu7OVhXylBvG8fVp/rFyA61T1CJwDoZwkoyXBacnK8AA3vVwP4Ll4vw/MIxww
+B8p1oO+4dbHzmGDU63ic0JFSuj9eIGdQWXf0acaYmjIpSs/0jR8NOY8S67SNsWzX
+9xrekvUriWjo4l7L/k4i4lPcZOjpRX6Zov0G00rAPq5Y+ZV7J3mRkKrHqw+GZZ5C
+41YP9Td+RBapg0OSu8wHeAeh5rnrFNDHL15iYl0/H8dgeiVrr3YCaa25AY0EXS4W
+sgEMAKfohKMRHHVJ9aAse/rwsoF9D5Qxg/g/DeuWRtnFwrSv+6rBJW00S1jIXkze
+M99MsjK4aJaSLfId8SQmMWMvzwBp6m3J0Gqy2CdRo3v6zW0juPHZ2vDs3wt9sJPJ
+edufqxlXwWo6XhmNJXcclBzeP2f17Phx6Wrp78ONo6tDg77IHLdsXER/KwYAv4cK
+6O+MahvnelpAFyi1fdiLJkkrwIheUKF9jKgCvYGQeQSoe0sopFD7zXYgE0DurlpI
+9Shj++i5jN7atvaHRSFp6Vo8PkmtGeD0jq1N2nCdVWkIIZL226ABcSBSQSVdTiLP
+FrMmqlppoxvwl8Q/R8nKo1lsNKp/HV/qshF50GfpJfLKA3GmWZWt/dkCb1nurCmK
+jAO3AHCL5p++idGIsSTgIDg5mcpnltG/TH1atoQj1ixRZ/ykSu6VO+RygcV60IdG
+Ct8CFTLSLUacfPieSR6mGqLdta5ISNHqbJ3Xi2mQwADQmLbYnwKcU0uunRUjYDzy
+IINn0wARAQABiQG8BBgBCgAmFiEEDrnXxGj5fkQFHWUK1zxo7kFSwlUFAl0uFrIC
+GwwFCQPCZwAACgkQ1zxo7kFSwlWfEAwAqz6AHYxuxfbEOkCd/d7Zhd8OvmLHyH70
+A3wfw1LXHowUQBhQi2BwZ9jwXzu7s3ciohMaHvN2w4VFLwCY86VnKQ+mn36Op6/O
+05UlGFauaCxyT9PMHJOHpKdUopCPnajquSdpHZ/y2oCl+KUcMEY+s74dEkDvj+Qb
+L4VMawOunmKlomYyFurRJ5k28RhmzgGaUr5r/2xUMIvPaKQ+YamxjW8THKMyNZqu
+D/cRNHusxtXXoULhO9XOhSWyOV1EDwrK+uIV8Vg7kP0AD3jNW+S42NmrQnAUk4Ni
+Uj/2vtXqqZrr57qxOAz7GGCh5xNGuPXeb8mjwCLqYECLIms6clQT5gWHD5AU36te
+s5nZyahgbVU34Jx2XQkbyw1245MWBeOfjZA/cAQfweDmKNf4sevLfDoLu7fnsOyw
+IwrtprcYdzyhAaM+pO76brTX40781a2yUH2zpZPWobdMyDNDeo+bql+Wvzb+qRGS
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    D73C68EE4152C255
+uid    Eric Chang <[email protected]>
+
+sub    A23FC45C6F9E2F57
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+zJV7rbKv80zNxWNJMOr+yshtM+Hclm3s
+=mRRB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0374CF2E8DD1BDFD
+uid    Sonatype, Inc. (Sonatype release key) <[email protected]>
+
+sub    F2E4DE8FA750E060
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+pA==
+=OkOT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2BE5D98F751F4136
+sub    C7FDDD147FA73F44
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEwMV84BCAD0u42clJ3hghKlMGwFA8PPlPgSEZjyvs2dRCF+dKWBaPUnR88K
+kGfWB66jX6PBtHzeiVRa078lL002S1lSth2A+s1UfYGS5wVbE938wO6PCMwgoXJ6
+0MCLsTLP54MDlly4tq5qV0Zme1wH+9n/AC0fbKkLsEWbqXhNJLJ7F8TUh6hPziko
+mLAZCb297KeEDJ3tFN2zkzjx7V79/nkA1sKHQC9INdj5jXxkglTwZhcJgPbxYzCz
+nbGeczPxwzNrN/elx0DDnKEpEms/nURfXETsnd7t2xuUuAYhpGIadZOM+LojhP/A
+Wp0KDHsiSc5tQ0oJE//ydBksCEKid0Tu2bXPABEBAAG5AQ0ETAxXzgEIANGJ24GM
+VmW0QcuT6ykJXtjrgXW4HjOEyylQ6LQJZcCt42tNA95ZhAAiNgB0CBBUuOne7y7H
+5IW0wxnrO8qOStqvjbkUWVheqA3G0AlokZVWQRk1LjmBlABJVeHNBle0248pwrXe
+0lY3NVVywxPE1ol9DOasldSv+nKyMcRFgkZ7rPFnVaLRLoozuAIDwXXaRPczN3pg
+iegwo9BLqYV5+0Ncs24+G0hO6iTToX4166GvjWa0e0YHuJ/zztXPy9CAJ6FMJy4Q
+2ZpyfmIPua653srMDty1igFdR3TVNd7xIvyhw+laJY9GxWM0G86JOCpZhrTWDDZi
+BhgL+sF1iNPcC8kAEQEAAYkBHwQYAQIACQUCTAxXzgIbDAAKCRAr5dmPdR9BNoGn
+CADj7y3qDzkFxiHbfX6RlWJfaJ7wvz2r5D7WOiiyWL2y++zMVPVEhpPSw26b8Car
+4CjRxoG9TqR8GTO8yLlgQ1mPWovaxcmfNzJ1GBQGKD564fKCJLwVMaMgMz8jEANd
+FQNA5Ka25MdixHIYafKgY4TDATQYAHSs4MXW3Y1B+54LCJcL218vdWPxQ7k8AYLQ
+Suei1+1yA4p+tpjxhr+HUuFv8tA2HUk8RcoyRfUH9fqAEuR/u+xWm4kmE4qMIgio
+665T8WuTGYLkUDJEh7F8+L+r+f0nmCxfPhIWenVOrjpyzyjPlNfaweqk2dvHG4wZ
+ulntJIX+jkiE3IPFPSOU3gs7
+=s65m
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    2BE5D98F751F4136
+sub    C7FDDD147FA73F44
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBEwMV84BCAD0u42clJ3hghKlMGwFA8PPlPgSEZjyvs2dRCF+dKWBaPUnR88K
+kGfWB66jX6PBtHzeiVRa078lL002S1lSth2A+s1UfYGS5wVbE938wO6PCMwgoXJ6
+0MCLsTLP54MDlly4tq5qV0Zme1wH+9n/AC0fbKkLsEWbqXhNJLJ7F8TUh6hPziko
+mLAZCb297KeEDJ3tFN2zkzjx7V79/nkA1sKHQC9INdj5jXxkglTwZhcJgPbxYzCz
+nbGeczPxwzNrN/elx0DDnKEpEms/nURfXETsnd7t2xuUuAYhpGIadZOM+LojhP/A
+Wp0KDHsiSc5tQ0oJE//ydBksCEKid0Tu2bXPABEBAAG5AQ0ETAxXzgEIANGJ24GM
+VmW0QcuT6ykJXtjrgXW4HjOEyylQ6LQJZcCt42tNA95ZhAAiNgB0CBBUuOne7y7H
+5IW0wxnrO8qOStqvjbkUWVheqA3G0AlokZVWQRk1LjmBlABJVeHNBle0248pwrXe
+0lY3NVVywxPE1ol9DOasldSv+nKyMcRFgkZ7rPFnVaLRLoozuAIDwXXaRPczN3pg
+iegwo9BLqYV5+0Ncs24+G0hO6iTToX4166GvjWa0e0YHuJ/zztXPy9CAJ6FMJy4Q
+2ZpyfmIPua653srMDty1igFdR3TVNd7xIvyhw+laJY9GxWM0G86JOCpZhrTWDDZi
+BhgL+sF1iNPcC8kAEQEAAYkBHwQYAQIACQUCTAxXzgIbDAAKCRAr5dmPdR9BNoGn
+CADj7y3qDzkFxiHbfX6RlWJfaJ7wvz2r5D7WOiiyWL2y++zMVPVEhpPSw26b8Car
+4CjRxoG9TqR8GTO8yLlgQ1mPWovaxcmfNzJ1GBQGKD564fKCJLwVMaMgMz8jEANd
+FQNA5Ka25MdixHIYafKgY4TDATQYAHSs4MXW3Y1B+54LCJcL218vdWPxQ7k8AYLQ
+Suei1+1yA4p+tpjxhr+HUuFv8tA2HUk8RcoyRfUH9fqAEuR/u+xWm4kmE4qMIgio
+665T8WuTGYLkUDJEh7F8+L+r+f0nmCxfPhIWenVOrjpyzyjPlNfaweqk2dvHG4wZ
+ulntJIX+jkiE3IPFPSOU3gs7
+=s65m
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    083891AD4774845A
+uid    Eclipse Project for JAXB <[email protected]>
+
+sub    8118B3BCDB1A5000
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+XCfM
+=930f
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C29B11246382A4D7
+uid    charleskorn's Travis CI builds <[email protected]>
+
+sub    97149CA7141687A7
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+WLi/z9M5/VqJKMD6Dc6RCIwKYA==
+=SsPP
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+uid    Herve Boutemy <[email protected]>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3A1959EEF8726006
+uid    Eclipse Project for JAF <[email protected]>
+
+sub    D908A43FB7EC07AC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+9Q==
+=PprS
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    AC5EC74981F9CDA6
+uid    Cedric Beust <[email protected]>
+
+sub    501B5ADEF57CE6A3
+sub    5D9FFE7B8E3DEA8B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+FF1NsuDIia3lMYUCPApVQbA4f0Paaw==
+=qDUR
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    AC5EC74981F9CDA6
+uid    Cedric Beust <[email protected]>
+
+sub    501B5ADEF57CE6A3
+sub    5D9FFE7B8E3DEA8B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+FF1NsuDIia3lMYUCPApVQbA4f0Paaw==
+=qDUR
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    AC5EC74981F9CDA6
+uid    Cedric Beust <[email protected]>
+
+sub    501B5ADEF57CE6A3
+sub    5D9FFE7B8E3DEA8B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+FF1NsuDIia3lMYUCPApVQbA4f0Paaw==
+=qDUR
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    F42E87F9665015C9
+uid    Jonathan Hedley <[email protected]>
+
+sub    6064B04A9DC688E0
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEtsF2oRBACcai1CJgjBfgteTh61OuTg4dxFwvLSxXy8uM1ouJw5sMx+OKR9
+Uq6pAZ1+NAUckUrha9J6qhQ+WQtaO5PI1Cz2f9rY+FBRx3O+jeTaCgGxM8mGUM5e
+9lFqWQOAuCIWB1XPzoy5iTRDquD2q9NrgldpcwLX3EVtloIPKF7QLq72cwCgrb5X
+R25dB8PUdZKUt2TtJbjB+SMD/1UzAPirgX0/RpL9wUR1i14yIrTfpFP/yM9PE4ij
+qcZ1yafVdw64E1k5W4k+Pyl4D8DvSJvbJHvYjg8/G9V66WzaKcv+987fetUuePvY
+/rwxBPztqq8y6+hjBc8QVhZGWmAoGGEFO6MIGsSyN5ohqPMpNXkczIo+NMvDxGzz
+ld5ZA/9awGTsigBdpBK2F6GOmbvBv+Xebu9rbaJvBvP+npNx01s/f5sHPCxmBTFk
+m1vtaMdZ29RovrWPSZRj8WWes0bcisw80250r1CBlYzGzqEVZ7b0Hh2RfkfaxbYh
+wikyfTfA2iX8TUGBgirsZbyegjUadElhwFNDASnvLTEuQKeVLLQlSm9uYXRoYW4g
+SGVkbGV5IDxqb25hdGhhbkBoZWRsZXkubmV0Poh3BBMRAgAgBQJLbBdqAhsDBgsJ
+CAcDAgQVAggDBBYCAwECHgECF4AAIQkQ9C6H+WZQFckWIQTzGEvNVfTQFuMNTJv0
+Lof5ZlAVyUaVAJ98o4QsLXrRWAe4qp2AePIJa5pRhgCdGrNdOEgEImKoSwS00vWE
+RiojY0W5Ag0ES2wXahAIANLGdCWb1qCiBm/qOjDsCOqd7jG/olgcHWH6IdkT51GX
+QcBoSY6d9gok7dmN6mBHKguTbxeRVncdZuSjkHtTvkBaKjypwtWz4/bmToy1ape8
+ebUsAnjyGjDQfnzMRIeYWMC1rQc/J63Qj4MJvpwMHnKBPGH66Zq12ZP2C2pOeBTn
+hMC2Gj/BOLthR4hKjflpijIyEcC81aWAK1kQm0y4UkiskQcu1MRKL1B/ZiGuGLlO
+D29keuC8KKTBwgZuaMNFPJAsPL6VuNBqwXP9nmiHlwl9lye+xPbPWT4FujKCeiHN
+cVer6CySiBFfLeOHXijUsA31TWR8cnpmimvPxoKY1OcAAwUH/1My+ZV0Zsk3Sakb
+xyH1Fd4OAN1++3d7zq6Gm/CisODBcti4k4qDe27SisRPeyY6dtWGRXeyqZn7tov5
+K/UFSaPg0sXtqdsXEKM8kvpWsjyvIf+tS4cofL481eQFFgOWbqfj+yYf1kZYfRsb
+NJNL4pmDBSiJsN5ma+BAPFAo9nvOVyBzRwXdAdVSLpKuDo1OEIUa7rTXmyMtxmd+
+cpXGl0+b9fEav4kSQLiRaAs11GhPdP1ff9qG/ANQmBChi6HLzkIAbI+/toD+Vjj/
+lsSOE1jxDUSjFXIVQRPM1fu2GYmoTwsDkK/U0FjGlCCcWfOcq+zvA4STgV9wexBy
+H6aAA12IYAQYEQIACQUCS2wXagIbDAAhCRD0Lof5ZlAVyRYhBPMYS81V9NAW4w1M
+m/Quh/lmUBXJfs8AnAyiCC2xgVDR0RmOe5pmecSjFmwrAJ0W5jNfBpStUykXDnKq
+hD1krrLqx4hgBBgRAgAJBQJLbBdqAhsMACEJEPQuh/lmUBXJFiEE8xhLzVX00Bbj
+DUyb9C6H+WZQFcl+zwCfc7b8hD9OHMusz/ZR7dKl3a7nA34AoIdTiFJNKRczWAbd
+z17znsg+RUG5
+=8yMs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BF984B4145EA13F7
+sub    84761D363E7B0FC4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF7rgogBCADU9OwoEFdIgN5U0JU5pI7s3T1T1LeDMzAQ8l2Hq4jFrhnrjcEA
+ieDSut1YIv5NTBoZv4CrklaKvvQNUXPvKrFImA4OKhBodKV3wsq2efCATDGa1JAw
+VEJx6nJxxMsCLCJvmZsD+YE8/DIBI6jjnjh8jagZVkxkSRPvUIxlZCxytIyqXI0t
+O8pLh8+8p5e0PgGb9OoszxEQZdBavsixdpe+0feU9cz0l0jJYx3W4ErZeCGGwNat
+UUiW0ctb3iz7BkNhhoV9zepxkSLzCf5zBeyA+WfD34028pAfPpyAfDYXF4x55sVP
+/3MdWGB6eU6KzPG2/QV/6or5E+C1yCMrnMy1ABEBAAG5AQ0EXuuCiAEIAMExiS4A
+u6FPSlMyjCaT8EfxP05ey79rYSSZd/ixmqyVzJkXYbf/SJCBeX9+NtWU3LEuL0L9
+WXgAA9Ys18NaJzBMC4kiQJfyXK6Kak7sUfZWWvx3Ad3It35X4svJNuR9GoqgsOvC
+D1SPgK7MfTcAF8e4j2UUqgRnjM5S6dRa6AH2s3bCj8GE+YSH9Ag2osNcKBgosNiv
+w04tYh+sjx8W5ehKaOEMrBDO8OMYVeiIEOvBIjsCZpJgAnOBPh/7zIQ72tPa9Ou3
+nAWBwdiPBgqv5FTIVmHWMfAJKRRCW4ri2hN6toHGrjJMgobtwW56vTibb82EGLdY
+3BF41DQT2MEiM1UAEQEAAYkBPAQYAQgAJhYhBB0Ki153xninxyREWr+YS0FF6hP3
+BQJe64KIAhsMBQkDwmcAAAoJEL+YS0FF6hP3VWoH/1Uhih+Q/iJIddvBatWdzpgO
+e03ppK9pCWZ2KepukILbR8bpX3cqUiTbFD3W+ybrrY0k4Oe9hXcm3re0N2GAfEWf
+tRknxXH0TMeyWoBlldfSM5DjrljM88XAIkk/T2wcARv1PC59IIZGKOpixItF5Pps
+YII4YzlripU98sXBTSlJLU1/UZaT7XNOZ9O1/PVxADpVIeH6MVdWh4W7AV/dYZ5j
+d31NbXDTtyDJBUYoiq2hu10+RNoqq28WmJQGD8aqIuKOpeBA8EirLcRoDGELSqYT
+lQyC8nl8P5PgkEZ5CHcGymZlpzihR3ECrPJTk39Sb7D3SxCW4WrChV3kVfmLgvc=
+=WqT9
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    E93671C7272B7B3F
+uid    Rolf Lear (JDOM) (Used to sign JDOM Packages) <[email protected]>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFCPD00BCAC4tY8wMQTsCKyII/mMkUDAkXA2cLM47fY1Wn+iohtgtalUdA0v
+AhGvTdFU6/St35rOKNoyLC7Sy30FBYpAEfMB/x9j/CaQtdtGhaQU0hCvtWGhhS3J
+BJb3BIzhKuP2mx+6tgSPtP/meiF/K1GV8x4s+4JyrVxSFtqz+yp5szFNbIXA46cg
+UWOkzPhwA567Jf/8dUWysXb3lp59DG9anp2BQENwh/EmUhuhlPoM3PeUIPcZAiyD
+SMJCR/KooLzE78lAOK14oD8eV0qg3tT0R5RlsNKfFRRoo2bwwPhz0SUVqJlt7ehd
+By6ztFKej4M4ZKonnWUiVJhKEGm3dVoEAJTZABEBAAG0PVJvbGYgTGVhciAoSkRP
+TSkgKFVzZWQgdG8gc2lnbiBKRE9NIFBhY2thZ2VzKSA8amRvbUB0dWlzLm5ldD6J
+ATgEEwECACIFAlCPD00CGw8GCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEOk2
+cccnK3s/HJMIALDETleTycLBl02uRg9ZRwPNWANajpfeJK9yY/SgpVfVn0ExXtY3
+/1Sgc0kZn66c1ohjv3DhLJYTL0GgSfb6FmAkvXMTDfFcm3hMMQKBPTUxRKw+gmgX
+ITrrZbXZcEprlF8GWlAcpv/9X+m5X+u24C0nR8tOtwZkwQa9oUKyUajYrt5KUJUN
+JoVpd8ZDWspXw7HkdQaC+tMjU1i8rypptfpnSvHFXSgH49pe/EAT1C88mx74eGMR
+XGJKL4VdzvNi+m8ECrM1GE9+EHBBLExL7NEd17N75ZYQq5HTQYKEpWZRCewOFJS6
++QWMp+oawQ7VUApo9bhGSH1E7X0IcVsqVr8=
+=bCVv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    30E6F80434A72A7F
+sub    C30F4CB428DDFC28
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEaNL+QRBACYhfwZdDNXVeU9G5/XsxrUgQGKkhfOaB1CyPHAd02Jyc5oHR0a
+nu7dHb6QBlY8b47pX8ii+uTCOX2yyFlJt2cuKYqN1TwHrMspDTC9K1x8WJMmKdM5
+KUtWchFQ/zmFgIcXM8Vm1851k0aOOP3Pkexv51u4kZ6tbAK2iqYAawB93wCgkv/X
+YpZR9qL0FWip23gsjjxf01ED/3cHs+5L6hm0vP4x8xbsei31/4yHPIRytLhkS3CP
+tPZGANloRi05FlPxNXMQdeI4tUk//V3Yew5LkJC7Ue0zkAKAxjyWYBBsbl20grmq
+89ZKcj0/pZBw9Gzm4indpORfPRT7BBc+F8+2TUD9jpha+W6paCLp9pFJR++OyiZ+
+hNwfBACIyapWUmoEmV4XG869hsnico6vF4WzuhHe/PfityhlHX2M/DDX0KrMqNeM
+muxYNsKoSw3EU8BS+g6bHYvxDFePPhpFIMwbtEEOul533V1sGbPYhBIiSBpnb7FX
+AnbVIYk06T5mKfaK8n9XB4BIrt/pz9gxDjb9KBuIHE0H8OkfzbkCDQRGjS/kEAgA
+madPbo/cLInRyG4EezfSMDw3wNw3Je3+Ozy12FgQE7aaUQ6a4YRLkWeldmTtOBlV
+XqRUV1MrGQ0+C1bWEAXPsrdzzInM8NiXz4d5kCVNa8WzfnA5Fe46hxUqUawSEt6P
+9QpT02mzYQZhazDMJqgGWFHoMHKQVtAqTlKH8W0D0YPRdV6Qn/VYZ2ZRW2mk0tU4
+/xBMLprmcQCrDYXYPC/apl3tXuzXqs/FA60lKZzzE+KqW53G7qSbSSN59IRCpk0N
+X5hFMZJ+/oBItH37Z5V/pVhRGytEfA9yv3IELpJ1CLtFZVS7lJTY7hsr74qRhbCC
+JAkjR1Ywz1/Ya29NUjF18wADBgf/SXXHiYR4XasV+LOngRzA/yw8yG+1gBhF/5LF
+NidGG1NnkUVk9t0APwgd5pubPagIrVqJVbr3UfFjU8lZQOLUigadk+JJ3NnhRQkQ
+NZtkvN9a53vZeORGWNDoxqnIm4RDLJjjf4pfI8tORRwNyqxWxNB4bAc+k9ysXEO+
+4qbQQmCFKzXjCaxWCsl6dXuRvQ4SKzoi63pN05o9/YG+wh/c8QCM7rZVDqIVDoqz
+hHrsWszUyHvr8Vg2uYOaIbxnWXhaNPb9R4h+DV2dITCeIrOj+Ey3MRl+vXNDqx4B
+nEq2SxFS6PXWTjqp7xE0ITKv5rppyrR231RLmY5lQxSbm0PEE4hJBBgRAgAJBQJG
+jS/kAhsMAAoJEDDm+AQ0pyp/2Z0AnRYlvIQAMoO33jBp6ZEd8GQ8iARZAJ4323AS
+sjiqTZMbrvYrk4fWvFzxXg==
+=z07+
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    30E6F80434A72A7F
+sub    C30F4CB428DDFC28
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEaNL+QRBACYhfwZdDNXVeU9G5/XsxrUgQGKkhfOaB1CyPHAd02Jyc5oHR0a
+nu7dHb6QBlY8b47pX8ii+uTCOX2yyFlJt2cuKYqN1TwHrMspDTC9K1x8WJMmKdM5
+KUtWchFQ/zmFgIcXM8Vm1851k0aOOP3Pkexv51u4kZ6tbAK2iqYAawB93wCgkv/X
+YpZR9qL0FWip23gsjjxf01ED/3cHs+5L6hm0vP4x8xbsei31/4yHPIRytLhkS3CP
+tPZGANloRi05FlPxNXMQdeI4tUk//V3Yew5LkJC7Ue0zkAKAxjyWYBBsbl20grmq
+89ZKcj0/pZBw9Gzm4indpORfPRT7BBc+F8+2TUD9jpha+W6paCLp9pFJR++OyiZ+
+hNwfBACIyapWUmoEmV4XG869hsnico6vF4WzuhHe/PfityhlHX2M/DDX0KrMqNeM
+muxYNsKoSw3EU8BS+g6bHYvxDFePPhpFIMwbtEEOul533V1sGbPYhBIiSBpnb7FX
+AnbVIYk06T5mKfaK8n9XB4BIrt/pz9gxDjb9KBuIHE0H8OkfzbkCDQRGjS/kEAgA
+madPbo/cLInRyG4EezfSMDw3wNw3Je3+Ozy12FgQE7aaUQ6a4YRLkWeldmTtOBlV
+XqRUV1MrGQ0+C1bWEAXPsrdzzInM8NiXz4d5kCVNa8WzfnA5Fe46hxUqUawSEt6P
+9QpT02mzYQZhazDMJqgGWFHoMHKQVtAqTlKH8W0D0YPRdV6Qn/VYZ2ZRW2mk0tU4
+/xBMLprmcQCrDYXYPC/apl3tXuzXqs/FA60lKZzzE+KqW53G7qSbSSN59IRCpk0N
+X5hFMZJ+/oBItH37Z5V/pVhRGytEfA9yv3IELpJ1CLtFZVS7lJTY7hsr74qRhbCC
+JAkjR1Ywz1/Ya29NUjF18wADBgf/SXXHiYR4XasV+LOngRzA/yw8yG+1gBhF/5LF
+NidGG1NnkUVk9t0APwgd5pubPagIrVqJVbr3UfFjU8lZQOLUigadk+JJ3NnhRQkQ
+NZtkvN9a53vZeORGWNDoxqnIm4RDLJjjf4pfI8tORRwNyqxWxNB4bAc+k9ysXEO+
+4qbQQmCFKzXjCaxWCsl6dXuRvQ4SKzoi63pN05o9/YG+wh/c8QCM7rZVDqIVDoqz
+hHrsWszUyHvr8Vg2uYOaIbxnWXhaNPb9R4h+DV2dITCeIrOj+Ey3MRl+vXNDqx4B
+nEq2SxFS6PXWTjqp7xE0ITKv5rppyrR231RLmY5lQxSbm0PEE4hJBBgRAgAJBQJG
+jS/kAhsMAAoJEDDm+AQ0pyp/2Z0AnRYlvIQAMoO33jBp6ZEd8GQ8iARZAJ4323AS
+sjiqTZMbrvYrk4fWvFzxXg==
+=z07+
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    34918B7D3969D2F5
+uid    Brad Corso <[email protected]>
+
+sub    5CE9BCD2ED28F793
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+QuOcn0ypycYY9I1Xl3Z/9D1jxT0Q
+=pU+S
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A1B4460D8BA7B9AF
+uid    Mockito (http://mockito.org) <[email protected]>
+
+sub    BA6D22590B3F9BEA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE4waOEBCADHDHNTq1NRR5TSooIrKY0BTQnaLfjKZfcJOwp+btBJrOUO7+e/
+V3M4DZQclj/e8SBiVmRPK8Oyrv6i5B5+Ee/qNlLjWiO10AJ/PLRjYdoW1V6PlTm7
+2aUxQ/wNXxDcOoH8M7Y4fEqZJ3rFuta8ogeIYnkUwUk3gc5YKk7KJDbiOXQfRxlY
+9MeVKyoYfj+2Szaaz98W097Pqf9+7i3WjB3TKR1pnWlzF6rLWIGBJqcJuTGLWUAB
+hwOMoNiIBAqyGu8E4rT8pP9OueprOeIjyKgOBWV5yctIxd7uu51sGR47TM2wmMmm
+r/Kz8FkMr1efof7Bx4mJuup6wQXonRMVBqpLABEBAAG0M01vY2tpdG8gKGh0dHA6
+Ly9tb2NraXRvLm9yZykgPG1vY2tpdG8ucGxAZ21haWwuY29tPokBOAQTAQIAIgUC
+TjBo4QIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQobRGDYunua/0Ewf/
+QRv2EXl6rlgV9LgXifdgD4ctYsMvhmJV0uaAaTvTcNpbYL0lG8FpCs0KHvBLWkoq
+esOdJYT4q/9msnBAMXS/9ckteDism8BwZR0qi9qzASzzMJEH7cdpr1te17JR0fl7
+8cgbGyw6UGfRSay9c3HyV0rCuQSFPMwQkG5YVpRiN6NSnYqDczS+aSjd6JCKu/4I
+LVgu4jH8oaUcGJEaWLmExSUzrUv9HFZXQJxLzrFT4k6AVVzBQCuEYW9XtgosKwfo
+0GweBXkC7iuO+bfNi84vyRLTkK50h4+rVNkyvNlgqknbeGrpvOvGErYJy24API/5
+TNP+ZLCTl7Y+qQejTFVJ4bkBDQROMGjhAQgAxDjlr6Oakgs+5d5NcIYpJ/8S5BIU
+aVlmjKoaFJoAy46WzvvpaTC022js1ZSvrM8wlSxSk+kD6/FAJw2pJwRgVrolOYJQ
+mqLqgTA2QSN+leWo0x8gC1+QXzrquCOd7m/+h8FHUDaxc29XQ+7+HtNvsSxY9dtD
+zgQGXjPXSppVCSiDNy1IuIAxmEAFSxok12Glxq/n2DFx6OnVB+5vvt0C8nQ6w0hQ
+AQKPUmO7fNav5lZMfKgR95NrvF1Hu5V6DZvpbXg6+NWfA8LsCampARrou5qzy67h
+b/+KKGHTDMOvZZlGw6oSnPngqmh06QqY7P4PKVkOo3Vb6+02ltyZ95RgmQARAQAB
+iQEfBBgBAgAJBQJOMGjhAhsMAAoJEKG0Rg2Lp7mv2b0IAI5pDzLtBGxYhmO1rSDg
+Y+JY7ZAr4srW/7K6Zc0RmWv48JsZOf7T78kIrif6jrF+ZwBLrdP93umMr9aJ/mJg
+lr+0oag0ZVhEW6Jb7dgiRn8F9+qcCs6lyozAG805oW2lULkwqSJ1xNs79v9RtOWl
+I5ruLVbS7XhGv0qH+ly1xpIuYOzNvpOgj1pC3Pv+NuL2hrLUZVg1vM9eCM3TDVbD
+yJZrxKdMemMSGHHsXWHtn8t4BT88kice4weDq8GBl1Dx+ApO1+iHj779nMX1Drfa
+xtJLTRqH9fhHesISmte8fPiydGT/HCA9quKUuxyN4W6Uwu+Uov12cGV2sAI+H5qP
+hF4=
+=FXjQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A1B4460D8BA7B9AF
+uid    Mockito (http://mockito.org) <[email protected]>
+
+sub    BA6D22590B3F9BEA
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE4waOEBCADHDHNTq1NRR5TSooIrKY0BTQnaLfjKZfcJOwp+btBJrOUO7+e/
+V3M4DZQclj/e8SBiVmRPK8Oyrv6i5B5+Ee/qNlLjWiO10AJ/PLRjYdoW1V6PlTm7
+2aUxQ/wNXxDcOoH8M7Y4fEqZJ3rFuta8ogeIYnkUwUk3gc5YKk7KJDbiOXQfRxlY
+9MeVKyoYfj+2Szaaz98W097Pqf9+7i3WjB3TKR1pnWlzF6rLWIGBJqcJuTGLWUAB
+hwOMoNiIBAqyGu8E4rT8pP9OueprOeIjyKgOBWV5yctIxd7uu51sGR47TM2wmMmm
+r/Kz8FkMr1efof7Bx4mJuup6wQXonRMVBqpLABEBAAG0M01vY2tpdG8gKGh0dHA6
+Ly9tb2NraXRvLm9yZykgPG1vY2tpdG8ucGxAZ21haWwuY29tPokBOAQTAQIAIgUC
+TjBo4QIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQobRGDYunua/0Ewf/
+QRv2EXl6rlgV9LgXifdgD4ctYsMvhmJV0uaAaTvTcNpbYL0lG8FpCs0KHvBLWkoq
+esOdJYT4q/9msnBAMXS/9ckteDism8BwZR0qi9qzASzzMJEH7cdpr1te17JR0fl7
+8cgbGyw6UGfRSay9c3HyV0rCuQSFPMwQkG5YVpRiN6NSnYqDczS+aSjd6JCKu/4I
+LVgu4jH8oaUcGJEaWLmExSUzrUv9HFZXQJxLzrFT4k6AVVzBQCuEYW9XtgosKwfo
+0GweBXkC7iuO+bfNi84vyRLTkK50h4+rVNkyvNlgqknbeGrpvOvGErYJy24API/5
+TNP+ZLCTl7Y+qQejTFVJ4bkBDQROMGjhAQgAxDjlr6Oakgs+5d5NcIYpJ/8S5BIU
+aVlmjKoaFJoAy46WzvvpaTC022js1ZSvrM8wlSxSk+kD6/FAJw2pJwRgVrolOYJQ
+mqLqgTA2QSN+leWo0x8gC1+QXzrquCOd7m/+h8FHUDaxc29XQ+7+HtNvsSxY9dtD
+zgQGXjPXSppVCSiDNy1IuIAxmEAFSxok12Glxq/n2DFx6OnVB+5vvt0C8nQ6w0hQ
+AQKPUmO7fNav5lZMfKgR95NrvF1Hu5V6DZvpbXg6+NWfA8LsCampARrou5qzy67h
+b/+KKGHTDMOvZZlGw6oSnPngqmh06QqY7P4PKVkOo3Vb6+02ltyZ95RgmQARAQAB
+iQEfBBgBAgAJBQJOMGjhAhsMAAoJEKG0Rg2Lp7mv2b0IAI5pDzLtBGxYhmO1rSDg
+Y+JY7ZAr4srW/7K6Zc0RmWv48JsZOf7T78kIrif6jrF+ZwBLrdP93umMr9aJ/mJg
+lr+0oag0ZVhEW6Jb7dgiRn8F9+qcCs6lyozAG805oW2lULkwqSJ1xNs79v9RtOWl
+I5ruLVbS7XhGv0qH+ly1xpIuYOzNvpOgj1pC3Pv+NuL2hrLUZVg1vM9eCM3TDVbD
+yJZrxKdMemMSGHHsXWHtn8t4BT88kice4weDq8GBl1Dx+ApO1+iHj779nMX1Drfa
+xtJLTRqH9fhHesISmte8fPiydGT/HCA9quKUuxyN4W6Uwu+Uov12cGV2sAI+H5qP
+hF4=
+=FXjQ
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    056ACA74D46000BF
+uid    Norman Maurer <[email protected]>
+
+sub    DECB4AA7ECD68C0E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEoo3BYRBACXE2oGRA58Ml6s+kvfk6n/AJ+5OFeRT/Xelco/cpdxOVF5LkRk
+yd+vR2+F9ldBlH7CSTCmrdZIN3M3zrcWndrk/OQkCxNWVnE/a1li7L3G9nYr011k
+MwMM8MLkdf1Wr+FBunf1qpxPYuydfjWGFL749hYr4uQ8RbFDRQcmWLYCRwCgl+ur
+E28AmiICPcje59DNKHZZxd8D/Rk1LcZojARyMPjEsPOVSOh6kOaJQ/FOKN0j97k7
+ZqA+4C+OnIONSy22uMia9xO5g8oMLyHaRiA4S7JSIypYfX7JMCmwQCSLM/oQ5zct
+tsY7tGzCRBA7UVmW8uCDDZGmmzYIGQ7h1vcabgOFQ8wsteMHW3F0tU1K6oQut71x
+5KowA/9LeDjhl3tKizJn5hKf+NR8kTMcFFVMk8tf9/ZdqCG2gVTuB0EFimH47j1+
+YFWftvKg2IwF0qRnYuhpXn3kAtkzSwDr2T4r5CpDjttq+oBwhJ+N6lcPRoU26ijr
+nQ61Ek0jFFE5vfU7UODSLYXYbjf8McM6BtksY1SWfFBU5cVzgrQhTm9ybWFuIE1h
+dXJlciA8bm9ybWFuQGFwYWNoZS5vcmc+iGAEExECACAFAkoo3BYCGwMGCwkIBwMC
+BBUCCAMEFgIDAQIeAQIXgAAKCRAFasp01GAAvwh2AJ9HdFLGMuAGkk/wSv6dr6gM
+Xw32iACaA/Ez8jdn6/8kp/RpqMtUnl9c/Pq5AQ0ESijcFhAEAJIGBbVgN1O73XVP
+oGlZdqPd9n5QOjIy9cF6h5GBXEUDy3T+iVh1ak6Oqn1g3Wd0v2XgQ40gKWe/8O3M
+FhWkJbLENKhGyc9dLIpXDt9WIKfV3PNbblI/FmEYFqeJDNZUfaf/F3L3Lw0Z2YE1
+f0Kr3J64xuxJACUjAzXkssEqVUQ7AAMGA/9Tfa8rJD06apF3u22qd7DNao6UlUeo
+RIdluCpHfZQ10nEDTnFz5wNzHBlZDDoaketUZ5IY72hRKMcLMWRI5MaktQb9XvFp
+zhiGplsFGnzCBI99AqTsxy3m45AdVxbcVy2Lfeh9gzS+ZnL6m49Xf7mQuqQJatIX
+mWyplftyWc3XDYhJBBgRAgAJBQJKKNwWAhsMAAoJEAVqynTUYAC/qnQAoI/8QMuu
+PGrvivKDTCk2tA60w51gAJ9brzNybLCs1HYoPtjY97nOEy0tmw==
+=2BgH
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BEABCFBEE059E4E5
+sub    6579F3D193AD0019
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFOv78cBCACj4w72ksYDdLAY3GzwpRa1fo6S4aF7r96PitlETY83ct7AVF7j
+XaBGk5ylNAZXan3vlsSAKtxlI7skZOE5iKjqDo7SUfohs1WXdmL765mUNsSmkbG+
+WMOwDneg7Z6+licSC780OUFbifiPOKpgzGuaj91vrNigOmtyA+cbIHckhy+t3/PQ
+w4fO0S3RyJvQM/aQeDsyvhhBf2QzrUN7RQSfS69n0gtlVcu8usM7FZwOlBDGVPqi
+2Pauuj9QEyQIqnn07uWAUTzKrWF/WtcAXmLMxs59VuVRC3xnPVxekQTcJeCKas2L
+Aaic1HKp3AfTOT7+Ao2RRg4GpIiFhaJpul0dABEBAAG5AQ0EU6/vxwEIALyM80xq
+kaopZN0A1tNL6KUnoLZx/Tme1qp10JQ+AtYP5eFqPpM2yQIkFgWoQFFRZ3saPsqE
+jYlAAeyrRLOJ65PGRycHckckdhyEmGFCbHl4bJl3qnfJZuAqOSUlmxMwvhFTi7Hc
+BCOcWOqCBm99Y91IIy6NGeB+D5Oe7RGox4a9iDDh/NfyYCTTRo1vR6GW4JK5y/oJ
+GfWGx0U3CkzrwPw5efhCgSXmo0U+tQyUSWKl+J9DtdR+kP5mNoWOOxYMN3w4D68A
+IDXdD9ECEAXZKcKAlEXQ3AkVQ+Gfi24S4z5ewsHm8he6HFOsYb+FYtEByeydskWl
+U829LN49xrG2sm0AEQEAAYkBHwQYAQIACQUCU6/vxwIbDAAKCRC+q8++4Fnk5S9M
+B/wLDuqtJf1ANTTf7pyQBmjyeD9QE/Tzv606tnLxZwkZKqtEa/+3EJuPJLYOVHkn
+XpWl4VlMdJv6DEg4DrOQuJDEvv0R7YrIRqKZcZNRn+9donI6PI9jqrbY+8ZWsoA1
+kom+hU2VEoutPgxkZsZPHMj3LfWTGouTa3/HEOP5cxi5leiqJmYLKKBXJs4iMNBO
+BsqNQQjD/0rLeyh1JlVF/bpsapQJJ2kijowt5Yqg0rPOC2qq7EQUV54EVhiq4+40
+iyn5JNPmXaRHH8lFCavNWLNUh9HxNZHUOb7/UmFG9T77reY4ATTl0hZUYKdCYHeX
+eOq2bxXEhHlRB6yktjak7zk8
+=y0Hp
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    429C8816DEA04CDB
+uid    Taro L. Saito <[email protected]>
+
+sub    8A57131A07E0911E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=ihmL
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    429C8816DEA04CDB
+uid    Taro L. Saito <[email protected]>
+
+sub    8A57131A07E0911E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=ihmL
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B0F3710FA64900E7
+uid    ?amonn McManus <[email protected]>
+
+sub    7892707E9657EBD4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFdbSfIBCACrFI0ai/abnV2U2Wa9QQZwGk3Fegc8laiuTKc0GoYdyptd83/H
+hD5S61ppdkOugBjVTHdgda3xJ7zBZdnwjZvV/TyayQltbh6hU+BMlEolzXLgyvY7
+cAzKE+iKWbLLwfhRn1iuC7s5l1NLPsh44IUt3xDaFXNQrPO5OnRz8bqsGFVawxmu
+2bPqIjkhxEiYpxwaZZbDkgBR6rbBth6A7QOadQcj/9wNdekoM9dyg+olOUmnLrtA
+nMBhrvvbm2fZxTps3SZHlLV7+iSu71B5SqU/kT54/49n8vxrQiGvzp9K+t7c7EP2
+w4Ax1nYpRkCxYdHOX3YBdayUiP9ZaYH/YHtLABEBAAG0I8NhbW9ubiBNY01hbnVz
+IDxlYW1vbm5AbWNtYW51cy5uZXQ+iQE3BBMBCgAhBQJXW0nyAhsDBQsJCAcDBRUK
+CQgLBRYCAwEAAh4BAheAAAoJELDzcQ+mSQDnRqcH/Am3OQSYYBFrtOT3Zrf2NEma
+ojd48oWZ5xODFmqSs5ksd3op9qakbqkxITzq7BP6CkFbi2NEWYVbPp+jiSiGr02L
+yNA9ipiMBDyVZ7CXTBYqCQZ/3yQKOFN38U8R1SnoH1gDq/YdxDkSkWZEWQlXj4T9
+QR/fXWObN/oIdVDNONL99nqU0+xSvsE+toVHTH7upY7RcdDdnBEarKrifYjbCvpU
+0yiOgB1WOj91z/BrfpBFyJ6/qW2/qJun1Ja1bdpKPm0ZbTCupYOALJhf8dcznNDn
+gVCEB6L1+s693SuU2ZzFkdykpU/8WxlhjJcSqTpp8BIlwlFyOmZC7jrxArr2Jk65
+AQ0EV1tJ8gEIAJVavNan4WxxlwLwvnBj3/wcEWqN+kfMHENMSjmRWOYSmC332hhG
+LmTDi++BPWt2OOvHUusJV8dZP5D9yUBRFsKozIpyXyS76C5VYGMY8WZ6kyqn/mLC
+iwmnkOJ24kXLaaHPsQjv6i5f2KliDVhAGUHmNMJgH8o/GL7zZ03Mb8ZlKFZobp0d
+n+/lxoOtQSzR+cBz8NvMBkOKD8r4PJA6BxCR1HVEHsq4xSnjr/UZOYvh+Kaxfnop
+7Rn9in5MoY2rCY+PV59Xbx4grqNpjupyHEf1MHodJRj85JiClnLZk7dNJ/kr+zgg
+wbsd12/GHkBt/pxuWhe0eFcAOJmvqC3c4pUAEQEAAYkBHwQYAQoACQUCV1tJ8gIb
+DAAKCRCw83EPpkkA54FACACFZB2Tk96FQkr8+WHOz93CJs4UD88PosLaKmiXKP68
+arjH3y5jhNLBzqteZo0Crfw75DYWIZChdf5uLGKCWXBEytF4uoHOy9Lv/3emoSee
+nluFVcNjL7CIOQDRmqw1t/LjnsLbgvlwHix5f7I6Txu/J0HKJbq0XpoTqCzFK6sx
+EPHH3gZto+XfHk85haKd73SOM4edkmJx+jDXES1wb3K3SpYibt+uPVfLYXWxK7xA
+aztESTIqZ9RnYHzd/7z6DO4z//lfB7IVAqvM8ga7Qj58ObeqZxx2iVit5WUZ4cE3
+0crNGyXH/HKlAp+B9EvENnwr++TI1CGYthPLFHFc831L
+=MZeq
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEdUhrIRBADCU9cuKc92CWQlZxwtRuSIV/36Qmj264YD+Lix+r1Qe1PqRr1I
+/MObOo83ulorWigSkx1k81Mnr56NwmIeo2bMhjmgRgf7EG6XEbKdRKfJcJRR1lDV
+Ml4ru40W958M3PX5fsi0m0g2TuVrAKIS4vscUt4L/Cf4IT2/0OhaT6bWswCgsNws
+Qq6NtCkLkpWSBNYGT4zb6yUEALlhHMnfzPSDerKjDOaYHTz3PRc/GGUDSBTSVj6W
+hQIDrgTqrPxoB5JMnfUz8BLSayk0d6HiwspJ4Wnxe2/jdIT+6xhX9xBYXVHZVs4R
+cr8zbBNcW2kwFg5Mqy7TiAPzakzCslKAAX+cjAKSOWyRbmkEYnNgMlctdyENOR9+
+BpP+A/9anoVEfULqoETShmgWdi94gx713qymhNBpFZnPpm4j4JuxKopl/unQmw5i
+Jwtu93cg38UfaOMJjTi6tJ6F6SE8xXv43nKs3Xb+Ll1MpTgaGUXEhCOeTZl223Qe
+NBUp8kvfcys6aVX6GT93dmWxtMewlc6gc7HVQnUnyCFsVeoy/7kCDQRHVIayEAgA
+/OzW6erYExaWTjI7wPnD1uv1Leq2WRhG1I5YfuKU7K91TMilBm8L+qCmF1QEg7yF
+6mYtdwXjOiA0YoGOVEeNJELhJFKZOoeZob+R3DC05uUsBl7xi3NgB8Msags5N4q+
+nqZSMZaEDl5JR4ZAhYCZBy5xBmnvmRPUL50CDN2IBKxHVOaUllBIZDtdtVH37Gwa
+VzXuhPxsLiAOeJ29W1t8RrIP9TjQlPhzwu7P9Fq3/JcCmhF8xOmcn3wfCZ/VMteF
+Vp8aTr4aO4uo0O/HYisbStUw2YDGe/RmXiNOD8CXHFOg0/c4tettRhtnl8OO3hQ4
+srY5eymBG4tnV02l3/Y2CwADBggA2i5UGKqWDJ46LviS1rNzBLLHPv7GASFicQY4
+HxMTvREdBIdb+p287azp0l0ixaLQOq6HgSMZbexRG/DdDSakxlOr+kil5NJnHmZ9
+tXzGmnLP1WoxQEc2FVdG/jKTg6gz2x9Cz1pRMxxAHN6Os+c7hxYKbD649fBbGPgZ
+PP0OCjwrHVfu3WaMaek41QxnFfk5s+YNENly+XfeX2PuYLwKwuVkYJftqohU9bRx
+0phdDgQWbIZMVzihxr5yTxfkCvmHlrLHn+lAOz3N3xh0Qh/DofWEDAee8uk+pbzC
+XSON2v4iO9lsHg+wXYLREBHxdE0EreZu2VzBFa9iN2nhtJnuTIhJBBgRAgAJBQJH
+VIayAhsMAAoJEMksX+xwFhxicoMAn01LUw+mkBfQJFsMLdCpx+OORYPOAJ9YRvfA
+o/Xn3TqMTLepQBB19Xhy6g==
+=luzT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+uid    Herve Boutemy <[email protected]>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEdUhrIRBADCU9cuKc92CWQlZxwtRuSIV/36Qmj264YD+Lix+r1Qe1PqRr1I
+/MObOo83ulorWigSkx1k81Mnr56NwmIeo2bMhjmgRgf7EG6XEbKdRKfJcJRR1lDV
+Ml4ru40W958M3PX5fsi0m0g2TuVrAKIS4vscUt4L/Cf4IT2/0OhaT6bWswCgsNws
+Qq6NtCkLkpWSBNYGT4zb6yUEALlhHMnfzPSDerKjDOaYHTz3PRc/GGUDSBTSVj6W
+hQIDrgTqrPxoB5JMnfUz8BLSayk0d6HiwspJ4Wnxe2/jdIT+6xhX9xBYXVHZVs4R
+cr8zbBNcW2kwFg5Mqy7TiAPzakzCslKAAX+cjAKSOWyRbmkEYnNgMlctdyENOR9+
+BpP+A/9anoVEfULqoETShmgWdi94gx713qymhNBpFZnPpm4j4JuxKopl/unQmw5i
+Jwtu93cg38UfaOMJjTi6tJ6F6SE8xXv43nKs3Xb+Ll1MpTgaGUXEhCOeTZl223Qe
+NBUp8kvfcys6aVX6GT93dmWxtMewlc6gc7HVQnUnyCFsVeoy/7QjSGVydmUgQm91
+dGVteSA8aGJvdXRlbXlAYXBhY2hlLm9yZz6IYAQTEQIAIAUCR1SGsgIbAwYLCQgH
+AwIEFQIIAwQWAgMBAh4BAheAAAoJEMksX+xwFhxid2sAoKppOorIM7ygdeFyhvcN
+VV0l9cRnAKCGxTdvoOnDAgZN+5lBP0q/o3PGPYkBMwQQAQoAHRYhBPp33P7y7m6y
+3r7dLAEleUZNAcBqBQJdyJjjAAoJEAEleUZNAcBqkiEIAJSzD+MACN+Dy/6l0htV
+6nP9sUTthw1Uwzxmj5vFCrBIjpq/l7ZSVfmNyyW+X/U3ZYIg8AmM1aoZ/x94pDO/
+XAvSlrw7XwAyiN+3lMg0PAIKCzjZPYszSvkdy+1yTd7ka5vp1F5AAVl1N+erIttJ
+yT/aKW708XGR5kRMBBvanXQJxTTNBrPVPBPTqM7F1cdR2sGzKcJmRudbuMJt6MXe
+SDOOjZD398ix8HIfk8CyTL38OvGaALOd2vxsyMLg6fjKmtbYNRE95fHJsmQcphco
+rLZcKg6SJlsGb8UIotMAmFWK0uP+h9oe4TGzhl0qNdsKr8EArWv+hUfRdmnw1moo
+jRe5Ag0ER1SGshAIAPzs1unq2BMWlk4yO8D5w9br9S3qtlkYRtSOWH7ilOyvdUzI
+pQZvC/qgphdUBIO8hepmLXcF4zogNGKBjlRHjSRC4SRSmTqHmaG/kdwwtOblLAZe
+8YtzYAfDLGoLOTeKvp6mUjGWhA5eSUeGQIWAmQcucQZp75kT1C+dAgzdiASsR1Tm
+lJZQSGQ7XbVR9+xsGlc17oT8bC4gDnidvVtbfEayD/U40JT4c8Luz/Rat/yXApoR
+fMTpnJ98Hwmf1TLXhVafGk6+GjuLqNDvx2IrG0rVMNmAxnv0Zl4jTg/AlxxToNP3
+OLXrbUYbZ5fDjt4UOLK2OXspgRuLZ1dNpd/2NgsAAwYIANouVBiqlgyeOi74ktaz
+cwSyxz7+xgEhYnEGOB8TE70RHQSHW/qdvO2s6dJdIsWi0Dquh4EjGW3sURvw3Q0m
+pMZTq/pIpeTSZx5mfbV8xppyz9VqMUBHNhVXRv4yk4OoM9sfQs9aUTMcQBzejrPn
+O4cWCmw+uPXwWxj4GTz9Dgo8Kx1X7t1mjGnpONUMZxX5ObPmDRDZcvl33l9j7mC8
+CsLlZGCX7aqIVPW0cdKYXQ4EFmyGTFc4oca+ck8X5Ar5h5ayx5/pQDs9zd8YdEIf
+w6H1hAwHnvLpPqW8wl0jjdr+IjvZbB4PsF2C0RAR8XRNBK3mbtlcwRWvYjdp4bSZ
+7kyISQQYEQIACQUCR1SGsgIbDAAKCRDJLF/scBYcYnKDAJ9NS1MPppAX0CRbDC3Q
+qcfjjkWDzgCfWEb3wKP15906jEy3qUAQdfV4cuo=
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+uid    Herve Boutemy <[email protected]>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+uid    Herve Boutemy <[email protected]>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+uid    Herve Boutemy <[email protected]>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+uid    Herve Boutemy <[email protected]>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C92C5FEC70161C62
+uid    Herve Boutemy <[email protected]>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    476634A4694E716A
+uid    Simon Mittermueller (none) <[email protected]>
+
+sub    4CE6E05D128BCFAD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFE0soEBCADAy/iIRT/lpb+vfDjWs/k1XQNU3mzXoMm1mmS/Z8VOc0jF7sVB
+A5z2pC6u2OmEr1oJkhWefX+mU//7kXs6VvUCReE4uheGBlisg/ELEXkTm342TcwS
+K+tR/NMk5h1DwxeGR2qc0+zhFcrITiYqCpdaggRVx92syhuYWrG2DtRI3eEz+fys
+2WLhAd/AqBTR0ENDZssp5S6tEBcLvU/jAvKv33/+ydg+1Bsw37CqCOO0bR388+ow
+uSXSARDJaesnBpUcXT9pbog3Wm9pSzJ2fX1FyFaf3rqIIYEqGk1rEND+AkT2CB08
+BykABpDx0mgR6/pAgQVywCatPuc7wneiZY+LABEBAAG0OlNpbW9uIE1pdHRlcm11
+ZWxsZXIgKG5vbmUpIDxzaW1vbi5taXR0ZXJtdWVsbGVyQGdtYWlsLmNvbT6JATgE
+EwECACIFAlE0soECGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEEdmNKRp
+TnFqfr8H/1DXbZ4VzAqqIBhMUWOIvF220gZ6NAxgIP4IAzfuLYKso1pfogbuPzS4
+IzbTZIZv0TXsK7zEzxZY4Oxx5cQaOfRiPOBvkeEC1T8Pf8l9GDQ8ppy0aHPNLgV+
+nloylBUHWuKpTMUHKu3MpwHfwMFZ9ZFsUmgcQ9oYkWcvprH2uOachsuA4BSxXJNe
+OGU3aBIG1CR7lGENmkjwZowXhxM7QuYZ7qIR6oFxQCOj9jcV61AQhj5LuKNOJLfx
+fAICIeUD8mJP3NcblVNp/Nj656naiLWBsK1sfjGzvLkeTKnFYFMpJqEuLTv7VTx1
+fGJnaq2+2UznsLGgWcMVPg68ZOW5V6i5AQ0EUTSygQEIANTGYOD4HupAmugS69tx
+MTAW4GvRQ0s8Li/r/QQQUWPpjo3IkJDA0+kPCe2JRamNJJ2plzndeGUpQIZn+HJS
+N8fGRjZG56HG6l0BJmQRFHD/6CzNOOKK6z+8e306DAwQPqDdDpUgpBmbPHZDhCs7
+tvrOhrUesfLQla15MM7n1DEtII9y+AsMGfwrZCd2PeigiRC+/NH/lYObLUPc+NL6
+GrC1ZHrpGoOR+9GQ6voVNY5EIxVlNgoVBxn3ufcFvvghmZe0WyudBHK9ByWeioBI
+tHQW5n7eGpljcCUbTpsJmErhjH6KBKSuxPQsyV4TkQMqcsymGW0jhdHXc1/tStF3
+L0kAEQEAAYkBHwQYAQIACQUCUTSygQIbDAAKCRBHZjSkaU5xamOiB/9r943gZZy9
+FJv/NGPnNxCvI3ZusQfntgRfVyIFZLIUeaYDab6RqKTD8ZRgyfO2rmO73DiQ2bnt
+zmSPHeAlpKAIhTXfty0g5UICLjr27KocLNt234BKii6go+CDo2+lLUPUAe3cJPFq
+ZrtJ3pYLFwS7O43wwhRaO9A7L1uyruoCqql65B6CJcymMEsDnCizRVEAsE2lxenu
+fxcM8JIaQlczXTsHYf23vnmLjlXm5HvEAfXE0s7iHo9BMlSLxHWWEqeyrbwMdnn/
+gT8lHGw+SHO173THvhtGuKGkrglD2CA9G5d1ZWgAz3il0fLdBenLH6t1m0x3+P6h
+4sUJ04LlldPb
+=GdCO
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    476634A4694E716A
+uid    Simon Mittermueller (none) <[email protected]>
+
+sub    4CE6E05D128BCFAD
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFE0soEBCADAy/iIRT/lpb+vfDjWs/k1XQNU3mzXoMm1mmS/Z8VOc0jF7sVB
+A5z2pC6u2OmEr1oJkhWefX+mU//7kXs6VvUCReE4uheGBlisg/ELEXkTm342TcwS
+K+tR/NMk5h1DwxeGR2qc0+zhFcrITiYqCpdaggRVx92syhuYWrG2DtRI3eEz+fys
+2WLhAd/AqBTR0ENDZssp5S6tEBcLvU/jAvKv33/+ydg+1Bsw37CqCOO0bR388+ow
+uSXSARDJaesnBpUcXT9pbog3Wm9pSzJ2fX1FyFaf3rqIIYEqGk1rEND+AkT2CB08
+BykABpDx0mgR6/pAgQVywCatPuc7wneiZY+LABEBAAG0OlNpbW9uIE1pdHRlcm11
+ZWxsZXIgKG5vbmUpIDxzaW1vbi5taXR0ZXJtdWVsbGVyQGdtYWlsLmNvbT6JATgE
+EwECACIFAlE0soECGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEEdmNKRp
+TnFqfr8H/1DXbZ4VzAqqIBhMUWOIvF220gZ6NAxgIP4IAzfuLYKso1pfogbuPzS4
+IzbTZIZv0TXsK7zEzxZY4Oxx5cQaOfRiPOBvkeEC1T8Pf8l9GDQ8ppy0aHPNLgV+
+nloylBUHWuKpTMUHKu3MpwHfwMFZ9ZFsUmgcQ9oYkWcvprH2uOachsuA4BSxXJNe
+OGU3aBIG1CR7lGENmkjwZowXhxM7QuYZ7qIR6oFxQCOj9jcV61AQhj5LuKNOJLfx
+fAICIeUD8mJP3NcblVNp/Nj656naiLWBsK1sfjGzvLkeTKnFYFMpJqEuLTv7VTx1
+fGJnaq2+2UznsLGgWcMVPg68ZOW5V6i5AQ0EUTSygQEIANTGYOD4HupAmugS69tx
+MTAW4GvRQ0s8Li/r/QQQUWPpjo3IkJDA0+kPCe2JRamNJJ2plzndeGUpQIZn+HJS
+N8fGRjZG56HG6l0BJmQRFHD/6CzNOOKK6z+8e306DAwQPqDdDpUgpBmbPHZDhCs7
+tvrOhrUesfLQla15MM7n1DEtII9y+AsMGfwrZCd2PeigiRC+/NH/lYObLUPc+NL6
+GrC1ZHrpGoOR+9GQ6voVNY5EIxVlNgoVBxn3ufcFvvghmZe0WyudBHK9ByWeioBI
+tHQW5n7eGpljcCUbTpsJmErhjH6KBKSuxPQsyV4TkQMqcsymGW0jhdHXc1/tStF3
+L0kAEQEAAYkBHwQYAQIACQUCUTSygQIbDAAKCRBHZjSkaU5xamOiB/9r943gZZy9
+FJv/NGPnNxCvI3ZusQfntgRfVyIFZLIUeaYDab6RqKTD8ZRgyfO2rmO73DiQ2bnt
+zmSPHeAlpKAIhTXfty0g5UICLjr27KocLNt234BKii6go+CDo2+lLUPUAe3cJPFq
+ZrtJ3pYLFwS7O43wwhRaO9A7L1uyruoCqql65B6CJcymMEsDnCizRVEAsE2lxenu
+fxcM8JIaQlczXTsHYf23vnmLjlXm5HvEAfXE0s7iHo9BMlSLxHWWEqeyrbwMdnn/
+gT8lHGw+SHO173THvhtGuKGkrglD2CA9G5d1ZWgAz3il0fLdBenLH6t1m0x3+P6h
+4sUJ04LlldPb
+=GdCO
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5E1F79A7C298661E
+uid    David P. Baker <[email protected]>
+
+sub    A7CC6488427379A4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFgRFtYBCADud9fmvTI8Dbs+9GcZUIVzxkL84QYHSDxI9fF+sxfAviq1U+YJ
+a+ZLIW7HsXx8vpn3hqIqAbDxHjrb6MEJ3OWD5Ks7O9Lq7HOhtqAT/mpV3fZmf6pF
+zdEw7c4UrfbtKyBY2kSBpKzTfu6HD3q4OBDm59Ezs2XFhKrXtlNC0fQ30ysBpIvm
+vZH/opwlBgyELKnAYJ6eCmdW1iiju7DPKDBOrGi6zgvslToLpnZeSg6hzSyjM15n
+Gx6Dgby0GNR4VEVze/UdOpsFVTSfP9qXgdt5ZOWQqW2Jg5V/ezvk+3Ok+ecfHWRz
+q8tHkagnqn0SfP6mLqUNvmvAH7xp8crH8L/TABEBAAG0H0RhdmlkIFAuIEJha2Vy
+IDxkcGJAZ29vZ2xlLmNvbT6JATgEEwECACIFAlgRFtYCGwMGCwkIBwMCBhUIAgkK
+CwQWAgMBAh4BAheAAAoJEF4feafCmGYepYQH/AoDwA/N5Zq0z686DtrAu3KeQCap
+YbI4oNQ/yhCuCivJy9ORkqOLRZDhrfkmwFmetOmDeg8GAfoMEDUSvgXLqqli4wMS
+UNNlRA18X6g8N/FS7w/rWP0wp68boPK/Ry9Q/f7SFmMxrObT7aSX4hnhzWZfWTZy
+YkhWN9Y3+nXFtaT/XViZtHoxLZP0Ei92N0zcWGkKs/drH84OS+XMVRktCNExyXUY
+wD/cyD9n6r6f/TGtaL8cpXqu46IhLpeaPMPWqikZCLX/2KGSwiO4H2juTkkhQn8E
+bCZziDmfDY6RAa5xrsOnFeLYGbqbkoK7BfR9d+tMFtkgkXxqpHFMjW3a4QG5AQ0E
+WBEW1gEIAMuetYIGcqEC7KdfWn6EKmO7ZucfOEirvo+WXclo48WX0Eo0gsTghKPG
+TS2kOzglwn/wYCbBVKzYaOngZljIcrR47hJiY/u7OH7EjiCiB0sh5WuEqOaCPPFo
+8lCA1+SBPAF+c1d7SfIEABL/WCc6e1rkKhe7wkBSclspL8YQUG3cr5G/cSCGOV69
+TsCqq7rtezjkSsfE5dxmcs39Ouur7hs25DKehufUA5bV2i51v49WIuTE8x53VfIn
+YsJyeRs7f4sx3hmkwN+EL2mo1YFymGwEkp8iB0Jtrpsevl4AFOajl6X4IrdLn6+X
+Sok/1mzIm+t1ZHokQ3mUWe5FC9c1Y1MAEQEAAYkBHwQYAQIACQUCWBEW1gIbDAAK
+CRBeH3mnwphmHv59CACEnAU1vbN4qxquAzNuaalyV6Hyx9olUQqPHopRGBA2ulPs
+0l+gtAXz5USotNsh3Ai5j39Y4J+qxN3HuDtscxEReogawzOo/B+1IKuGuuTzvL6f
+U6ZFUnEosxChAKwJo9eS5xlyenyumTcXx5yB/5X5nqTes6tcZlDcEefh7K5Iaazw
+E5caITBX0ze8g7WQzRxyN+vuhY30U7P8TTKxAsavdSBVIb+Hp0e2W2S5T3ogXaGk
+Ii5qllr9uhfX+E9zLxJJKfJot33ix647mPwpXxo7K6teo2rkwOTQij1sEe2sbMZi
+KZkn4rYSgLpZiVLPiDYuP3RTuHnFenYROA/YcDvA
+=qbvN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
new file mode 100644
index 0000000..bfc9916
--- /dev/null
+++ b/gradle/verification-metadata.xml
@@ -0,0 +1,1083 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<verification-metadata xmlns="https://schema.gradle.org/dependency-verification" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.1.xsd">
+   <configuration>
+      <verify-metadata>true</verify-metadata>
+      <verify-signatures>true</verify-signatures>
+      <key-servers enabled="false"/>
+      <trusted-artifacts>
+         <trust group="gradle" name="gradle"/>
+         <trust file=".*-javadoc[.]jar" regex="true"/>
+         <trust file=".*-sources[.]jar" regex="true"/>
+         <trust group="^androidx($|([.].*))" regex="true"/> <!-- not signed yet -->
+         <trust group="com.google.devsite"/> <!-- developed by our own team, not signed yet -->
+         <trust group="^com[.]android($|([.].*))" regex="true"/> <!-- b/215430394 -->
+         <trust group="com.google.testing.platform"/> <!-- b/215430394 -->
+         <trust group="com.google.android.gms"/> <!-- b/215442095 -->
+      </trusted-artifacts>
+      <trusted-keys>
+         <trusted-key id="012579464d01c06a" group="org.apache"/>
+         <trusted-key id="02216ed811210daa" group="io.github.detekt.sarif4k"/>
+         <trusted-key id="0315bfb7970a144f">
+            <trusting group="com.sun.istack"/>
+            <trusting group="com.sun.xml.bind.mvn"/>
+            <trusting group="com.sun.xml.fastinfoset"/>
+            <trusting group="javax.xml.bind"/>
+            <trusting group="org.glassfish.jaxb"/>
+            <trusting group="org.jvnet.staxex"/>
+         </trusted-key>
+         <trusted-key id="0374cf2e8dd1bdfd" group="org.sonatype.oss"/>
+         <trusted-key id="04543577d6a9cc626239c50c7ecbd740ff06aeb5">
+            <trusting group="com.sun.activation"/>
+            <trusting group="com.sun.istack"/>
+            <trusting group="com.sun.xml.fastinfoset"/>
+            <trusting group="org.glassfish.jaxb"/>
+            <trusting group="org.jvnet.staxex"/>
+            <trusting group="^com[.]sun($|([.].*))" regex="true"/>
+         </trusted-key>
+         <trusted-key id="0785b3eff60b1b1bea94e0bb7c25280eae63ebe5" group="org.apache.httpcomponents"/>
+         <trusted-key id="08f0aab4d0c1a4bdde340765b341ddb020fcb6ab" group="org.bouncycastle"/>
+         <trusted-key id="09a79e1e15a04694" group="org.vafer"/>
+         <trusted-key id="0cc641c3a62453ab390066c4a41f13c999945293" group="commons-logging"/>
+         <trusted-key id="0d5d634755737a19abbe2930d4da5eab3cd7e958" group="com.google.devtools.ksp"/>
+         <trusted-key id="0e91c2de43b72bb1" group="org.ec4j.core"/>
+         <trusted-key id="0eb9d7c468f97e44051d650ad73c68ee4152c255" group="com.google.dagger"/>
+         <trusted-key id="0f07d1201bddab67cfb84eb479752db6c966f0b8" group="com.google.android"/>
+         <trusted-key id="10066a9707090cf9" group="org.javassist"/>
+         <trusted-key id="10ae8966a146e8be" group="com.google.crypto.tink"/>
+         <trusted-key id="1188b69f6d6259ca" group="com.google.accompanist"/>
+         <trusted-key id="11b581967f079a30a3e93140d57506cd188fd842" group="com.google.api.grpc"/>
+         <trusted-key id="120d6f34e627ed3a772ebbfe55c7e5e701832382" group="org.snakeyaml"/>
+         <trusted-key id="1861c322c56014b2" group="commons-lang"/>
+         <trusted-key id="190d5a957ff22273e601f7a7c92c5fec70161c62" group="org.codehaus.mojo"/>
+         <trusted-key id="19beab2d799c020f17c69126b16698a4adf4d638">
+            <trusting group="org.checkerframework"/>
+            <trusting group="org.checkerframework" name="checker-qual"/>
+         </trusted-key>
+         <trusted-key id="1b2718089ce964b8" group="com.thoughtworks.qdox"/>
+         <trusted-key id="1d0a8b5e77c678a7c724445abf984b4145ea13f7" group="com.squareup"/>
+         <trusted-key id="1d9aa7f9e1e2824728b8cd1794b291aef984a085">
+            <trusting group="io.reactivex"/>
+            <trusting group="io.reactivex.rxjava2"/>
+            <trusting group="io.reactivex.rxjava3"/>
+         </trusted-key>
+         <trusted-key id="1f8cf885d537a431" group="com.nhaarman.mockitokotlin2"/>
+         <trusted-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" group="de.undercouch"/>
+         <trusted-key id="205c8673dc742c7c" group="org.apache"/>
+         <trusted-key id="21200d723f53ce38" group="com.squareup.leakcanary"/>
+         <trusted-key id="218fa0f6a941a037" group="com.github.kevinstern"/>
+         <trusted-key id="21a24b3f8b0f594a" group="org.apache"/>
+         <trusted-key id="22e44ac0622b91c3" group="com.beust"/>
+         <trusted-key id="2383163bc40844fd" group="org.reactivestreams"/>
+         <trusted-key id="26063b04869f7d235ccc057447586a1b75ef0de5" group="com.squareup.wire"/>
+         <trusted-key id="263923711ef4fe3f3f0c28af11509ed50ec155e6" group="org.reactivestreams"/>
+         <trusted-key id="2bcbdd0f23ea1cafcc11d4860374cf2e8dd1bdfd">
+            <trusting group="net.java"/>
+            <trusting group="org.codehaus"/>
+         </trusted-key>
+         <trusted-key id="2be5d98f751f4136" group="org.pcollections"/>
+         <trusted-key id="2db4f1ef0fa761ecc4ea935c86fdc7e2a11262cb">
+            <trusting group="commons-codec"/>
+            <trusting group="commons-io"/>
+            <trusting group="org.apache.commons"/>
+            <trusting group="xml-apis"/>
+         </trusted-key>
+         <trusted-key id="2e2010f8a7ff4a41" group="org.apache"/>
+         <trusted-key id="2e3a1affe42b5f53af19f780bcf4173966770193" group="org.jetbrains"/>
+         <trusted-key id="2f566d4221d3ec52" group="com.ryanharter.auto.value"/>
+         <trusted-key id="3051d45031e13516a6e8faff280d66a55f5316c5" group="org.bitbucket.b_c"/>
+         <trusted-key id="30e6f80434a72a7f">
+            <trusting group="org.apache.maven"/>
+            <trusting group="org.apache.maven.wagon"/>
+         </trusted-key>
+         <trusted-key id="31bae2e51d95e0f8ad9b7bcc40a3c4432bd7308c" group="com.googlecode.juniversalchardet"/>
+         <trusted-key id="3288b8be8512d6c0ca185268c51e6cbc7ff46f0b" group="com.google.auto"/>
+         <trusted-key id="353a436e043e3145" group="com.google.code.findbugs"/>
+         <trusted-key id="3872ed7d5904493d23d78fa2c4c8cb73b1435348" group="com.android.tools.build"/>
+         <trusted-key id="3c0a8f4744f37328" group="com.github.ben-manes.caffeine"/>
+         <trusted-key id="3c27d97b0c83a85c" group="com.google.errorprone"/>
+         <trusted-key id="3d11126ea77e4e07fbabb38614a84c976d265b25" group="com.google.protobuf"/>
+         <trusted-key id="3f36885c24df4b75" group="org.mozilla"/>
+         <trusted-key id="3faad2cd5ecbb314" group="org.apache.commons"/>
+         <trusted-key id="41321490758aad6f" group="org.codehaus.groovy"/>
+         <trusted-key id="41cd49b4ef5876f9e9f691dabac30622339994c4" group="com.google.testing.compile"/>
+         <trusted-key id="42575e0ccd6ba16a" group="org.xerial"/>
+         <trusted-key id="429c8816dea04cdb" group="org.xerial"/>
+         <trusted-key id="438e9634a2319637" group="co.nstant.in"/>
+         <trusted-key id="44ce7bf2825ea2cd" group="com.ibm.icu"/>
+         <trusted-key id="461a804f2609fd89" group="com.github.shyiko.klob"/>
+         <trusted-key id="47586a1b75ef0de5" group="com.squareup.wire"/>
+         <trusted-key id="475f3b8e59e6e63aa78067482c7b12f2a511e325" group="org.slf4j"/>
+         <trusted-key id="476634a4694e716a" group="com.googlecode.java-diff-utils"/>
+         <trusted-key id="47bf592261cd1a8a69b703b4e0cb7823cfd00fbf">
+            <trusting group="com.jakewharton.dex"/>
+            <trusting group="com.squareup.retrofit2"/>
+            <trusting group="^com[.]jakewharton($|([.].*))" regex="true"/>
+         </trusted-key>
+         <trusted-key id="47dcfc2a59f59b5b" group="io.outfoxx"/>
+         <trusted-key id="4896f7312a5ace4d">
+            <trusting group="com.google.gradle"/>
+            <trusting group="com.google.protobuf"/>
+         </trusted-key>
+         <trusted-key id="4bf79b8259007b566d2fce82296cd27f60eed12c" group="com.google.crypto.tink"/>
+         <trusted-key id="4db1a49729b053caf015cee9a6adfc93ef34893e" group="org.hamcrest"/>
+         <trusted-key id="4f7e32d440ef90a83011a8fc6425559c47cc79c4">
+            <trusting group="com.sun.activation"/>
+            <trusting group="javax.activation"/>
+            <trusting group="javax.annotation"/>
+            <trusting group="org.glassfish"/>
+         </trusted-key>
+         <trusted-key id="4f8fec6785f611d9a712ea2734918b7d3969d2f5" group="com.google.dagger"/>
+         <trusted-key id="517b94f8d0a46317a28d8ab30da8a5ec02d11ead" group="net.sf.jopt-simple"/>
+         <trusted-key id="51b52dc5dd452f92be342cc2858fc4c4f43856a3" group="xerces"/>
+         <trusted-key id="5208812e1e4a6db0" group="com.gradle"/>
+         <trusted-key id="55c7e5e701832382" group="org.snakeyaml"/>
+         <trusted-key id="571a5291e827e1c7" group="net.java"/>
+         <trusted-key id="586654072ead6677" group="org.sonatype.oss"/>
+         <trusted-key id="5897253bea3046aeea95a067e93671c7272b7b3f" group="org.jdom"/>
+         <trusted-key id="5ce325996a35213326ae2c68912d2c0eccda55c0" group="com.google.errorprone"/>
+         <trusted-key id="5d67bffcba1f9a39" group="com.google.gradle"/>
+         <trusted-key id="5e1f79a7c298661e" group="com.google.auto.value"/>
+         <trusted-key id="5ed22f661bbf0acc" group="com.almworks.sqlite4java"/>
+         <trusted-key id="5f7786df73e61f56" group="com.google.devtools.ksp"/>
+         <trusted-key id="5fa41c402006eac55d72aafd99ce9d9f22dc5c99" group="org.json"/>
+         <trusted-key id="6214760097dc5cfad0175ac2c9fbaa83a8753994">
+            <trusting group="com.fasterxml"/>
+            <trusting group="com.fasterxml.jackson"/>
+            <trusting group="com.fasterxml.jackson.core"/>
+            <trusting group="com.fasterxml.jackson.dataformat"/>
+            <trusting group="com.fasterxml.jackson.module"/>
+            <trusting group="com.fasterxml.woodstox"/>
+            <trusting group="org.codehaus.woodstox"/>
+         </trusted-key>
+         <trusted-key id="62ba9c275d14234e">
+            <trusting group="com.squareup.curtains"/>
+            <trusting group="com.squareup.leakcanary"/>
+         </trusted-key>
+         <trusted-key id="62c82e50836eb3ee" group="com.github.gundy"/>
+         <trusted-key id="6525fd70cc303655" group="org.codehaus.mojo"/>
+         <trusted-key id="666a4692ce11b7b3f4eb7b3410066a9707090cf9" group="org.javassist" name="javassist"/>
+         <trusted-key id="694621a7227d8d5289699830abe9f3126bb741c1">
+            <trusting group="com.google.guava"/>
+            <trusting group="com.google.jimfs"/>
+            <trusting group="^com[.]google($|([.].*))" regex="true"/>
+         </trusted-key>
+         <trusted-key id="6a65176a0fb1cd0b" group="org.codehaus.groovy"/>
+         <trusted-key id="6ccc36cc6c69fc17" group="com.google"/>
+         <trusted-key id="6dd3b8c64ef75253beb2c53ad908a43fb7ec07ac">
+            <trusting group="com.sun.activation"/>
+            <trusting group="jakarta.activation"/>
+         </trusted-key>
+         <trusted-key id="6eff5ef5523052d4" group="com.github.tschuchortdev"/>
+         <trusted-key id="6f538074ccebf35f28af9b066a0975f8b1127b83" group="org.jetbrains.kotlin"/>
+         <trusted-key id="6f7e5acbcd02db60dfd232e45e1f79a7c298661e" group="com.google.auto"/>
+         <trusted-key id="70cd19bfd9f6c330027d6f260315bfb7970a144f" group="com.sun.xml.bind"/>
+         <trusted-key id="72385ff0af338d52" group="org.threeten"/>
+         <trusted-key id="7615ad56144df2376f49d98b1669c4bb543e0445" group="com.google.errorprone"/>
+         <trusted-key id="7616eb882daf57a11477aaf559a252fb1199d873" group="com.google.code.findbugs"/>
+         <trusted-key id="78ab011fa6e5907950ea3e2747dcfc2a59f59b5b" group="io.outfoxx"/>
+         <trusted-key id="7999befba1039e8b" group="net.bytebuddy"/>
+         <trusted-key id="7a8860944fad5f62" group="org.apache.commons"/>
+         <trusted-key id="7c7d8456294423ba" group="org.objenesis"/>
+         <trusted-key id="7cb548acfe3d47e92afa566dc29b11246382a4d7" group="com.charleskorn.kaml"/>
+         <trusted-key id="7e22d50a7ebd9d2cd269b2d4056aca74d46000bf" group="io.netty"/>
+         <trusted-key id="7faa0f2206de228f0db01ad741321490758aad6f" group="org.codehaus.groovy"/>
+         <trusted-key id="8254180bfc943b816e0b5e2e5e2f2b3d474efe6b" group="it.unimi.dsi"/>
+         <trusted-key id="82b5574242c20d6f" group="org.antlr"/>
+         <trusted-key id="840b2bf6da8ed8c8" group="com.google.android.apps.common.testing.accessibility.framework"/>
+         <trusted-key id="85911f425ec61b51" group="org.junit"/>
+         <trusted-key id="8614d6ab265b4c63" group="org.apache.ant"/>
+         <trusted-key id="8756c4f765c9ac3cb6b85d62379ce192d401ab61">
+            <trusting group="com.github.ajalt"/>
+            <trusting group="com.github.javaparser"/>
+            <trusting group="info.picocli"/>
+            <trusting group="org.jetbrains.intellij.deps"/>
+            <trusting group="org.jetbrains.kotlinx"/>
+            <trusting group="^org[.]jetbrains($|([.].*))" regex="true"/>
+         </trusted-key>
+         <trusted-key id="8858d45be9b276802318155b96fb9db219f3338d" group="kr.motd.maven"/>
+         <trusted-key id="88bb19a33a18445f" group="net.ltgt.gradle.incap"/>
+         <trusted-key id="90ee19787a7bcf6fd37a1e9180c08b1c29100955">
+            <trusting group="com.jakewharton.android.repackaged"/>
+            <trusting group="com.squareup" name="javawriter"/>
+         </trusted-key>
+         <trusted-key id="95c15058a5eda4f1" group="com.google.protobuf"/>
+         <trusted-key id="96fb9db219f3338d" group="kr.motd.maven"/>
+         <trusted-key id="971b04f56669b805" group="com.google.jsilver"/>
+         <trusted-key id="98465301a4939c0279f2e847d89d05374952262b" group="org.jetbrains.dokka"/>
+         <trusted-key id="995efbf4a3d20beb">
+            <trusting group="com.pinterest"/>
+            <trusting group="com.pinterest.ktlint"/>
+         </trusted-key>
+         <trusted-key id="998af0e2b935996f5cebd56b9b1fda9f3c062231" group="org.apache.maven"/>
+         <trusted-key id="9a259c7ee636c5ed" group="com.google.errorprone"/>
+         <trusted-key id="9b1fda9f3c062231" group="org.apache"/>
+         <trusted-key id="9c4f7e9d98b1cc53" group="org.apache"/>
+         <trusted-key id="9c538d5a79281639" group="com.squareup.sqldelight"/>
+         <trusted-key id="9d0a56aaa0d60e0c0c7dccc0b4c70893b62babe8" group="org.apache.logging"/>
+         <trusted-key id="9daadc1c9fcc82d0" group="commons-cli"/>
+         <trusted-key id="9e84765a7aa3e3d3d5598a408e3f0de7ae354651">
+            <trusting group="com.google.code.gson"/>
+            <trusting group="com.squareup"/>
+            <trusting group="org.reactivestreams"/>
+         </trusted-key>
+         <trusted-key id="a0e7010544c02bd4c072b1803e3d777c909a447c" group="io.opencensus"/>
+         <trusted-key id="a1b4460d8ba7b9af" group="org.mockito"/>
+         <trusted-key id="a33a0b49a4c1ab590b0a4ddc1364c5e2df3e99c5" group="org.reactivestreams"/>
+         <trusted-key id="a40e24b5b408dbd5" group="org.robolectric"/>
+         <trusted-key id="a5bd02b93e7a40482eb1d66a5f69ad087600b22c" group="org.ow2.asm"/>
+         <trusted-key id="a6adfc93ef34893e" group="org.hamcrest"/>
+         <trusted-key id="a6d6c97108b8585f91b158748671a8df71296252">
+            <trusting group="com.squareup"/>
+            <trusting group="com.squareup.okio"/>
+            <trusting group="^com[.]squareup($|([.].*))" regex="true"/>
+         </trusted-key>
+         <trusted-key id="a730529ca355a63e" group="org.ccil.cowan.tagsoup"/>
+         <trusted-key id="a7764f502a938c99" group="com.google.protobuf"/>
+         <trusted-key id="aa70c7c433d501636392ec02153e7a3c2b4e5118" group="org.eclipse.ee4j"/>
+         <trusted-key id="ac5ec74981f9cda6">
+            <trusting group="com.beust"/>
+            <trusting group="org.testng"/>
+         </trusted-key>
+         <trusted-key id="afa2b1823fc021bfd08c211fd5f4c07a434ab3da" group="com.squareup"/>
+         <trusted-key id="afcc4c7594d09e2182c60e0f7a01b0f236e5430f" group="com.google.code.gson"/>
+         <trusted-key id="b02335aa54ccf21e52bbf9abd9c565aa72ba2fdd" group="io.grpc"/>
+         <trusted-key id="b4c70893b62babe8" group="org.apache.logging.log4j"/>
+         <trusted-key id="b57bd58ef6d0a713" group="com.google.protobuf"/>
+         <trusted-key id="b7c3b43d18eaa8b7" group="org.codehaus.mojo"/>
+         <trusted-key id="b801e2f8ef035068ec1139cc29579f18fa8fd93b" group="com.google.j2objc"/>
+         <trusted-key id="bac30622339994c4" group="com.google.truth"/>
+         <trusted-key id="bae5c184e3b70cb15617700598fe03a974ce0a0b" group="org.jetbrains.kotlin"/>
+         <trusted-key id="bb2914c1fa0811c3" group="net.bytebuddy"/>
+         <trusted-key id="bcc135fc7ed8214f823d73e97fe9900f412d622e" group="com.google.flatbuffers"/>
+         <trusted-key id="bdb5fa4fe719d787fb3d3197f6d4a1d411e9d1ae" group="com.google.guava"/>
+         <trusted-key id="be096e29edb8d141" group="net.sf.proguard"/>
+         <trusted-key id="beabcfbee059e4e5" group="com.github.siom79.japicmp"/>
+         <trusted-key id="bf984b4145ea13f7" group="com.squareup" name="javapoet"/>
+         <trusted-key id="bffc9b54721244ad" group="org.apache.commons"/>
+         <trusted-key id="c1b12a5d99c0729d" group="org.jetbrains"/>
+         <trusted-key id="c2148900bcd3c2af" group="org.jetbrains.trove4j"/>
+         <trusted-key id="c29b11246382a4d7" group="com.charleskorn.kaml"/>
+         <trusted-key id="c51e6cbc7ff46f0b" group="com.google.auto.service"/>
+         <trusted-key id="c7be5bcc9fec15518cfda882b0f3710fa64900e7" group="com.google.auto.value"/>
+         <trusted-key id="c7ca19b7b620d787" group="org.apache.maven"/>
+         <trusted-key id="c888b9955815ea83b48531784896f7312a5ace4d" group="^com[.]google($|([.].*))" regex="true"/>
+         <trusted-key id="c92c5fec70161c62" group="org.apache"/>
+         <trusted-key id="cb43338e060cf9fa" group="org.jacoco"/>
+         <trusted-key id="cd5464315f0b98c77e6e8ecd9daadc1c9fcc82d0" group="org.apache.commons"/>
+         <trusted-key id="ce8075a251547bee249bc151a2115ae15f6b8b72">
+            <trusting group="org.apache.ant"/>
+            <trusting group="org.apache.commons"/>
+         </trusted-key>
+         <trusted-key id="cf9f3090ce4cb752" group="org.abego.treelayout"/>
+         <trusted-key id="cfae163b64ac9189" group="org.jetbrains.skiko"/>
+         <trusted-key id="d196a5e3e70732eeb2e5007f1861c322c56014b2" group="commons-lang"/>
+         <trusted-key id="d4c89ea4aaf455fd88b22087efe8086f9e93774e" group="junit"/>
+         <trusted-key id="d4da5eab3cd7e958" group="com.google.devtools.ksp"/>
+         <trusted-key id="d54a395b5cf3f86eb45f6e426b1b008864323b92" group="org.antlr"/>
+         <trusted-key id="d5f4c07a434ab3da" group="com.squareup"/>
+         <trusted-key id="d73c68ee4152c255" group="com.google.dagger"/>
+         <trusted-key id="da7a1bb85b19e4fb05073431205c8673dc742c7c" group="org.apache.maven"/>
+         <trusted-key id="db0597e3144342256bc81e3ec727d053c4481cf5" group="org.tensorflow"/>
+         <trusted-key id="dddafa7674e54418" group="org.testng"/>
+         <trusted-key id="e0130a3ed5a2079e" group="org.webjars"/>
+         <trusted-key id="e0cb7823cfd00fbf" group="com.jakewharton.android.repackaged"/>
+         <trusted-key id="e77417ac194160a3fabd04969a259c7ee636c5ed" group="com.google.googlejavaformat"/>
+         <trusted-key id="e7dc75fc24fb3c8dfe8086ad3d5839a2262cbbfb" group="org.jetbrains.kotlinx"/>
+         <trusted-key id="eb380dc13c39f675" group="com.intellij"/>
+         <trusted-key id="eb9d04a9a679fe18" group="com.uber.nullaway"/>
+         <trusted-key id="ecdfea3cb4493b94" group="jline"/>
+         <trusted-key id="ee9e7dc9d92fc896" group="com.google.errorprone"/>
+         <trusted-key id="eef9ecc7d5d90518" group="com.google.dagger"/>
+         <trusted-key id="efe8086f9e93774e" group="junit"/>
+         <trusted-key id="f1f111af65925306" group="io.github.classgraph"/>
+         <trusted-key id="f254b35617dc255d9344bcfa873a8e86b4372146">
+            <trusting group="org.apache"/>
+            <trusting group="org.codehaus.mojo"/>
+            <trusting group="org.codehaus.plexus"/>
+         </trusted-key>
+         <trusted-key id="f3184bcd55f4d016e30d4c9bf42e87f9665015c9" group="org.jsoup"/>
+         <trusted-key id="f800dd0933ecf7f7" group="com.google.guava"/>
+         <trusted-key id="fa77dcfef2ee6eb2debedd2c012579464d01c06a" group="org.codehaus.plexus"/>
+         <trusted-key id="fa7929f83ad44c4590f6cc6815c71c0a4e0b8edd" group="net.java.dev.jna"/>
+         <trusted-key id="fc411cd3cb7dcb0abc9801058118b3bcdb1a5000" group="jakarta.xml.bind"/>
+         <trusted-key id="fd5dea07fcb690a8" group="org.codehaus.mojo"/>
+         <trusted-key id="ff6e2c001948c5f2f38b0cc385911f425ec61b51">
+            <trusting group="junit"/>
+            <trusting group="org.junit.jupiter"/>
+            <trusting group="org.junit.platform"/>
+            <trusting group="org.opentest4j"/>
+         </trusted-key>
+         <trusted-key id="fffd810fffde203d5fa27263beabcfbee059e4e5" group="com.github.siom79.japicmp"/>
+      </trusted-keys>
+   </configuration>
+   <components>
+      <!-- Unsigned -->
+      <component group="backport-util-concurrent" name="backport-util-concurrent" version="3.1">
+         <artifact name="backport-util-concurrent-3.1.jar">
+            <sha256 value="f5759b7fcdfc83a525a036deedcbd32e5b536b625ebc282426f16ca137eb5902" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="backport-util-concurrent-3.1.pom">
+            <sha256 value="770471090ca40a17b9e436ee2ec00819be42042da6f4085ece1d37916dc08ff9" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="classworlds" name="classworlds" version="1.1-alpha-2">
+         <artifact name="classworlds-1.1-alpha-2.jar">
+            <sha256 value="2bf4e59f3acd106fea6145a9a88fe8956509f8b9c0fdd11eb96fee757269e3f3" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="classworlds-1.1-alpha-2.pom">
+            <sha256 value="0cc647963b74ad1d7a37c9868e9e5a8f474e49297e1863582253a08a4c719cb1" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.github.gundy" name="semver4j" version="0.16.4">
+         <artifact name="semver4j-0.16.4-nodeps.jar">
+            <sha256 value="3f59eca516374ccd4fd3551625bf50f8a4b191f700508f7ce4866460a6128af0" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="semver4j-0.16.4.pom">
+            <pgp value="55e770230e69cc6de143fb5b62c82e50836eb3ee"/>
+            <sha256 value="32001db2443b339dd21f5b79ff29d1ade722d1ba080c214bde819f0f72d1604d" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.google" name="google" version="1">
+         <artifact name="google-1.pom">
+            <sha256 value="cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.apps.common.testing.accessibility.framework" name="accessibility-test-framework" version="2.0">
+         <artifact name="accessibility-test-framework-2.0.jar">
+            <sha256 value="cdf16ef8f5b8023d003ce3cc1b0d51bda737762e2dab2fedf43d1c4292353f7f" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="accessibility-test-framework-2.0.pom">
+            <sha256 value="d1e7dbe189b9dbfbfc31709590b65c766d654324de1ac886427333c5ff9adb0e" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.datatransport" name="transport-api" version="2.2.1">
+         <artifact name="transport-api-2.2.1.aar">
+            <sha256 value="e62f73ba1c7f5d15f5d86d8e9a298c42ccd0648e7ce60b9e312f2ecd123b5ed0" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="transport-api-2.2.1.pom">
+            <sha256 value="8118f805b855f18f1d12e5af59e914a7f6206f71bb1d1192a8ab9a8db4107afe" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.datatransport" name="transport-backend-cct" version="2.3.2">
+         <artifact name="transport-backend-cct-2.3.2.aar">
+            <sha256 value="b942d61ef6c0f8809808c3f98dab98d3c465c26178d119582584c01a78ec56fc" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="transport-backend-cct-2.3.2.pom">
+            <sha256 value="49a7601d17798078a39ecd3cc2cae8dcc3c87b4ab0c156ccbe34cc84f7b36e95" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.datatransport" name="transport-runtime" version="2.2.5">
+         <artifact name="transport-runtime-2.2.5.aar">
+            <sha256 value="a00159158918ae582c2c859df1f43af9ab322346a293ebab5f65f0e5e4bdc865" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="transport-runtime-2.2.5.pom">
+            <sha256 value="3a86c974e79d79a55eeaf9aa65ac30fa63768a4efaceb17446f9e68aed59a590" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.material" name="material" version="1.0.0">
+         <artifact name="material-1.0.0.aar">
+            <sha256 value="7680e381a3c03798d999b2e441caadd8a56a0a808e108024a67af9fe26c11adc" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="material-1.0.0.pom">
+            <sha256 value="0155c01de3c444a30626018178e0461e2f76960d85b305ce1eed48e612a4d3dd" origin="Generated by Gradle">
+               <also-trust value="c9fff541d51c11195de305c50bbfe4d1dfc97841983d95f6d7101112603515ab"/>
+            </sha256>
+         </artifact>
+      </component>
+      <component group="com.google.android.material" name="material" version="1.2.1">
+         <artifact name="material-1.2.1.aar">
+            <sha256 value="d3d0cc776f2341da8e572586c7d390a5b356ce39a0deb2768071dc40b364ac80" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="material-1.2.1.module">
+            <sha256 value="3f9f7658e316772f1c28cfa84270f7fb89560da02212aeb35e4e4fa20a3ef7ed" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.material" name="material" version="1.4.0-beta01">
+         <artifact name="material-1.4.0-beta01.aar">
+            <sha256 value="436332e688cf1182525b2d384857b98167b1dfc41347b8dc23905597df9b1711" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="material-1.4.0-beta01.module">
+            <sha256 value="d6a8c8f3e0e2544d53e3941a6e508c9a6397a75f3c4ed7a418360fad09d1557a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.play" name="core" version="1.10.2">
+         <artifact name="core-1.10.2.aar">
+            <sha256 value="6b0c277c450b200f937837d55716d769263db9ed53165739207bc123c3e70420" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="core-1.10.2.pom">
+            <sha256 value="f91604c35547195bb07a46cbc76fae47bd726335e976f78bb126c677d25c236f" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.android.play" name="core" version="1.9.1">
+         <artifact name="core-1.9.1.aar">
+            <sha256 value="c85fa108dffd89eb9e85c9d8657f966b064ad2d84dd2fce573192492a03e6f08" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="core-1.9.1.pom">
+            <sha256 value="c6898b1f71e69b15bf90c31fc3ef2de1cffbf454a770700f755b5a47ea48b540" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.google.code.findbugs" name="jsr305" version="1.3.9">
+         <artifact name="jsr305-1.3.9.jar">
+            <sha256 value="905721a0eea90a81534abb7ee6ef4ea2e5e645fa1def0a5cd88402df1b46c9ed" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="jsr305-1.3.9.pom">
+            <sha256 value="feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.google.code.findbugs" name="jsr305" version="2.0.1">
+         <artifact name="jsr305-2.0.1.jar">
+            <sha256 value="1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="jsr305-2.0.1.pom">
+            <sha256 value="02c12c3c2ae12dd475219ff691c82a4d9ea21f44bc594a181295bf6d43dcfbb0" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.devtools.ksp" name="symbol-processing" version="1.5.30-1.0.0">
+         <artifact name="symbol-processing-1.5.30-1.0.0.jar">
+            <sha256 value="abb95c72ad7a76eca777fcc94c83d1f907b5d70895f6571a1a9313d3ecb05588" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="symbol-processing-1.5.30-1.0.0.pom">
+            <sha256 value="91423e540336a6cefa4bbbf772da55bc477f4e0b72e547c66a81cf4f5acabbcb" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.devtools.ksp" name="symbol-processing" version="1.5.31-1.0.0">
+         <artifact name="symbol-processing-1.5.31-1.0.0.jar">
+            <sha256 value="0a9928423e04bcd642623d4c997232f6f60c7e4523f01d5963fae66bddd004fd" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="symbol-processing-1.5.31-1.0.0.pom">
+            <sha256 value="bd9c11c632b591f8159c6b8b958040bbdbb4895ae6799d38227b0769fbf6e09a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.devtools.ksp" name="symbol-processing-api" version="1.5.20-1.0.0-beta03">
+         <artifact name="symbol-processing-api-1.5.20-1.0.0-beta03.jar">
+            <sha256 value="4812505df0a6e08bf8c167d358b31abf96c8a3784e6d4074587919955f2df4bd" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="symbol-processing-api-1.5.20-1.0.0-beta03.module">
+            <sha256 value="2e2e1673a07dc04a39a3161cddd5cf860b125a507ca20c2f89db6252f59c6487" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.devtools.ksp" name="symbol-processing-api" version="1.5.30-1.0.0">
+         <artifact name="symbol-processing-api-1.5.30-1.0.0.jar">
+            <sha256 value="bf4a6875af46917174b087d03840456685e115954d926ce88fd04b9d2f254df3" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="symbol-processing-api-1.5.30-1.0.0.module">
+            <sha256 value="c82a98246729a2186e6c3b431a4d04bf957612707e11fadc392f23e4d85328ff" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.devtools.ksp" name="symbol-processing-api" version="1.5.31-1.0.0">
+         <artifact name="symbol-processing-api-1.5.31-1.0.0.jar">
+            <sha256 value="2dc570ace6f7452e7196c090a3f86df7b6c5fa9755bd0212a687ae060cf523f6" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="symbol-processing-api-1.5.31-1.0.0.module">
+            <sha256 value="9b200e651b4b6dd21553ea857e3b4ad2fbdf1a6b724127189c16ef5fa8e5fed2" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.devtools.ksp" name="symbol-processing-gradle-plugin" version="1.5.30-1.0.0">
+         <artifact name="symbol-processing-gradle-plugin-1.5.30-1.0.0.jar">
+            <sha256 value="e829abac4f87293784aed54614335386e980c2c0871c0c4d48caf4e2c36321f0" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="symbol-processing-gradle-plugin-1.5.30-1.0.0.module">
+            <sha256 value="d67e2f8b403d24a13b594c50e64ca248f38650f9e7dfb6d7c97813593141e92e" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.devtools.ksp" name="symbol-processing-gradle-plugin" version="1.5.31-1.0.0">
+         <artifact name="symbol-processing-gradle-plugin-1.5.31-1.0.0.jar">
+            <sha256 value="42e755966bc5abaf54b247f9648e682d7311d4568d9268e67dd9ba44afbb92e5" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="symbol-processing-gradle-plugin-1.5.31-1.0.0.module">
+            <sha256 value="30f37be681a129b1feb0a83d46ef4f3e48e015c4bf2c9927234f549d191059bd" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.firebase" name="firebase-appindexing" version="20.0.0">
+         <artifact name="firebase-appindexing-20.0.0.aar">
+            <sha256 value="c07aee785d8e0644f38895955f6d4e8808bb43f44c5660b05ff4b828700ac96c" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="firebase-appindexing-20.0.0.pom">
+            <sha256 value="7f0fc396d2ae7de63ee0b115af46f850c42c35774b7ecc03290f95019730b604" origin="Generated by Gradle">
+               <also-trust value="77950a382ccc121143ca6ceb811300df8e3082a289b1672e9371c695667198cd"/>
+            </sha256>
+         </artifact>
+      </component>
+      <component group="com.google.firebase" name="firebase-components" version="16.0.0">
+         <artifact name="firebase-components-16.0.0.aar">
+            <sha256 value="8ef43b412de4ec3e36a87c66d8a0a14a3de0a2e8566946da6a0e799b7fdd8ec9" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="firebase-components-16.0.0.pom">
+            <sha256 value="5c5d0a5f811e4eb7512ea7aba70241ebeb27b9e195fbdea9b2c4b914272c326e" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.firebase" name="firebase-encoders" version="16.1.0">
+         <artifact name="firebase-encoders-16.1.0.jar">
+            <sha256 value="8f89a74298bbccc2c543385208a2f0c67f603ce67e6ec21cc772e98e688f7cf5" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="firebase-encoders-16.1.0.pom">
+            <sha256 value="687bd5744fdc54fce404a4403ebbdb847fbf651b9b87293a4a56fc4d8fc68e1c" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.firebase" name="firebase-encoders-json" version="17.1.0">
+         <artifact name="firebase-encoders-json-17.1.0.aar">
+            <sha256 value="8295c755bcadc87a2aaee5b9e568f27fd138fd45ff1159a8ee747cf4c3a38d85" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="firebase-encoders-json-17.1.0.pom">
+            <sha256 value="c823cbed7a0e75bf30fedbba42ff1c0c8752e3dc16edccf7d0f2e5d6cb69c7a8" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.gradle" name="osdetector-gradle-plugin" version="1.6.2">
+         <artifact name="osdetector-gradle-plugin-1.6.2.jar">
+            <sha256 value="845c3efce63bd23d962f210b13beebab05c4d583898a1b1a7ffb8c7b3ed7d5d4" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="osdetector-gradle-plugin-1.6.2.pom">
+            <sha256 value="5bf4f695ed1177e80524525b6e5a040a5d7ea4b16196b1110882c62e69a555e8" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.gradle" name="osdetector-gradle-plugin" version="1.7.0">
+         <artifact name="osdetector-gradle-plugin-1.7.0.jar">
+            <sha256 value="dbda2178c14ed6b93a184b1acbf38d72107002252668c111cf411eca37e41ca6" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="osdetector-gradle-plugin-1.7.0.pom">
+            <sha256 value="e81632c2ee9aa48e7ecf0547512c1c386560c0d46a958ee50550f7ebddf13517" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.j2objc" name="j2objc-annotations" version="1.1">
+         <artifact name="j2objc-annotations-1.1.jar">
+            <sha256 value="2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="j2objc-annotations-1.1.pom">
+            <sha256 value="f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.j2objc" name="j2objc-annotations" version="1.3">
+         <artifact name="j2objc-annotations-1.3.jar">
+            <sha256 value="21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="j2objc-annotations-1.3.pom">
+            <sha256 value="5faca824ba115bee458730337dfdb2fcea46ba2fd774d4304edbf30fa6a3f055" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.jimfs" name="jimfs" version="1.1">
+         <artifact name="jimfs-1.1.jar">
+            <sha256 value="c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="jimfs-1.1.pom">
+            <sha256 value="efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.jimfs" name="jimfs-parent" version="1.1">
+         <artifact name="jimfs-parent-1.1.pom">
+            <sha256 value="c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.jsilver" name="jsilver" version="1.0.0">
+         <artifact name="jsilver-1.0.0.jar">
+            <sha256 value="d545c70a650ffd1439893a6a8013568891e1e9d73e10c65cda3ec13a16110b58" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="jsilver-1.0.0.pom">
+            <sha256 value="a98b315a350473f376bf51ab8d9da0ca730cd234b9baf434d22959059140b9a6" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.mlkit" name="barcode-scanning" version="16.1.1">
+         <artifact name="barcode-scanning-16.1.1.aar">
+            <sha256 value="eb1e25c21e81b84f7625051d2079132447a0c55bca6df63ce5de81cd1b73e56b" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="barcode-scanning-16.1.1.pom">
+            <sha256 value="670a7a462b79dbd256b3678a658d538ea9483daa094842b93b35ff4d9399a150" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.mlkit" name="common" version="17.1.1">
+         <artifact name="common-17.1.1.aar">
+            <sha256 value="3305216ffcc50b7dce512ad558f48cf5156f6275750dea4890a3db8f46a89dbb" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="common-17.1.1.pom">
+            <sha256 value="f313723aefb55634b0a780a4967b61f2c188eaf3b638ee313b9f04c4dff0238c" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.mlkit" name="vision-common" version="16.3.0">
+         <artifact name="vision-common-16.3.0.aar">
+            <sha256 value="4687d90f2026011fbc38f6979a141997f6cb831ca8f9f2ebfd0daa3cc6468a13" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="vision-common-16.3.0.pom">
+            <sha256 value="26fd2c8522da770ce7c3317e82597deb823e9256aaa2c93a68115d10f478600d" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.protobuf" name="protoc" version="3.10.0">
+         <artifact name="protoc-3.10.0-linux-x86_64.exe">
+            <sha256 value="eed3ea189a99e3ad4e4209332e7161b255dc8f39bbde4c8e9fc25535f0f6f4f5" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="com.google.protobuf" name="protoc" version="3.7.1">
+         <artifact name="protoc-3.7.1-linux-x86_64.exe">
+            <sha256 value="5daebf11b4b46970b6766a42a25fd2601bea9cb1b44a2962b2caf540914db9c8" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.google.prefab" name="cli" version="2.0.0">
+         <artifact name="cli-2.0.0-all.jar">
+            <sha256 value="d9bd89f68446b82be038aae774771ad85922d0b375209b17625a2734b5317e29" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="cli-2.0.0.pom">
+            <sha256 value="4856401a263b39c5394b36a16e0d99628cf05c68008a0cda9691c72bb101e1df" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.googlecode.json-simple" name="json-simple" version="1.1">
+         <artifact name="json-simple-1.1.jar">
+            <sha256 value="2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="json-simple-1.1.pom">
+            <sha256 value="47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.gradle" name="gradle-enterprise-gradle-plugin" version="3.7.2">
+         <artifact name="gradle-enterprise-gradle-plugin-3.7.2.pom">
+            <sha256 value="b66ce3d9a7f02c54fc4441aada8f97fd533b3d3b9162c37549f1dc8a6c6252d3" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.squareup.okio" name="okio" version="2.8.0">
+         <artifact name="okio-2.8.0.module">
+            <sha256 value="17baab7270389a5fa63ab12811864d0a00f381611bc4eb042fa1bd5918ed0965" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="okio-jvm-2.8.0.jar">
+            <sha256 value="4496b06e73982fcdd8a5393f46e5df2ce2fa4465df5895454cac68a32f09bbc8" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.squareup.okio" name="okio" version="2.10.0">
+         <artifact name="okio-jvm-2.10.0.jar">
+            <sha256 value="a27f091d34aa452e37227e2cfa85809f29012a8ef2501a9b5a125a978e4fcbc1" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.squareup.sqldelight" name="coroutines-extensions-jvm" version="1.3.0">
+         <artifact name="sqldelight-coroutines-extensions-jvm-1.3.0.jar">
+            <sha256 value="47305eab44f8b2aef533d8ce76cec9eb5175715cac26b538b6bff5b106ed0ba1" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.squareup.wire" name="wire-grpc-client" version="3.6.0">
+         <artifact name="wire-grpc-client-3.6.0.module">
+            <sha256 value="f4d91b43e5ce4603d63842652f063f16c0827abda1922dfb9551a4ac23ba4462" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="wire-grpc-client-jvm-3.6.0.jar">
+            <sha256 value="96904172b35af353e4459786a7d02f1550698cd03b249799ecb563cea3b4c277" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.squareup.wire" name="wire-runtime" version="3.6.0">
+         <artifact name="wire-runtime-3.6.0.module">
+            <sha256 value="3b99891842fdec80e7b24ae7f7c485ae41ca35b47c902ca2043cc948aaf58010" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="wire-runtime-jvm-3.6.0.jar">
+            <sha256 value="ac41d3f9b8a88046788c6827b0519bf0c53dcc271f598f48aa666c6f5a9523d0" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.squareup.wire" name="wire-schema" version="3.6.0">
+         <artifact name="wire-schema-3.6.0.module">
+            <sha256 value="85abd765f2efca0545889c935d8c240e31736a22221231a59bcc4510358b6aaa" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="wire-schema-jvm-3.6.0.jar">
+            <sha256 value="108bc4bafe7024a41460a1a60e72b6a95b69e5afd29c9f11ba7d8e0de2207976" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.linkedin.dexmaker" name="dexmaker" version="2.25.0">
+         <artifact name="dexmaker-2.25.0.jar">
+            <sha256 value="1f36f71501c83e4fdb5124d01ec2d995f2f483394a12587f95e9ce897804ee3b" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="dexmaker-2.25.0.pom">
+            <sha256 value="50c077e3ea3e0b156f082bfb3ba48539caed5c0493d59fbf8d61fc57741b6c3d" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.linkedin.dexmaker" name="dexmaker-mockito" version="2.25.0">
+         <artifact name="dexmaker-mockito-2.25.0.jar">
+            <sha256 value="b3efa480fa4dae1484180e9fbe181a251fcd0c2ecd93870d9dfa2e2d689b1fdb" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="dexmaker-mockito-2.25.0.pom">
+            <sha256 value="3d8e451937a7699a5d02167b7256e979e4edbdfe3ec2521771d7971f011aeeaf" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="com.linkedin.dexmaker" name="dexmaker-mockito-inline" version="2.25.0">
+         <artifact name="dexmaker-mockito-inline-2.25.0.aar">
+            <sha256 value="a5b9f44f3f782dabf0628899828471e3e31e094ad133bc3679739a69a7c07465" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="dexmaker-mockito-inline-2.25.0.pom">
+            <sha256 value="6ee02686120de5fe10ddb67639c7b2bbcc734de092388136f0449ca6f946cbf1" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Invalid signature -->
+      <component group="de.undercouch" name="gradle-download-task" version="4.1.1">
+         <artifact name="gradle-download-task-4.1.1.jar">
+            <ignored-keys>
+               <ignored-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" reason="PGP verification failed"/>
+            </ignored-keys>
+            <sha256 value="eb08b570e408d4646705e70a949614d439ea2b11455f1652ab0330de8954dab9" origin="Generated by Gradle">
+               <also-trust value="81d795f8d22c09bdae192d3e2f40624d6a14325ae745547bbce9df74361be598"/>
+            </sha256>
+         </artifact>
+         <artifact name="gradle-download-task-4.1.1.pom">
+            <pgp value="1fa37fbe4453c1073e7ef61d6449005f96bc97a3"/>
+            <sha256 value="85e6607260dbbdb5e85f1988840b0d9ac4be9119dde90a1baca8ea775646415a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="gradle.plugin.com.github.johnrengelman" name="shadow" version="7.1.1">
+         <artifact name="shadow-7.1.1.jar">
+            <sha256 value="a870861a7a3d54ffd97822051a27b2f1b86dd5c480317f0b97f3b27581b742af" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="shadow-7.1.1.pom">
+            <sha256 value="683be0cd32af9c80a6d4a143b9a6ac2eb45ebc3ccd16db4ca11b94e55fc5e52f" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="gradle.plugin.com.google.protobuf" name="protobuf-gradle-plugin" version="0.8.13">
+         <artifact name="protobuf-gradle-plugin-0.8.13.jar">
+            <sha256 value="8a04b6eee4eab68c73b6e61cc8e00206753691b781d042afbae746f97e8c6f2d" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="protobuf-gradle-plugin-0.8.13.pom">
+            <sha256 value="d8c46016037cda6360561b9c6a21a6c2a4847cad15c3c63903e15328fbcccc45" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="javax.activation" name="activation" version="1.1">
+         <artifact name="activation-1.1.jar">
+            <sha256 value="2881c79c9d6ef01c58e62beea13e9d1ac8b8baa16f2fc198ad6e6776defdcdd3" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="activation-1.1.pom">
+            <sha256 value="d490e540a11504b9d71718b1c85fef7b3de6802361290824539b076d58faa8a0" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="javax.annotation" name="jsr250-api" version="1.0">
+         <artifact name="jsr250-api-1.0.jar">
+            <sha256 value="a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="jsr250-api-1.0.pom">
+            <sha256 value="548b0ef6f04356ef2283af5140d9404f38fd3891a509d468537abf2f9462944d" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="javax.inject" name="javax.inject" version="1">
+         <artifact name="javax.inject-1.jar">
+            <sha256 value="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="javax.inject-1.pom">
+            <sha256 value="943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="me.champeau.gradle" name="japicmp-gradle-plugin" version="0.2.9">
+         <artifact name="japicmp-gradle-plugin-0.2.9.jar">
+            <sha256 value="320944e8f3a42a38a5e0f08c6e1e8ae11a63fc82e1f7bf0429a6b7d89d26fac3" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="japicmp-gradle-plugin-0.2.9.pom">
+            <sha256 value="41fc0c243907c241cffa24a06a8cb542747c848ebad5feb6b0413d61b4a0ebc2" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="nekohtml" name="nekohtml" version="1.9.6.2">
+         <artifact name="nekohtml-1.9.6.2.jar">
+            <sha256 value="fdff6cfa9ed9cc911c842a5d2395f209ec621ef1239d46810e9e495809d3ae09" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="nekohtml-1.9.6.2.pom">
+            <sha256 value="f5655d331af6afcd4dbaedaa739b889380c771a7e83f7aea5c8544a05074cf0b" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="nekohtml" name="xercesMinimal" version="1.9.6.2">
+         <artifact name="xercesMinimal-1.9.6.2.jar">
+            <sha256 value="95b8b357d19f63797dd7d67622fd3f18374d64acbc6584faba1c7759a31e8438" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="xercesMinimal-1.9.6.2.pom">
+            <sha256 value="c219d697fa9c8f243d8f6e347499b6d4e8af1d0cac4bbc7b3907d338a2024c13" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="net.java" name="jvnet-parent" version="1">
+         <artifact name="jvnet-parent-1.pom">
+            <sha256 value="281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="net.java" name="jvnet-parent" version="3">
+         <artifact name="jvnet-parent-3.pom">
+            <sha256 value="30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="net.java" name="jvnet-parent" version="5">
+         <artifact name="jvnet-parent-5.pom">
+            <sha256 value="1af699f8d9ddab67f9a0d202fbd7915eb0362a5a6dfd5ffc54cafa3465c9cb0a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="net.sf.kxml" name="kxml2" version="2.3.0">
+         <artifact name="kxml2-2.3.0.jar">
+            <sha256 value="f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="kxml2-2.3.0.pom">
+            <sha256 value="31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.ccil.cowan.tagsoup" name="tagsoup" version="1.2">
+         <artifact name="tagsoup-1.2.jar">
+            <sha256 value="10d12b82c9a58a7842765a1152a56fbbd11eac9122a621f5a86a087503297266" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="tagsoup-1.2.pom">
+            <sha256 value="186fd460ee13150e31188703a2c871bf86e20332636f3ede4ab959cd5568da78" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.codehaus.plexus" name="plexus-utils" version="1.5.15">
+         <artifact name="plexus-utils-1.5.15.jar">
+            <sha256 value="2ca121831e597b4d8f2cb22d17c5c041fc23a7777ceb6bfbdd4dfb34bbe7d997" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="plexus-utils-1.5.15.pom">
+            <sha256 value="12a3c9a32b82fdc95223cab1f9d344e14ef3e396da14c4d0013451646f3280e7" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.codehaus.plexus" name="plexus" version="1.0.4">
+         <artifact name="plexus-1.0.4.pom">
+            <sha256 value="2242fd02d12b1ca73267fb3d89863025517200e7a4ee426cba4667d0172c74c3" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.codehaus.plexus" name="plexus" version="2.0.2">
+         <artifact name="plexus-2.0.2.pom">
+            <sha256 value="e246e2a062b5d989fdefc521c9c56431ba5554ff8d2344edee9218a34a546a33" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.codehaus.plexus" name="plexus-components" version="1.1.14">
+         <artifact name="plexus-components-1.1.14.pom">
+            <sha256 value="381d72c526be217b770f9f8c3f749a86d3b1548ac5c1fcb48d267530ec60d43f" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.codehaus.plexus" name="plexus-container-default" version="1.0-alpha-9-stable-1">
+         <artifact name="plexus-container-default-1.0-alpha-9-stable-1.jar">
+            <sha256 value="7c758612888782ccfe376823aee7cdcc7e0cdafb097f7ef50295a0b0c3a16edf" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="plexus-container-default-1.0-alpha-9-stable-1.pom">
+            <sha256 value="ef71d45a49edfe76be0f520312a76bc2aae73ec0743a5ffffe10d30122c6e2b2" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.codehaus.plexus" name="plexus-containers" version="1.0.3">
+         <artifact name="plexus-containers-1.0.3.pom">
+            <sha256 value="7c75075badcb014443ee94c8c4cad2f4a9905be3ce9430fe7b220afc7fa3a80f" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.codehaus.plexus" name="plexus-interpolation" version="1.11">
+         <artifact name="plexus-interpolation-1.11.jar">
+            <sha256 value="fd9507feb858fa620d1b4aa4b7039fdea1a77e09d3fd28cfbddfff468d9d8c28" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="plexus-interpolation-1.11.pom">
+            <sha256 value="b84d281f59b9da528139e0752a0e1cab0bd98d52c58442b00e45c9748e1d9eee" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.dokka" name="dokka-android-gradle-plugin" version="0.9.17-g014">
+         <artifact name="dokka-android-gradle-plugin-0.9.17-g014.jar">
+            <sha256 value="64b2e96fd20762351c74f08d598d49c25a490a3b685b8a09446e81d6db36fe81" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="dokka-android-gradle-plugin-0.9.17-g014.pom">
+            <sha256 value="956ff381c6c775161a82823bb52d0aa40a8f6a37ab85059f149531f5e5efb7da" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.dokka" name="dokka-fatjar" version="0.9.17-g014">
+         <artifact name="dokka-fatjar-0.9.17-g014.jar">
+            <sha256 value="47cf09501402a101e555588cf5fa9ed83f8572bce9fd60db29e74b5d079628e3" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="dokka-fatjar-0.9.17-g014.pom">
+            <sha256 value="ceb601f55f14337261fea474bb061407dc0e52146f80d74cd0b43d66febd401f" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.dokka" name="dokka-gradle-plugin" version="0.9.17-g014">
+         <artifact name="dokka-gradle-plugin-0.9.17-g014.jar">
+            <sha256 value="643a7eddeb521832c6021508b7477b603517438481bc06633dca12eb1f339422" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="dokka-gradle-plugin-0.9.17-g014.pom">
+            <sha256 value="b217e9a1f1503c9f0c744b736fc2afed6fa6c3c2e86e5276a3c549f5bd48baef" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.kotlin.plugin.serialization" name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin" version="1.4.21">
+         <artifact name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin-1.4.21.pom">
+            <sha256 value="400f6deaaea07284b2ce54f660bb20610a784e43c3090d8c6924876c69c883e5" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.kotlin.plugin.serialization" name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin" version="1.5.21">
+         <artifact name="org.jetbrains.kotlin.plugin.serialization.gradle.plugin-1.5.21.pom">
+            <sha256 value="4d91d6bad8c1aed65755fd532a0ae1ca75995829b17c96e67c53655c62eade7d" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.skiko" name="skiko" version="0.5.2">
+         <artifact name="skiko-0.5.2.jar">
+            <sha256 value="ca02f8c97308fe2334295013e4180c5a6d9be6a06d5e05a797c1d0d8fd5861a0" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="skiko-0.5.2.module">
+            <sha256 value="ed6fa8ab49d3f62c3fbd5b65b5d87393c7dac8c99dfcf27ef10c2ddab43e61e3" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.skiko" name="skiko-jvm" version="0.4.10">
+         <artifact name="skiko-jvm-0.4.10.jar">
+            <sha256 value="651bf4d7c98297b89f45677364c2523e758e61565d9d634e86c79c4e38b8278a" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="skiko-jvm-0.4.10.pom">
+            <sha256 value="829a894e8a7b427346fb018ed4439ce588eb919e275ac76c1125d2f38d00b709" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.skiko" name="skiko-jvm" version="0.4.7">
+         <artifact name="skiko-jvm-0.4.7.jar">
+            <sha256 value="2c0b946f977892bf44a075513951c9d983827b50e6c559086b64599eb096cc73" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="skiko-jvm-0.4.7.pom">
+            <sha256 value="b598714d3668b5b369b3f8f48e2861b87a3570b47eb631f57f7c9ee6756d8fe3" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.skiko" name="skiko-jvm" version="0.5.2">
+         <artifact name="skiko-jvm-0.5.2.jar">
+            <sha256 value="505c75975f39ab50da15d3a26f4bf368376945200095b9bef0f4b6bbc47c5df2" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="skiko-jvm-0.5.2.module">
+            <sha256 value="ca4d858c8a2cf2e9923c3666863c3fd9a1dfc0debd67f6ddd145d9086fba3019" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.skiko" name="skiko-jvm-runtime-linux-x64" version="0.4.10">
+         <artifact name="skiko-jvm-runtime-linux-x64-0.4.10.jar">
+            <sha256 value="f8ebeb96743067d77f6ce25715400592dbae5cb28b1b8f5521964e4e628e92ca" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="skiko-jvm-runtime-linux-x64-0.4.10.pom">
+            <sha256 value="7f218273b997f77efe0258141c0af3c5280840ebcc35e600d0167974a53cbdb0" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.skiko" name="skiko-jvm-runtime-linux-x64" version="0.4.7">
+         <artifact name="skiko-jvm-runtime-linux-x64-0.4.7.jar">
+            <sha256 value="f2c11b0da8dc96049b5ec078e2e1b017d4caea2e1234c8742fa8a5cb7dfc087e" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="skiko-jvm-runtime-linux-x64-0.4.7.pom">
+            <sha256 value="1d46f9e8ca3dcad48a6a1c3e27292df4cf55747b72817a16fa8545c1a0a3aef2" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.jetbrains.skiko" name="skiko-jvm-runtime-linux-x64" version="0.5.2">
+         <artifact name="skiko-jvm-runtime-linux-x64-0.5.2.jar">
+            <sha256 value="2c2cb4bc42ba531065316d8d4a50a713533fa3dbc1aeffa308fd962ca173f173" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="skiko-jvm-runtime-linux-x64-0.5.2.pom">
+            <sha256 value="7b84a5c60fbc9ba289159b327ba7022a9242e34ca684fdea059c36d94cb2977f" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.ow2" name="ow2" version="1.5">
+         <artifact name="ow2-1.5.pom">
+            <sha256 value="0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.ow2.asm" name="asm" version="7.0">
+         <artifact name="asm-7.0.jar">
+            <sha256 value="b88ef66468b3c978ad0c97fd6e90979e56155b4ac69089ba7a44e9aa7ffe9acf" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="asm-7.0.pom">
+            <sha256 value="83f65b1083d5ce4f8ba7f9545cfe9ff17824589c9a7cc82c3a4695801e4f5f68" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.ow2.asm" name="asm-analysis" version="7.0">
+         <artifact name="asm-analysis-7.0.jar">
+            <sha256 value="e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="asm-analysis-7.0.pom">
+            <sha256 value="c6b54477e9d5bae1e7addff2e24cbf92aaff2ff08fd6bc0596c3933c3fadc2cb" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.ow2.asm" name="asm-commons" version="7.0">
+         <artifact name="asm-commons-7.0.jar">
+            <sha256 value="fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="asm-commons-7.0.pom">
+            <sha256 value="f4c697886cdb4a5b2472054a0b5e34371e9b48e620be40c3ed48e1f4b6d51eb4" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.ow2.asm" name="asm-tree" version="7.0">
+         <artifact name="asm-tree-7.0.jar">
+            <sha256 value="cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="asm-tree-7.0.pom">
+            <sha256 value="d39e7dd12f4ff535a0839d1949c39c7644355a4470220c94b76a5c168c57a068" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.ow2.asm" name="asm-util" version="7.0">
+         <artifact name="asm-util-7.0.jar">
+            <sha256 value="75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="asm-util-7.0.pom">
+            <sha256 value="e07bce4bb55d5a06f4c10d912fc9dee8a9b9c04ec549bbb8db4f20db34706f75" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="org.sonatype.oss" name="oss-parent" version="7">
+         <artifact name="oss-parent-7.pom">
+            <sha256 value="b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Invalid signature -->
+      <component group="org.tensorflow" name="tensorflow-lite-metadata" version="0.1.0-rc2">
+         <artifact name="tensorflow-lite-metadata-0.1.0-rc2.jar">
+            <pgp value="db0597e3144342256bc81e3ec727d053c4481cf5"/>
+            <sha256 value="2c2a264f842498c36d34d2a7b91342490d9a962862c85baac1acd54ec2fca6d9" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="tensorflow-lite-metadata-0.1.0-rc2.pom">
+            <ignored-keys>
+               <ignored-key id="db0597e3144342256bc81e3ec727d053c4481cf5" reason="PGP verification failed"/>
+            </ignored-keys>
+            <sha256 value="8359ad51e0476c8e0df7188a43f16d49733c4a428fb45e99794b783f01b97520" origin="Generated by Gradle">
+               <also-trust value="9a4f5e5674366c156c90391662f03ed7c5971d6aa63832df74a271da6ff82e96"/>
+            </sha256>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="xmlpull" name="xmlpull" version="1.1.3.1">
+         <artifact name="xmlpull-1.1.3.1.jar">
+            <sha256 value="34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="xmlpull-1.1.3.1.pom">
+            <sha256 value="8f10ffd8df0d3e9819c8cc8402709c6b248bc53a954ef6e45470d9ae3a5735fb" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <!-- Unsigned -->
+      <component group="xpp3" name="xpp3" version="1.1.4c">
+         <artifact name="xpp3-1.1.4c.jar">
+            <sha256 value="0341395a481bb887803957145a6a37879853dd625e9244c2ea2509d9bb7531b9" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="xpp3-1.1.4c.pom">
+            <sha256 value="4e54622f5dc0f8b6c51e28650268f001e3b55d076c8e3a9d9731c050820c0a3d" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+   </components>
+</verification-metadata>
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index da66b3a..e7769e2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=../../../../tools/external/gradle/gradle-7.4-rc-1-bin.zip
+distributionUrl=../../../../tools/external/gradle/gradle-7.3-bin.zip
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt b/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
index c5ac47b..37e2930 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
@@ -18,6 +18,7 @@
 
 package androidx.build.lint
 
+import com.android.tools.lint.client.api.Configuration
 import com.android.tools.lint.client.api.UElementHandler
 import com.android.tools.lint.detector.api.Category
 import com.android.tools.lint.detector.api.Detector
@@ -27,6 +28,8 @@
 import com.android.tools.lint.detector.api.JavaContext
 import com.android.tools.lint.detector.api.Scope
 import com.android.tools.lint.detector.api.Severity
+import java.io.File
+import java.io.FileNotFoundException
 import org.jetbrains.uast.UAnnotated
 import org.jetbrains.uast.UAnnotation
 import org.jetbrains.uast.UClass
@@ -45,6 +48,10 @@
     }
 
     private inner class AnnotationChecker(val context: JavaContext) : UElementHandler() {
+        val atomicGroupList: List<String> by lazy {
+            loadAtomicLibraryGroupData(context.configuration, ISSUE)
+        }
+
         override fun visitAnnotation(node: UAnnotation) {
             if (DEBUG) {
                 if (APPLICABLE_ANNOTATIONS.contains(node.qualifiedName) && node.sourcePsi != null) {
@@ -68,17 +75,55 @@
                                 "${context.project}"
                         )
                     }
-                    verifyUsageOfElementIsWithinSameGroup(context, node, annotation, ISSUE)
+
+                    verifyUsageOfElementIsWithinSameGroup(
+                        context,
+                        node,
+                        annotation,
+                        ISSUE,
+                        atomicGroupList
+                    )
                 }
             }
         }
+
+        private fun loadAtomicLibraryGroupData(
+            configuration: Configuration,
+            issue: Issue
+        ): List<String> {
+            val filename = configuration.getOption(issue, ATOMIC_LIBGROUP_FILE_PROPERTY, null)
+                ?: throw RuntimeException(
+                    "Property $ATOMIC_LIBGROUP_FILE_PROPERTY is not set in lint.xml.")
+
+            val libGroupFile = if (filename.contains(OUT_DIR_PLACEHOLDER)) {
+                val fileLocation = filename.replace(OUT_DIR_PLACEHOLDER, System.getenv("OUT_DIR"))
+                val file = File(fileLocation)
+                if (!file.exists()) {
+                    throw FileNotFoundException("Couldn't find atomic library group file $filename")
+                }
+                file
+            } else {
+                configuration.getOptionAsFile(issue, ATOMIC_LIBGROUP_FILE_PROPERTY, null)
+                    ?: throw FileNotFoundException(
+                        "Couldn't find atomic library group file $filename")
+            }
+
+            val atomicLibraryGroups = libGroupFile.readLines()
+            if (atomicLibraryGroups.isEmpty()) {
+                throw RuntimeException("Atomic library group file should not be empty")
+            }
+
+            return atomicLibraryGroups
+        }
     }
 
+    @Suppress("UNUSED_PARAMETER") // TODO: write logic + tests in future CL that uses groupList
     fun verifyUsageOfElementIsWithinSameGroup(
         context: JavaContext,
         usage: UElement,
         annotation: UElement,
         issue: Issue,
+        atomicGroupList: List<String>,
     ) {
         val evaluator = context.evaluator
         val usageCoordinates = evaluator.getLibrary(usage) ?: context.project.mavenCoordinate
@@ -105,6 +150,17 @@
         private const val DEBUG = false
 
         /**
+         * This string must match the value defined in buildSrc/lint.xml
+         *
+         * This is needed as we need to define the location of the atomic library group file for
+         * non-test usage.  For tests, we can directly use the value defined in test lint.xml files.
+         */
+        private const val OUT_DIR_PLACEHOLDER = "USE_SYSTEM_OUT_DIR"
+
+        // This must match the setting in buildSrc/lint.xml
+        private const val ATOMIC_LIBGROUP_FILE_PROPERTY = "atomicLibraryGroupFilename"
+
+        /**
          * Even though Kotlin's [Experimental] annotation is deprecated in favor of [RequiresOptIn],
          * we still want to check for its use in Lint.
          */
diff --git a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
index 18e726e..f33aea8 100644
--- a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
@@ -20,23 +20,23 @@
 
 import com.android.SdkConstants.ATTR_VALUE
 import com.android.tools.lint.checks.ApiDetector.Companion.REQUIRES_API_ANNOTATION
-import com.android.tools.lint.client.api.UElementHandler
-import com.android.tools.lint.detector.api.JavaContext
-import com.android.tools.lint.detector.api.SourceCodeScanner
 import com.android.tools.lint.checks.ApiLookup
 import com.android.tools.lint.checks.ApiLookup.equivalentName
 import com.android.tools.lint.checks.DesugaredMethodLookup
 import com.android.tools.lint.checks.VersionChecks.Companion.codeNameToApi
+import com.android.tools.lint.client.api.UElementHandler
 import com.android.tools.lint.detector.api.Category
 import com.android.tools.lint.detector.api.Context
 import com.android.tools.lint.detector.api.Desugaring
 import com.android.tools.lint.detector.api.Detector
 import com.android.tools.lint.detector.api.Implementation
 import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
 import com.android.tools.lint.detector.api.LintFix
 import com.android.tools.lint.detector.api.Location
 import com.android.tools.lint.detector.api.Scope
 import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
 import com.android.tools.lint.detector.api.UastLintUtils.Companion.getLongAttribute
 import com.android.tools.lint.detector.api.getInternalMethodName
 import com.android.tools.lint.detector.api.isKotlin
@@ -49,6 +49,7 @@
 import com.intellij.psi.PsiSuperExpression
 import com.intellij.psi.PsiType
 import com.intellij.psi.util.PsiTreeUtil
+import kotlin.math.min
 import org.jetbrains.uast.UCallExpression
 import org.jetbrains.uast.UClass
 import org.jetbrains.uast.UElement
@@ -59,12 +60,10 @@
 import org.jetbrains.uast.UThisExpression
 import org.jetbrains.uast.getContainingUClass
 import org.jetbrains.uast.getContainingUMethod
-import org.jetbrains.uast.java.JavaUAnnotation
 import org.jetbrains.uast.java.JavaUQualifiedReferenceExpression
 import org.jetbrains.uast.java.JavaUSimpleNameReferenceExpression
 import org.jetbrains.uast.util.isConstructorCall
 import org.jetbrains.uast.util.isMethodCall
-import kotlin.math.min
 
 /**
  * This check detects references to platform APIs that are likely to cause class verification
@@ -768,30 +767,29 @@
             return null
         }
 
-        @Suppress("DEPRECATION") // usage of getAllAnnotations b/214311882
         private fun getRequiresApiFromAnnotations(modifierListOwner: PsiModifierListOwner): Int {
-            for (annotation in context.evaluator.getAllAnnotations(modifierListOwner, false)) {
+            for (annotation in context.evaluator.getAnnotations(modifierListOwner)) {
                 val qualifiedName = annotation.qualifiedName
                 if (REQUIRES_API_ANNOTATION.isEquals(qualifiedName)) {
-                    val wrapped = JavaUAnnotation.wrap(annotation)
                     var api = getLongAttribute(
-                        context, wrapped,
+                        context, annotation,
                         ATTR_VALUE, NO_API_REQUIREMENT.toLong()
                     ).toInt()
                     if (api <= 1) {
                         // @RequiresApi has two aliasing attributes: api and value
-                        api = getLongAttribute(context, wrapped, "api", NO_API_REQUIREMENT.toLong())
-                            .toInt()
+                        api = getLongAttribute(
+                            context, annotation, "api", NO_API_REQUIREMENT.toLong()).toInt()
                     }
                     return api
                 } else if (qualifiedName == null) {
                     // Work around UAST type resolution problems
                     // Work around bugs in UAST type resolution for file annotations:
                     // parse the source string instead.
-                    if (annotation is PsiCompiledElement) {
+                    val psiAnnotation = annotation.javaPsi
+                    if (psiAnnotation == null || psiAnnotation is PsiCompiledElement) {
                         continue
                     }
-                    val text = annotation.text
+                    val text = psiAnnotation.text
                     if (text.contains("RequiresApi(")) {
                         val start = text.indexOf('(')
                         val end = text.indexOf(')', start + 1)
diff --git a/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt b/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt
index 3003f41..a0c0e6f 100644
--- a/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt
@@ -19,10 +19,13 @@
 package androidx.build.lint
 
 import com.android.tools.lint.checks.infrastructure.ProjectDescription
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestFiles
 import com.android.tools.lint.checks.infrastructure.TestMode
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
+import java.io.FileNotFoundException
 
 @RunWith(JUnit4::class)
 class BanInappropriateExperimentalUsageTest : AbstractLintDetectorTest(
@@ -30,6 +33,27 @@
     useIssues = listOf(BanInappropriateExperimentalUsage.ISSUE),
     stubs = arrayOf(Stubs.OptIn),
 ) {
+    // This must match the setting in buildSrc/lint.xml
+    private val validLintConfig: TestFile = TestFiles.xml(
+        "lint.xml",
+        """
+<lint>
+    <issue id="IllegalExperimentalApiUsage">
+        <option name="atomicLibraryGroupFilename" value="atomic-library-groups.txt"/>
+    </issue>
+</lint>
+            """.trimIndent()
+    )
+
+    private val libraryGroups = TestFiles.source(
+        "atomic-library-groups.txt",
+        """
+androidx.a
+androidx.b
+            """.trimIndent()
+    )
+
+    private val UNUSED_PLACEHOLDER = "unused"
 
     @Test
     fun `Test within-module Experimental usage via Gradle model`() {
@@ -44,6 +68,8 @@
                     group=sample.annotation.provider
                     """
                 ).indented(),
+                validLintConfig,
+                libraryGroups,
             )
 
         /* ktlint-disable max-line-length */
@@ -85,6 +111,8 @@
                     group=androidx.sample.consumer
                     """
                 ).indented(),
+                validLintConfig,
+                libraryGroups,
             )
 
         /* ktlint-disable max-line-length */
@@ -102,4 +130,128 @@
         // TODO: Using TestMode.DEFAULT due to b/188814760; remove testModes once bug is resolved
         check(provider, consumer, testModes = listOf(TestMode.DEFAULT)).expect(expected)
     }
+
+    @Test(expected = RuntimeException::class)
+    fun `Missing atomicLibraryGroupFilename property should throw an exception`() {
+        val invalidLintConfig: TestFile = TestFiles.xml(
+            "lint.xml",
+            """
+<lint>
+    <issue id="IllegalExperimentalApiUsage">
+        <option name="foo" value="bar"/>
+    </issue>
+</lint>
+            """.trimIndent()
+        )
+        val provider = project()
+            .name("provider")
+            .type(ProjectDescription.Type.LIBRARY)
+            .report(false)
+            .files(
+                ktSample("sample.annotation.provider.ExperimentalSampleAnnotation"),
+                javaSample("sample.annotation.provider.ExperimentalSampleAnnotationJava"),
+                javaSample("sample.annotation.provider.RequiresOptInSampleAnnotationJava"),
+                gradle(
+                    """
+                    apply plugin: 'com.android.library'
+                    group=sample.annotation.provider
+                    """
+                ).indented(),
+            )
+
+        val consumer = project()
+            .name("consumer")
+            .type(ProjectDescription.Type.LIBRARY)
+            .dependsOn(provider)
+            .files(
+                ktSample("androidx.sample.consumer.OutsideGroupExperimentalAnnotatedClass"),
+                gradle(
+                    """
+                    apply plugin: 'com.android.library'
+                    group=androidx.sample.consumer
+                    """
+                ).indented(),
+                invalidLintConfig,
+            )
+
+        // TODO: Using TestMode.DEFAULT due to b/188814760; remove testModes once bug is resolved
+        check(provider, consumer, testModes = listOf(TestMode.DEFAULT)).expect(UNUSED_PLACEHOLDER)
+    }
+
+    @Test(expected = FileNotFoundException::class)
+    fun `Missing atomic library group file should throw an exception`() {
+        val provider = project()
+            .name("provider")
+            .type(ProjectDescription.Type.LIBRARY)
+            .report(false)
+            .files(
+                ktSample("sample.annotation.provider.ExperimentalSampleAnnotation"),
+                javaSample("sample.annotation.provider.ExperimentalSampleAnnotationJava"),
+                javaSample("sample.annotation.provider.RequiresOptInSampleAnnotationJava"),
+                gradle(
+                    """
+                    apply plugin: 'com.android.library'
+                    group=sample.annotation.provider
+                    """
+                ).indented(),
+            )
+
+        val consumer = project()
+            .name("consumer")
+            .type(ProjectDescription.Type.LIBRARY)
+            .dependsOn(provider)
+            .files(
+                ktSample("androidx.sample.consumer.OutsideGroupExperimentalAnnotatedClass"),
+                gradle(
+                    """
+                    apply plugin: 'com.android.library'
+                    group=androidx.sample.consumer
+                    """
+                ).indented(),
+                validLintConfig,
+            )
+
+        // TODO: Using TestMode.DEFAULT due to b/188814760; remove testModes once bug is resolved
+        check(provider, consumer, testModes = listOf(TestMode.DEFAULT)).expect(UNUSED_PLACEHOLDER)
+    }
+
+    @Test(expected = RuntimeException::class)
+    fun `Empty atomic library group file should throw an exception`() {
+        val emptyLibraryGroups = TestFiles.source("atomic-library-groups.txt", "")
+
+        val provider = project()
+            .name("provider")
+            .type(ProjectDescription.Type.LIBRARY)
+            .report(false)
+            .files(
+                ktSample("sample.annotation.provider.ExperimentalSampleAnnotation"),
+                javaSample("sample.annotation.provider.ExperimentalSampleAnnotationJava"),
+                javaSample("sample.annotation.provider.RequiresOptInSampleAnnotationJava"),
+                gradle(
+                    """
+                    apply plugin: 'com.android.library'
+                    group=sample.annotation.provider
+                    """
+                ).indented(),
+            )
+
+        val consumer = project()
+            .name("consumer")
+            .type(ProjectDescription.Type.LIBRARY)
+            .dependsOn(provider)
+            .files(
+                ktSample("androidx.sample.consumer.OutsideGroupExperimentalAnnotatedClass"),
+                gradle(
+                    """
+                    apply plugin: 'com.android.library'
+                    group=androidx.sample.consumer
+                    """
+                ).indented(),
+                validLintConfig,
+                emptyLibraryGroups,
+            )
+
+        // TODO: Using TestMode.DEFAULT due to b/188814760; remove testModes once bug is resolved
+        check(provider, consumer, testModes = listOf(TestMode.DEFAULT)).expect(UNUSED_PLACEHOLDER)
+    }
 }
diff --git a/localbroadcastmanager/OWNERS b/localbroadcastmanager/OWNERS
deleted file mode 100644
index 20eea7c..0000000
--- a/localbroadcastmanager/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
[email protected]
diff --git a/localbroadcastmanager/localbroadcastmanager/api/1.0.0.txt b/localbroadcastmanager/localbroadcastmanager/api/1.0.0.txt
deleted file mode 100644
index e646c932..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/1.0.0.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 3.0
-package androidx.localbroadcastmanager.content {
-
-  public final class LocalBroadcastManager {
-    method public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/1.1.0.txt b/localbroadcastmanager/localbroadcastmanager/api/1.1.0.txt
deleted file mode 100644
index 665dd3c..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/1.1.0.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 3.0
-package androidx.localbroadcastmanager.content {
-
-  @Deprecated public final class LocalBroadcastManager {
-    method @Deprecated public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method @Deprecated public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method @Deprecated public boolean sendBroadcast(android.content.Intent);
-    method @Deprecated public void sendBroadcastSync(android.content.Intent);
-    method @Deprecated public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/current.txt b/localbroadcastmanager/localbroadcastmanager/api/current.txt
deleted file mode 100644
index 529fbcd..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/current.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 4.0
-package androidx.localbroadcastmanager.content {
-
-  @Deprecated public final class LocalBroadcastManager {
-    method @Deprecated public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method @Deprecated public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method @Deprecated public boolean sendBroadcast(android.content.Intent);
-    method @Deprecated public void sendBroadcastSync(android.content.Intent);
-    method @Deprecated public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_1.0.0.txt b/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_1.0.0.txt
deleted file mode 100644
index e646c932..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_1.0.0.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 3.0
-package androidx.localbroadcastmanager.content {
-
-  public final class LocalBroadcastManager {
-    method public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_1.1.0.txt b/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_1.1.0.txt
deleted file mode 100644
index 665dd3c..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_1.1.0.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 3.0
-package androidx.localbroadcastmanager.content {
-
-  @Deprecated public final class LocalBroadcastManager {
-    method @Deprecated public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method @Deprecated public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method @Deprecated public boolean sendBroadcast(android.content.Intent);
-    method @Deprecated public void sendBroadcastSync(android.content.Intent);
-    method @Deprecated public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_current.txt b/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_current.txt
deleted file mode 100644
index 529fbcd..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/public_plus_experimental_current.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 4.0
-package androidx.localbroadcastmanager.content {
-
-  @Deprecated public final class LocalBroadcastManager {
-    method @Deprecated public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method @Deprecated public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method @Deprecated public boolean sendBroadcast(android.content.Intent);
-    method @Deprecated public void sendBroadcastSync(android.content.Intent);
-    method @Deprecated public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-1.1.0.txt b/localbroadcastmanager/localbroadcastmanager/api/res-1.1.0.txt
deleted file mode 100644
index e69de29..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/res-1.1.0.txt
+++ /dev/null
diff --git a/localbroadcastmanager/localbroadcastmanager/api/restricted_1.0.0.txt b/localbroadcastmanager/localbroadcastmanager/api/restricted_1.0.0.txt
deleted file mode 100644
index e646c932..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/restricted_1.0.0.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 3.0
-package androidx.localbroadcastmanager.content {
-
-  public final class LocalBroadcastManager {
-    method public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/restricted_1.1.0.txt b/localbroadcastmanager/localbroadcastmanager/api/restricted_1.1.0.txt
deleted file mode 100644
index 665dd3c..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/restricted_1.1.0.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 3.0
-package androidx.localbroadcastmanager.content {
-
-  @Deprecated public final class LocalBroadcastManager {
-    method @Deprecated public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method @Deprecated public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method @Deprecated public boolean sendBroadcast(android.content.Intent);
-    method @Deprecated public void sendBroadcastSync(android.content.Intent);
-    method @Deprecated public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/api/restricted_current.txt b/localbroadcastmanager/localbroadcastmanager/api/restricted_current.txt
deleted file mode 100644
index 529fbcd..0000000
--- a/localbroadcastmanager/localbroadcastmanager/api/restricted_current.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Signature format: 4.0
-package androidx.localbroadcastmanager.content {
-
-  @Deprecated public final class LocalBroadcastManager {
-    method @Deprecated public static androidx.localbroadcastmanager.content.LocalBroadcastManager getInstance(android.content.Context);
-    method @Deprecated public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method @Deprecated public boolean sendBroadcast(android.content.Intent);
-    method @Deprecated public void sendBroadcastSync(android.content.Intent);
-    method @Deprecated public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-}
-
diff --git a/localbroadcastmanager/localbroadcastmanager/build.gradle b/localbroadcastmanager/localbroadcastmanager/build.gradle
deleted file mode 100644
index c34098b..0000000
--- a/localbroadcastmanager/localbroadcastmanager/build.gradle
+++ /dev/null
@@ -1,19 +0,0 @@
-import androidx.build.LibraryGroups
-import androidx.build.Publish
-
-plugins {
-    id("AndroidXPlugin")
-    id("com.android.library")
-}
-
-dependencies {
-    api("androidx.annotation:annotation:1.1.0")
-}
-
-androidx {
-    name = "Android Support Library Local Broadcast Manager"
-    publish = Publish.SNAPSHOT_AND_RELEASE
-    mavenGroup = LibraryGroups.LOCALBROADCASTMANAGER
-    inceptionYear = "2018"
-    description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
-}
diff --git a/localbroadcastmanager/localbroadcastmanager/src/main/AndroidManifest.xml b/localbroadcastmanager/localbroadcastmanager/src/main/AndroidManifest.xml
deleted file mode 100644
index 442a4d8..0000000
--- a/localbroadcastmanager/localbroadcastmanager/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
-     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.
--->
-<manifest package="androidx.localbroadcastmanager"/>
diff --git a/localbroadcastmanager/localbroadcastmanager/src/main/java/androidx/localbroadcastmanager/content/LocalBroadcastManager.java b/localbroadcastmanager/localbroadcastmanager/src/main/java/androidx/localbroadcastmanager/content/LocalBroadcastManager.java
deleted file mode 100644
index 8323b05..0000000
--- a/localbroadcastmanager/localbroadcastmanager/src/main/java/androidx/localbroadcastmanager/content/LocalBroadcastManager.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * 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 androidx.localbroadcastmanager.content;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Set;
-
-/**
- * Helper to register for and send broadcasts of Intents to local objects
- * within your process.  This has a number of advantages over sending
- * global broadcasts with {@link android.content.Context#sendBroadcast}:
- * <ul>
- * <li> You know that the data you are broadcasting won't leave your app, so
- * don't need to worry about leaking private data.
- * <li> It is not possible for other applications to send these broadcasts to
- * your app, so you don't need to worry about having security holes they can
- * exploit.
- * <li> It is more efficient than sending a global broadcast through the
- * system.
- * </ul>
- *
- * @deprecated LocalBroadcastManager is an application-wide event bus and embraces layer violations
- * in your app: any component may listen events from any other. You can replace usage of
- * {@code LocalBroadcastManager} with other implementation of observable pattern, depending on your
- * usecase suitable options may be {@link androidx.lifecycle.LiveData} or reactive streams.
- */
-@Deprecated
-public final class LocalBroadcastManager {
-    private static final class ReceiverRecord {
-        final IntentFilter filter;
-        final BroadcastReceiver receiver;
-        boolean broadcasting;
-        boolean dead;
-
-        ReceiverRecord(IntentFilter _filter, BroadcastReceiver _receiver) {
-            filter = _filter;
-            receiver = _receiver;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder builder = new StringBuilder(128);
-            builder.append("Receiver{");
-            builder.append(receiver);
-            builder.append(" filter=");
-            builder.append(filter);
-            if (dead) {
-                builder.append(" DEAD");
-            }
-            builder.append("}");
-            return builder.toString();
-        }
-    }
-
-    private static final class BroadcastRecord {
-        final Intent intent;
-        final ArrayList<ReceiverRecord> receivers;
-
-        BroadcastRecord(Intent _intent, ArrayList<ReceiverRecord> _receivers) {
-            intent = _intent;
-            receivers = _receivers;
-        }
-    }
-
-    private static final String TAG = "LocalBroadcastManager";
-    private static final boolean DEBUG = false;
-
-    private final Context mAppContext;
-
-    private final HashMap<BroadcastReceiver, ArrayList<ReceiverRecord>> mReceivers
-            = new HashMap<>();
-    private final HashMap<String, ArrayList<ReceiverRecord>> mActions = new HashMap<>();
-
-    private final ArrayList<BroadcastRecord> mPendingBroadcasts = new ArrayList<>();
-
-    static final int MSG_EXEC_PENDING_BROADCASTS = 1;
-
-    private final Handler mHandler;
-
-    private static final Object mLock = new Object();
-    private static LocalBroadcastManager mInstance;
-
-    @NonNull
-    public static LocalBroadcastManager getInstance(@NonNull Context context) {
-        synchronized (mLock) {
-            if (mInstance == null) {
-                mInstance = new LocalBroadcastManager(context.getApplicationContext());
-            }
-            return mInstance;
-        }
-    }
-
-    private LocalBroadcastManager(Context context) {
-        mAppContext = context;
-        mHandler = new Handler(context.getMainLooper()) {
-
-            @Override
-            public void handleMessage(Message msg) {
-                switch (msg.what) {
-                    case MSG_EXEC_PENDING_BROADCASTS:
-                        executePendingBroadcasts();
-                        break;
-                    default:
-                        super.handleMessage(msg);
-                }
-            }
-        };
-    }
-
-    /**
-     * Register a receive for any local broadcasts that match the given IntentFilter.
-     *
-     * @param receiver The BroadcastReceiver to handle the broadcast.
-     * @param filter Selects the Intent broadcasts to be received.
-     *
-     * @see #unregisterReceiver
-     */
-    public void registerReceiver(@NonNull BroadcastReceiver receiver,
-            @NonNull IntentFilter filter) {
-        synchronized (mReceivers) {
-            ReceiverRecord entry = new ReceiverRecord(filter, receiver);
-            ArrayList<ReceiverRecord> filters = mReceivers.get(receiver);
-            if (filters == null) {
-                filters = new ArrayList<>(1);
-                mReceivers.put(receiver, filters);
-            }
-            filters.add(entry);
-            for (int i=0; i<filter.countActions(); i++) {
-                String action = filter.getAction(i);
-                ArrayList<ReceiverRecord> entries = mActions.get(action);
-                if (entries == null) {
-                    entries = new ArrayList<ReceiverRecord>(1);
-                    mActions.put(action, entries);
-                }
-                entries.add(entry);
-            }
-        }
-    }
-
-    /**
-     * Unregister a previously registered BroadcastReceiver.  <em>All</em>
-     * filters that have been registered for this BroadcastReceiver will be
-     * removed.
-     *
-     * @param receiver The BroadcastReceiver to unregister.
-     *
-     * @see #registerReceiver
-     */
-    public void unregisterReceiver(@NonNull BroadcastReceiver receiver) {
-        synchronized (mReceivers) {
-            final ArrayList<ReceiverRecord> filters = mReceivers.remove(receiver);
-            if (filters == null) {
-                return;
-            }
-            for (int i=filters.size()-1; i>=0; i--) {
-                final ReceiverRecord filter = filters.get(i);
-                filter.dead = true;
-                for (int j=0; j<filter.filter.countActions(); j++) {
-                    final String action = filter.filter.getAction(j);
-                    final ArrayList<ReceiverRecord> receivers = mActions.get(action);
-                    if (receivers != null) {
-                        for (int k=receivers.size()-1; k>=0; k--) {
-                            final ReceiverRecord rec = receivers.get(k);
-                            if (rec.receiver == receiver) {
-                                rec.dead = true;
-                                receivers.remove(k);
-                            }
-                        }
-                        if (receivers.size() <= 0) {
-                            mActions.remove(action);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Broadcast the given intent to all interested BroadcastReceivers.  This
-     * call is asynchronous; it returns immediately, and you will continue
-     * executing while the receivers are run.
-     *
-     * @param intent The Intent to broadcast; all receivers matching this
-     *     Intent will receive the broadcast.
-     *
-     * @see #registerReceiver
-     *
-     * @return Returns true if the intent has been scheduled for delivery to one or more
-     * broadcast receivers.  (Note that delivery may not ultimately take place if one of those
-     * receivers is unregistered before it is dispatched.)
-     */
-    public boolean sendBroadcast(@NonNull Intent intent) {
-        synchronized (mReceivers) {
-            final String action = intent.getAction();
-            final String type = intent.resolveTypeIfNeeded(
-                    mAppContext.getContentResolver());
-            final Uri data = intent.getData();
-            final String scheme = intent.getScheme();
-            final Set<String> categories = intent.getCategories();
-
-            final boolean debug = DEBUG ||
-                    ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
-            if (debug) Log.v(
-                    TAG, "Resolving type " + type + " scheme " + scheme
-                    + " of intent " + intent);
-
-            ArrayList<ReceiverRecord> entries = mActions.get(intent.getAction());
-            if (entries != null) {
-                if (debug) Log.v(TAG, "Action list: " + entries);
-
-                ArrayList<ReceiverRecord> receivers = null;
-                for (int i=0; i<entries.size(); i++) {
-                    ReceiverRecord receiver = entries.get(i);
-                    if (debug) Log.v(TAG, "Matching against filter " + receiver.filter);
-
-                    if (receiver.broadcasting) {
-                        if (debug) {
-                            Log.v(TAG, "  Filter's target already added");
-                        }
-                        continue;
-                    }
-
-                    int match = receiver.filter.match(action, type, scheme, data,
-                            categories, "LocalBroadcastManager");
-                    if (match >= 0) {
-                        if (debug) Log.v(TAG, "  Filter matched!  match=0x" +
-                                Integer.toHexString(match));
-                        if (receivers == null) {
-                            receivers = new ArrayList<ReceiverRecord>();
-                        }
-                        receivers.add(receiver);
-                        receiver.broadcasting = true;
-                    } else {
-                        if (debug) {
-                            String reason;
-                            switch (match) {
-                                case IntentFilter.NO_MATCH_ACTION: reason = "action"; break;
-                                case IntentFilter.NO_MATCH_CATEGORY: reason = "category"; break;
-                                case IntentFilter.NO_MATCH_DATA: reason = "data"; break;
-                                case IntentFilter.NO_MATCH_TYPE: reason = "type"; break;
-                                default: reason = "unknown reason"; break;
-                            }
-                            Log.v(TAG, "  Filter did not match: " + reason);
-                        }
-                    }
-                }
-
-                if (receivers != null) {
-                    for (int i=0; i<receivers.size(); i++) {
-                        receivers.get(i).broadcasting = false;
-                    }
-                    mPendingBroadcasts.add(new BroadcastRecord(intent, receivers));
-                    if (!mHandler.hasMessages(MSG_EXEC_PENDING_BROADCASTS)) {
-                        mHandler.sendEmptyMessage(MSG_EXEC_PENDING_BROADCASTS);
-                    }
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Like {@link #sendBroadcast(Intent)}, but if there are any receivers for
-     * the Intent this function will block and immediately dispatch them before
-     * returning.
-     */
-    public void sendBroadcastSync(@NonNull Intent intent) {
-        if (sendBroadcast(intent)) {
-            executePendingBroadcasts();
-        }
-    }
-
-    @SuppressWarnings("WeakerAccess") /* synthetic access */
-    void executePendingBroadcasts() {
-        while (true) {
-            final BroadcastRecord[] brs;
-            synchronized (mReceivers) {
-                final int N = mPendingBroadcasts.size();
-                if (N <= 0) {
-                    return;
-                }
-                brs = new BroadcastRecord[N];
-                mPendingBroadcasts.toArray(brs);
-                mPendingBroadcasts.clear();
-            }
-            for (int i=0; i<brs.length; i++) {
-                final BroadcastRecord br = brs[i];
-                final int nbr = br.receivers.size();
-                for (int j=0; j<nbr; j++) {
-                    final ReceiverRecord rec = br.receivers.get(j);
-                    if (!rec.dead) {
-                        rec.receiver.onReceive(mAppContext, br.intent);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedActivity.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedActivity.kt
index bd318ea..acb7ded 100644
--- a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedActivity.kt
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedActivity.kt
@@ -23,30 +23,30 @@
 import androidx.navigation.ui.navigateUp
 import androidx.navigation.ui.setupActionBarWithNavController
 
-public class DelayedActivity : AppCompatActivity() {
+class DelayedActivity : AppCompatActivity() {
 
-    public var delayMs: Long
+    var delayMs: Long
         get() {
-            val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+            val delayedView = findViewById<DelayedView>(R.id.delayedView)
             return delayedView?.delayMs ?: 0
         }
         set(value) {
-            val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+            val delayedView = findViewById<DelayedView>(R.id.delayedView)
             delayedView?.delayMs = value
         }
 
-    public var repetions: Int
+    var repetions: Int
         get() {
-            val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+            val delayedView = findViewById<DelayedView>(R.id.delayedView)
             return delayedView?.repetitions ?: 0
         }
         set(value) {
-            val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+            val delayedView = findViewById<DelayedView>(R.id.delayedView)
             delayedView?.repetitions = value
         }
 
-    public fun invalidate() {
-        val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+    fun invalidate() {
+        val delayedView = findViewById<DelayedView>(R.id.delayedView)
         delayedView?.invalidate()
     }
 
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedView.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedView.kt
index b9f935b..7a3006c 100644
--- a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedView.kt
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedView.kt
@@ -7,11 +7,11 @@
 import android.view.View
 import androidx.annotation.RequiresApi
 
-public class DelayedView(context: Context?, attrs: AttributeSet?) :
+class DelayedView(context: Context?, attrs: AttributeSet?) :
     View(context, attrs) {
 
-    public var delayMs: Long = 0
-    public var repetitions: Int = 0
+    var delayMs: Long = 0
+    var repetitions: Int = 0
 
     @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)
     override fun onDraw(canvas: Canvas?) {
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/JankStatsTest.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/JankStatsTest.kt
index 7eb90e0..0a72a5f 100644
--- a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/JankStatsTest.kt
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/JankStatsTest.kt
@@ -25,18 +25,19 @@
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.asExecutor
 import org.hamcrest.Matchers
-import org.junit.Assert
+import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
+import org.junit.Assert.assertThat
 import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
@@ -95,18 +96,45 @@
         latchedListener.reset()
 
         runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
-        Assert.assertEquals("numJankFrames should equal 0", 0, latchedListener.numJankFrames)
+        assertEquals("numJankFrames should equal 0", 0, latchedListener.numJankFrames)
         latchedListener.reset()
 
         jankStats.jankHeuristicMultiplier = 0f
         runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
-        Assert.assertEquals(
+        assertEquals(
             "multiplier 0, extremeMs 0: numJankFrames should equal NUM_FRAMES",
             NUM_FRAMES, latchedListener.numJankFrames
         )
     }
 
     @Test
+    fun testMultipleListeners() {
+        val frameDelay = 0
+
+        // Prime the system first to flush out any frames happening before we start forcing jank
+        runDelayTest(0, NUM_FRAMES, latchedListener)
+        latchedListener.reset()
+
+        val testState = StateInfo("Testing State", "sampleState")
+        metricsState.addSingleFrameState(testState.stateName, testState.state)
+        val secondListenerStates = mutableListOf<StateInfo>()
+        val secondListener = OnFrameListener {
+            secondListenerStates.addAll(it.states)
+        }
+        val scenario = delayedActivityRule.scenario
+        scenario.onActivity { _ ->
+            JankStats.createAndTrack(
+                delayedActivity.window,
+                Dispatchers.Default.asExecutor(), secondListener
+            )
+        }
+        runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
+        val jankData: FrameData = latchedListener.jankData[0]
+        assertEquals(listOf(testState), jankData.states)
+        assertEquals(listOf(testState), secondListenerStates)
+    }
+
+    @Test
     fun testRegularJank() {
         val frameDelay = 100
 
@@ -115,7 +143,7 @@
         latchedListener.reset()
 
         runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
-        Assert.assertEquals(
+        assertEquals(
             "numJankFrames should equal NUM_FRAMES",
             NUM_FRAMES,
             latchedListener.numJankFrames
@@ -124,7 +152,7 @@
 
         jankStats.jankHeuristicMultiplier = 20f
         runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
-        Assert.assertEquals(
+        assertEquals(
             "multiplier 20, extremeMs 0: numJankFrames should equal 0",
             0, latchedListener.numJankFrames
         )
@@ -147,29 +175,29 @@
         metricsState.addState(state1.stateName, state1.state)
         metricsState.addSingleFrameState(state2.stateName, state2.state)
         runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
-        Assert.assertEquals(
-            "frameDelay 100: There should be 10 frames with jank data", NUM_FRAMES,
+        assertEquals(
+            "frameDelay 100: There should be $NUM_FRAMES frames with jank data", NUM_FRAMES,
             latchedListener.jankData.size
         )
         var item0: FrameData = latchedListener.jankData[0]
-        Assert.assertEquals("There should be 3 states at frame 0", 3,
+        assertEquals("There should be 3 states at frame 0", 3,
             item0.states.size)
         for (state in item0.states) {
             // Test that every state is in the states set above
-            Assert.assertThat(state, Matchers.isIn(listOf(state0, state1, state2)))
+            assertThat(state, Matchers.isIn(listOf(state0, state1, state2)))
         }
         // Test that all states set above are in the states for the first frame
-        Assert.assertThat(state0, Matchers.isIn(item0.states))
-        Assert.assertThat(state1, Matchers.isIn(item0.states))
-        Assert.assertThat(state2, Matchers.isIn(item0.states))
+        assertThat(state0, Matchers.isIn(item0.states))
+        assertThat(state1, Matchers.isIn(item0.states))
+        assertThat(state2, Matchers.isIn(item0.states))
 
         // Now test the rest of the frames, which should not include singleFrameState state2
         for (i in 1 until NUM_FRAMES) {
             val item = latchedListener.jankData[i]
-            Assert.assertEquals("There should be 2 states at frame 0", 2,
+            assertEquals("There should be 2 states at frame 0", 2,
                 item.states.size)
             for (state in item.states) {
-                Assert.assertThat(
+                assertThat(
                     state,
                     Matchers.either(Matchers.`is`(state0)).or(Matchers.`is`(state1))
                 )
@@ -183,7 +211,7 @@
 
         runDelayTest(frameDelay, 1, latchedListener)
         item0 = latchedListener.jankData[0]
-        Assert.assertEquals(
+        assertEquals(
             "States should be empty after being cleared",
             0,
             item0.states.size
@@ -195,7 +223,7 @@
         metricsState.addState(state4.first!!, state4.second!!)
         runDelayTest(frameDelay, 1, latchedListener)
         item0 = latchedListener.jankData[0]
-        Assert.assertEquals(2, item0.states.size)
+        assertEquals(2, item0.states.size)
         latchedListener.reset()
 
         // Test removal of state3 and replacement of state4
@@ -203,9 +231,9 @@
         metricsState.addState(state4.first!!, "sampleStateF")
         runDelayTest(frameDelay, 1, latchedListener)
         item0 = latchedListener.jankData[0]
-        Assert.assertEquals(1, item0.states.size)
-        Assert.assertEquals(state4.first, item0.states[0].stateName)
-        Assert.assertEquals("sampleStateF", item0.states[0].state)
+        assertEquals(1, item0.states.size)
+        assertEquals(state4.first, item0.states[0].stateName)
+        assertEquals("sampleStateF", item0.states[0].state)
         latchedListener.reset()
     }
 
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStats.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStats.kt
index 31f3684..64927f5 100644
--- a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStats.kt
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStats.kt
@@ -155,13 +155,13 @@
      * listener with all of that information.
      */
     internal fun logFrameData(startTime: Long, actualDuration: Long, expectedDuration: Long) {
-        var frameStates =
+        val frameStates =
             metricsStateHolder.state?.getIntervalStates(startTime, startTime + actualDuration)
             ?: emptyList()
         val isJank = actualDuration > expectedDuration
-        executor.execute(Runnable {
+        executor.execute {
             frameListener.onFrame(FrameData(startTime, actualDuration, isJank, frameStates))
-        })
+        }
     }
 
     companion object {
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt
index fb7da31..3e02325 100644
--- a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt
@@ -16,7 +16,6 @@
 
 package androidx.metrics.performance
 
-import android.annotation.SuppressLint
 import android.app.Activity
 import android.os.Message
 import android.view.Choreographer
@@ -40,77 +39,139 @@
     // e.g., should we cache Window instead?
     internal val decorViewRef: WeakReference<View> = WeakReference(view)
 
-    lateinit var viewTreeObserver: ViewTreeObserver
-
     // Must cache this at init time, from view, since some subclasses will not receive callbacks
     // on the UI thread, so they will not have access to the appropriate Choreographer for
     // frame timing values
     val choreographer: Choreographer = Choreographer.getInstance()
 
-    private val onPreDrawListener: ViewTreeObserver.OnPreDrawListener =
-        object : ViewTreeObserver.OnPreDrawListener {
-
-            @SuppressLint("ClassVerificationFailure")
-            override fun onPreDraw(): Boolean {
-                val decorView = decorViewRef.get()
-                val frameStart = getFrameStartTime()
-                decorView?.let {
-                    decorView.handler.sendMessageAtFrontOfQueue(
-                        Message.obtain(decorView.handler) {
-                            val now = System.nanoTime()
-                            val expectedDuration = getExpectedFrameDuration(decorView) *
-                                jankStats.jankHeuristicMultiplier
-                            jankStats.logFrameData(
-                                frameStart,
-                                now - frameStart,
-                                expectedDuration.toLong()
-                            )
-                        }.apply {
-                            setMessageAsynchronicity(this)
-                        }
-                    )
-                }
-                return true
-            }
+    /**
+     * Each JankStats instance has its own listener for per-frame metric data.
+     * But we use a single listener (using OnPreDraw events prior to API 24) to gather
+     * the frame data, and then delegate that information to all instances.
+     * OnFrameListenerDelegate is the object that the per-frame data is delegated to,
+     * which forwards it to the JankStats instances.
+     */
+    private val onFrameListenerDelegate = object : OnFrameListenerDelegate() {
+        override fun onFrame(startTime: Long, actualDuration: Long, expectedDuration: Long) {
+            jankStats.logFrameData(
+                startTime,
+                actualDuration,
+                (expectedDuration * jankStats.jankHeuristicMultiplier).toLong()
+            )
         }
-
-    // Noop prior to API 22
-    internal open fun setMessageAsynchronicity(message: Message) {}
+    }
 
     override fun setupFrameTimer(enable: Boolean) {
         val decorView = decorViewRef.get()
         decorView?.let {
             if (enable) {
-                viewTreeObserver = it.viewTreeObserver
-                viewTreeObserver.addOnPreDrawListener(onPreDrawListener)
+                val delegates = decorView.getOrCreateOnPreDrawListenerDelegates()
+                delegates.add(onFrameListenerDelegate)
             } else {
-                // TODO: make sure we actually init it first
-                viewTreeObserver.removeOnPreDrawListener(onPreDrawListener)
+                decorView.removeOnPreDrawListenerDelegate(onFrameListenerDelegate)
             }
         }
     }
 
-    internal open fun getFrameStartTime(): Long {
+    private fun View.removeOnPreDrawListenerDelegate(delegate: OnFrameListenerDelegate) {
+        setTag(R.id.metricsDelegator, null)
+        val delegator = getTag(R.id.metricsDelegator) as DelegatingOnPreDrawListener?
+        with(delegator?.delegates) {
+            this?.remove(delegate)
+            if (this?.size == 0) {
+                viewTreeObserver.removeOnPreDrawListener(delegator)
+                setTag(R.id.metricsDelegator, null)
+            }
+        }
+    }
+
+    /**
+     * This function returns the current list of OnPreDrawListener delegates.
+     * If no such list exists, it will create it and add a root listener that
+     * delegates to that list.
+     */
+    @RequiresApi(16)
+    private fun View.getOrCreateOnPreDrawListenerDelegates():
+        MutableList<OnFrameListenerDelegate> {
+        var delegator = getTag(R.id.metricsDelegator) as DelegatingOnPreDrawListener?
+        if (delegator == null) {
+            val delegates = mutableListOf<OnFrameListenerDelegate>()
+            delegator = createDelegatingOnDrawListener(this, choreographer, delegates)
+            viewTreeObserver.addOnPreDrawListener(delegator)
+            setTag(R.id.metricsDelegator, delegator)
+        }
+        return delegator.delegates
+    }
+
+    internal open fun createDelegatingOnDrawListener(
+        view: View,
+        choreographer: Choreographer,
+        delegates: MutableList<OnFrameListenerDelegate>
+    ): DelegatingOnPreDrawListener {
+        return DelegatingOnPreDrawListener(view, choreographer, delegates)
+    }
+
+    internal fun getFrameStartTime(): Long {
+        return DelegatingOnPreDrawListener.choreographerLastFrameTimeField.get(choreographer)
+            as Long
+    }
+
+    fun getExpectedFrameDuration(view: View?): Long {
+        return DelegatingOnPreDrawListener.getExpectedFrameDuration(view)
+    }
+}
+
+/**
+ * This class is used by DelegatingOnDrawListener, which calculates the frame timing values
+ * and calls all delegate listeners with that data.
+ */
+internal abstract class OnFrameListenerDelegate {
+    abstract fun onFrame(startTime: Long, actualDuration: Long, expectedDuration: Long)
+}
+
+/**
+ * There is only a single listener for OnPreDraw events, which are used to calculate frame
+ * timing details. This listener delegates to a list of OnFrameListenerDelegate objects,
+ * which do the work of sending that data to JankStats instance clients.
+ */
+@RequiresApi(16)
+internal open class DelegatingOnPreDrawListener(
+    decorView: View,
+    val choreographer: Choreographer,
+    val delegates: MutableList<OnFrameListenerDelegate>
+) : ViewTreeObserver.OnPreDrawListener {
+
+    val decorViewRef = WeakReference<View>(decorView)
+    val metricsStateHolder = PerformanceMetricsState.getForHierarchy(decorView)
+
+    override fun onPreDraw(): Boolean {
+        val decorView = decorViewRef.get()
+        with(decorView!!) {
+            val frameStart = getFrameStartTime()
+            decorView.let {
+                handler.sendMessage(
+                    Message.obtain(handler) {
+                        val now = System.nanoTime()
+                        val expectedDuration = getExpectedFrameDuration(decorView)
+                        for (delegate in delegates) {
+                            delegate.onFrame(frameStart, now - frameStart, expectedDuration)
+                        }
+                        metricsStateHolder.state?.cleanupSingleFrameStates()
+                    }.apply {
+                        setMessageAsynchronicity(this)
+                    }
+                )
+            }
+        }
+        return true
+    }
+
+    private fun getFrameStartTime(): Long {
         return choreographerLastFrameTimeField.get(choreographer) as Long
     }
 
-    @Suppress("deprecation") /* defaultDisplay */
-    fun getExpectedFrameDuration(view: View?): Long {
-        if (frameDuration < 0) {
-            var refreshRate = 60f
-            val window = if (view?.context is Activity) (view.context as Activity).window else null
-            if (window != null) {
-                val display = window.windowManager.defaultDisplay
-                refreshRate = display.refreshRate
-            }
-            if (refreshRate < 30f || refreshRate > 200f) {
-                // Account for faulty return values (including 0)
-                refreshRate = 60f
-            }
-            frameDuration = (1000 / refreshRate * NANOS_PER_MS).toLong()
-        }
-        return frameDuration
-    }
+    // Noop prior to API 22 - overridden in 22Impl subclass
+    internal open fun setMessageAsynchronicity(message: Message) {}
 
     companion object {
         val choreographerLastFrameTimeField: Field =
@@ -119,5 +180,25 @@
         init {
             choreographerLastFrameTimeField.isAccessible = true
         }
+
+        @Suppress("deprecation") /* defaultDisplay */
+        fun getExpectedFrameDuration(view: View?): Long {
+            if (JankStatsBaseImpl.frameDuration < 0) {
+                var refreshRate = 60f
+                val window = if (view?.context is Activity)
+                    (view.context as Activity).window else null
+                if (window != null) {
+                    val display = window.windowManager.defaultDisplay
+                    refreshRate = display.refreshRate
+                }
+                if (refreshRate < 30f || refreshRate > 200f) {
+                    // Account for faulty return values (including 0)
+                    refreshRate = 60f
+                }
+                JankStatsBaseImpl.frameDuration =
+                    (1000 / refreshRate * JankStatsBaseImpl.NANOS_PER_MS).toLong()
+            }
+            return JankStatsBaseImpl.frameDuration
+        }
     }
-}
\ No newline at end of file
+}
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi22Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi22Impl.kt
index cb40c46..679268a 100644
--- a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi22Impl.kt
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi22Impl.kt
@@ -17,6 +17,7 @@
 package androidx.metrics.performance
 
 import android.os.Message
+import android.view.Choreographer
 import android.view.View
 import androidx.annotation.RequiresApi
 
@@ -29,6 +30,22 @@
     view: View
 ) : JankStatsApi16Impl(jankStats, view) {
 
+    override fun createDelegatingOnDrawListener(
+        view: View,
+        choreographer: Choreographer,
+        delegates: MutableList<OnFrameListenerDelegate>
+    ): DelegatingOnPreDrawListener {
+        return DelegatingOnPreDrawListener22(view, choreographer, delegates)
+    }
+}
+
+@RequiresApi(22)
+internal class DelegatingOnPreDrawListener22(
+    decorView: View,
+    choreographer: Choreographer,
+    delegates: MutableList<OnFrameListenerDelegate>
+) : DelegatingOnPreDrawListener(decorView, choreographer, delegates) {
+
     override fun setMessageAsynchronicity(message: Message) {
         message.isAsynchronous = true
     }
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi24Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi24Impl.kt
index b42536c..1d9bf39 100644
--- a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi24Impl.kt
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi24Impl.kt
@@ -43,7 +43,7 @@
     // Used to avoid problems with data gathered before things are set up
     var listenerAddedTime: Long = 0
 
-    private val frameMetricsAvailableListener: Window.OnFrameMetricsAvailableListener =
+    private val frameMetricsAvailableListenerDelegate: Window.OnFrameMetricsAvailableListener =
         Window.OnFrameMetricsAvailableListener { _, frameMetrics, _ ->
             val startTime = getFrameStartTime(frameMetrics)
             // ignore historical data gathered before we started listening
@@ -75,26 +75,89 @@
         window.let {
             if (enable) {
                 if (listenerAddedTime == 0L) {
-                    if (frameMetricsHandler == null) {
-                        val thread = HandlerThread("FrameMetricsAggregator")
-                        thread.start()
-                        frameMetricsHandler = Handler(thread.looper)
-                    }
-                    // Already added, no need to do it again
-                    window.addOnFrameMetricsAvailableListener(
-                        frameMetricsAvailableListener,
-                        frameMetricsHandler
-                    )
+                    val delegates = window.getOrCreateFrameMetricsListenerDelegates()
+                    delegates.add(frameMetricsAvailableListenerDelegate)
                     listenerAddedTime = System.nanoTime()
                 }
             } else {
-                window.removeOnFrameMetricsAvailableListener(frameMetricsAvailableListener)
+                window.removeFrameMetricsListenerDelegate(frameMetricsAvailableListenerDelegate)
                 listenerAddedTime = 0
             }
         }
     }
 
     companion object {
-        private var frameMetricsHandler: Handler? = null
+        // Need a Handler for FrameMetricsListener; just use a singleton, no need for Thread
+        // overhead per JankStats instance
+        internal var frameMetricsHandler: Handler? = null
     }
-}
\ No newline at end of file
+
+    @RequiresApi(24)
+    private fun Window.removeFrameMetricsListenerDelegate(
+        delegate: Window.OnFrameMetricsAvailableListener
+    ) {
+        val delegator = decorView.getTag(R.id.metricsDelegator) as
+            DelegatingFrameMetricsListener?
+        with(delegator?.delegates) {
+            this?.remove(delegate)
+            if (this?.size == 0) {
+                removeOnFrameMetricsAvailableListener(delegator)
+                decorView.setTag(R.id.metricsDelegator, null)
+            }
+        }
+    }
+
+    /**
+     * This function returns the current list of FrameMetricsListener delegates.
+     * If no such list exists, it will create it, and add a root listener which
+     * delegates to that list.
+     */
+    @RequiresApi(24)
+    private fun Window.getOrCreateFrameMetricsListenerDelegates():
+        MutableList<Window.OnFrameMetricsAvailableListener> {
+        var delegator = decorView.getTag(R.id.metricsDelegator) as
+            DelegatingFrameMetricsListener?
+        if (delegator == null) {
+            var delegates = mutableListOf<Window.OnFrameMetricsAvailableListener>()
+            delegator = DelegatingFrameMetricsListener(delegates)
+            // First listener for this window; create the delegates list and
+            // add a listener to the window
+            if (JankStatsApi24Impl.frameMetricsHandler == null) {
+                val thread = HandlerThread("FrameMetricsAggregator")
+                thread.start()
+                JankStatsApi24Impl.frameMetricsHandler = Handler(thread.looper)
+            }
+            addOnFrameMetricsAvailableListener(delegator,
+                JankStatsApi24Impl.frameMetricsHandler
+            )
+            decorView.setTag(R.id.metricsDelegator, delegator)
+        }
+        return delegator.delegates
+    }
+}
+
+/**
+ * To avoid having multiple frame metrics listeners for a given window (if the client
+ * creates multiple JankStats instances on that window), we use a single listener and
+ * delegate out to the multiple listeners provided by the client. This single instance
+ * and the list of delegates are cached in view tags in the DecorView for the window.
+ */
+@RequiresApi(24)
+private class DelegatingFrameMetricsListener(
+    val delegates: MutableList<Window.OnFrameMetricsAvailableListener>
+) : Window.OnFrameMetricsAvailableListener {
+    override fun onFrameMetricsAvailable(
+        window: Window?,
+        frameMetrics: FrameMetrics?,
+        dropCount: Int
+    ) {
+        for (delegate in delegates) {
+            delegate.onFrameMetricsAvailable(window, frameMetrics, dropCount)
+        }
+        // Remove singleFrame states now that we are done processing this frame
+        if (window?.decorView != null) {
+            val holder = PerformanceMetricsState.getForHierarchy(window.decorView)
+            holder.state?.cleanupSingleFrameStates()
+        }
+    }
+}
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/PerformanceMetricsState.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/PerformanceMetricsState.kt
index 7fd81fc..84a86e9 100644
--- a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/PerformanceMetricsState.kt
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/PerformanceMetricsState.kt
@@ -66,10 +66,7 @@
             // also, if state end time < vsync, delete it
             val item = activeStates[i]
             if (item.timeRemoved > 0 && item.timeRemoved < frameStartTime) {
-                /*
-                Note that we are silently removing states that have already
-                been marked for removal.
-                 */
+                // remove states that have already been marked for removal
                 activeStates.removeAt(i)
             } else if (item.timeAdded < frameEndTime) {
                 // Only add unique state. There may be several states added in
@@ -78,10 +75,6 @@
                 if (item.state !in frameStates) {
                     frameStates.add(item.state)
                 }
-                // Single-frame states should only be reported once
-                if (activeStates == singleFrameStates) {
-                    activeStates.removeAt(i)
-                }
             }
         }
     }
@@ -237,14 +230,17 @@
             )
             addFrameState(startTime, endTime, frameStates, states)
             addFrameState(startTime, endTime, frameStates, singleFrameStates)
-            // Remove any states intended for just one frame
-            for (state in singleFrameStates) {
-                markSingleFrameStateForRemoval(state.state.stateName)
-            }
         }
         return frameStates
     }
 
+    internal fun cleanupSingleFrameStates() {
+        synchronized(singleFrameStates) {
+            // Remove all states intended for just one frame
+            singleFrameStates.clear()
+        }
+    }
+
     companion object {
 
         /**
diff --git a/metrics/metrics-performance/src/main/res/values/ids.xml b/metrics/metrics-performance/src/main/res/values/ids.xml
index 87f2a3a..b20da1c 100644
--- a/metrics/metrics-performance/src/main/res/values/ids.xml
+++ b/metrics/metrics-performance/src/main/res/values/ids.xml
@@ -16,4 +16,5 @@
 
 <resources>
     <item type="id" name="metricsStateHolder"/>
+    <item type="id" name="metricsDelegator"/>
 </resources>
\ No newline at end of file
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt
index 587b598..081ef29 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.kt
@@ -16,6 +16,7 @@
 package androidx.navigation.fragment
 
 import android.content.Context
+import android.content.ContextWrapper
 import android.os.Bundle
 import android.util.AttributeSet
 import android.view.LayoutInflater
@@ -112,15 +113,19 @@
 
     @CallSuper
     public override fun onCreate(savedInstanceState: Bundle?) {
-        val context = requireContext()
+        var context = requireContext()
         navHostController = NavHostController(context)
         navHostController!!.setLifecycleOwner(this)
-        if (context is OnBackPressedDispatcherOwner) {
-            navHostController!!.setOnBackPressedDispatcher(
-                (context as OnBackPressedDispatcherOwner).onBackPressedDispatcher
-            )
-            // Otherwise, caller must register a dispatcher on the controller explicitly
-            // by overriding onCreateNavHostController()
+        while (context is ContextWrapper) {
+            if (context is OnBackPressedDispatcherOwner) {
+                navHostController!!.setOnBackPressedDispatcher(
+                    (context as OnBackPressedDispatcherOwner).onBackPressedDispatcher
+                )
+                // Otherwise, caller must register a dispatcher on the controller explicitly
+                // by overriding onCreateNavHostController()
+                break
+            }
+            context = context.baseContext
         }
         // Set the default state - this will be updated whenever
         // onPrimaryNavigationFragmentChanged() is called
diff --git a/paging/paging-common/api/current.ignore b/paging/paging-common/api/current.ignore
new file mode 100644
index 0000000..8598937
--- /dev/null
+++ b/paging/paging-common/api/current.ignore
@@ -0,0 +1,11 @@
+// Baseline format: 1.0
+RemovedClass: androidx.paging.CancelableChannelFlowKt:
+    Removed class androidx.paging.CancelableChannelFlowKt
+RemovedClass: androidx.paging.FlowExtKt:
+    Removed class androidx.paging.FlowExtKt
+RemovedClass: androidx.paging.HintHandlerKt:
+    Removed class androidx.paging.HintHandlerKt
+RemovedClass: androidx.paging.PageFetcherSnapshotKt:
+    Removed class androidx.paging.PageFetcherSnapshotKt
+RemovedClass: androidx.paging.SimpleChannelFlowKt:
+    Removed class androidx.paging.SimpleChannelFlowKt
diff --git a/paging/paging-common/api/current.txt b/paging/paging-common/api/current.txt
index b2de2a8..fb4ec53 100644
--- a/paging/paging-common/api/current.txt
+++ b/paging/paging-common/api/current.txt
@@ -5,9 +5,6 @@
     method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
   }
 
-  public final class CancelableChannelFlowKt {
-  }
-
   public final class CombinedLoadStates {
     ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
     method public androidx.paging.LoadState getAppend();
@@ -49,12 +46,6 @@
     method @AnyThread public void onInvalidated();
   }
 
-  public final class FlowExtKt {
-  }
-
-  public final class HintHandlerKt {
-  }
-
   public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
     ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
     method public void invalidate();
@@ -148,9 +139,6 @@
     enum_constant public static final androidx.paging.LoadType REFRESH;
   }
 
-  public final class PageFetcherSnapshotKt {
-  }
-
   @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
     ctor @Deprecated public PageKeyedDataSource();
     method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
@@ -476,9 +464,6 @@
   public final class SeparatorsKt {
   }
 
-  public final class SimpleChannelFlowKt {
-  }
-
   public enum TerminalSeparatorType {
     enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
     enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
@@ -486,10 +471,3 @@
 
 }
 
-package androidx.paging.internal {
-
-  public final class ConstantsKt {
-  }
-
-}
-
diff --git a/paging/paging-common/api/public_plus_experimental_current.txt b/paging/paging-common/api/public_plus_experimental_current.txt
index 4db4b0f..d95a8a5 100644
--- a/paging/paging-common/api/public_plus_experimental_current.txt
+++ b/paging/paging-common/api/public_plus_experimental_current.txt
@@ -5,9 +5,6 @@
     method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
   }
 
-  public final class CancelableChannelFlowKt {
-  }
-
   public final class CombinedLoadStates {
     ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
     method public androidx.paging.LoadState getAppend();
@@ -52,12 +49,6 @@
   @kotlin.RequiresOptIn public @interface ExperimentalPagingApi {
   }
 
-  public final class FlowExtKt {
-  }
-
-  public final class HintHandlerKt {
-  }
-
   public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
     ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
     method public void invalidate();
@@ -151,9 +142,6 @@
     enum_constant public static final androidx.paging.LoadType REFRESH;
   }
 
-  public final class PageFetcherSnapshotKt {
-  }
-
   @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
     ctor @Deprecated public PageKeyedDataSource();
     method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
@@ -506,9 +494,6 @@
   public final class SeparatorsKt {
   }
 
-  public final class SimpleChannelFlowKt {
-  }
-
   public enum TerminalSeparatorType {
     enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
     enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
@@ -516,10 +501,3 @@
 
 }
 
-package androidx.paging.internal {
-
-  public final class ConstantsKt {
-  }
-
-}
-
diff --git a/paging/paging-common/api/restricted_current.ignore b/paging/paging-common/api/restricted_current.ignore
new file mode 100644
index 0000000..8598937
--- /dev/null
+++ b/paging/paging-common/api/restricted_current.ignore
@@ -0,0 +1,11 @@
+// Baseline format: 1.0
+RemovedClass: androidx.paging.CancelableChannelFlowKt:
+    Removed class androidx.paging.CancelableChannelFlowKt
+RemovedClass: androidx.paging.FlowExtKt:
+    Removed class androidx.paging.FlowExtKt
+RemovedClass: androidx.paging.HintHandlerKt:
+    Removed class androidx.paging.HintHandlerKt
+RemovedClass: androidx.paging.PageFetcherSnapshotKt:
+    Removed class androidx.paging.PageFetcherSnapshotKt
+RemovedClass: androidx.paging.SimpleChannelFlowKt:
+    Removed class androidx.paging.SimpleChannelFlowKt
diff --git a/paging/paging-common/api/restricted_current.txt b/paging/paging-common/api/restricted_current.txt
index b2de2a8..fb4ec53 100644
--- a/paging/paging-common/api/restricted_current.txt
+++ b/paging/paging-common/api/restricted_current.txt
@@ -5,9 +5,6 @@
     method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
   }
 
-  public final class CancelableChannelFlowKt {
-  }
-
   public final class CombinedLoadStates {
     ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
     method public androidx.paging.LoadState getAppend();
@@ -49,12 +46,6 @@
     method @AnyThread public void onInvalidated();
   }
 
-  public final class FlowExtKt {
-  }
-
-  public final class HintHandlerKt {
-  }
-
   public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
     ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
     method public void invalidate();
@@ -148,9 +139,6 @@
     enum_constant public static final androidx.paging.LoadType REFRESH;
   }
 
-  public final class PageFetcherSnapshotKt {
-  }
-
   @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
     ctor @Deprecated public PageKeyedDataSource();
     method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
@@ -476,9 +464,6 @@
   public final class SeparatorsKt {
   }
 
-  public final class SimpleChannelFlowKt {
-  }
-
   public enum TerminalSeparatorType {
     enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
     enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
@@ -486,10 +471,3 @@
 
 }
 
-package androidx.paging.internal {
-
-  public final class ConstantsKt {
-  }
-
-}
-
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/CancelableChannelFlow.kt b/paging/paging-common/src/main/kotlin/androidx/paging/CancelableChannelFlow.kt
index af4b46d..5c31c25 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/CancelableChannelFlow.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/CancelableChannelFlow.kt
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
 package androidx.paging
 
+import androidx.annotation.RestrictTo
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.flow.Flow
 
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/FlowExt.kt b/paging/paging-common/src/main/kotlin/androidx/paging/FlowExt.kt
index a43c89b..9cd5e14 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/FlowExt.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/FlowExt.kt
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
 package androidx.paging
 
+import androidx.annotation.RestrictTo
 import androidx.paging.CombineSource.INITIAL
 import androidx.paging.CombineSource.OTHER
 import androidx.paging.CombineSource.RECEIVER
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/HintHandler.kt b/paging/paging-common/src/main/kotlin/androidx/paging/HintHandler.kt
index f5990a6..cefabc2 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/HintHandler.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/HintHandler.kt
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
 package androidx.paging
 
+import androidx.annotation.RestrictTo
 import androidx.paging.LoadType.APPEND
 import androidx.paging.LoadType.PREPEND
 import kotlinx.coroutines.channels.BufferOverflow
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
index 34e06f5..937f47f 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
 package androidx.paging
 
+import androidx.annotation.RestrictTo
 import androidx.annotation.VisibleForTesting
 import androidx.paging.LoadState.Error
 import androidx.paging.LoadState.Loading
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/SimpleChannelFlow.kt b/paging/paging-common/src/main/kotlin/androidx/paging/SimpleChannelFlow.kt
index 13be536..75ab293 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/SimpleChannelFlow.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/SimpleChannelFlow.kt
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
 package androidx.paging
 
+import androidx.annotation.RestrictTo
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.channels.Channel
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/internal/Constants.kt b/paging/paging-common/src/main/kotlin/androidx/paging/internal/Constants.kt
index 514e190..7875b70 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/internal/Constants.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/internal/Constants.kt
@@ -14,6 +14,10 @@
  * limitations under the License.
  */
 
+@file:RestrictTo(RestrictTo.Scope.LIBRARY)
+
 package androidx.paging.internal
 
+import androidx.annotation.RestrictTo
+
 internal const val BUGANIZER_URL = "https://issuetracker.google.com/issues/new?component=413106"
\ No newline at end of file
diff --git a/playground-common/gradle/wrapper/gradle-wrapper.properties b/playground-common/gradle/wrapper/gradle-wrapper.properties
index 703adba..e750102 100644
--- a/playground-common/gradle/wrapper/gradle-wrapper.properties
+++ b/playground-common/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-rc-1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/DaoPrimitiveTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/DaoPrimitiveTest.kt
index 32368bd..80986a4 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/DaoPrimitiveTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/DaoPrimitiveTest.kt
@@ -41,6 +41,9 @@
     @Entity(tableName = "stringFoo")
     data class StringFoo(@PrimaryKey val id: String, val description: String)
 
+    @Entity(tableName = "byteArrayFoo")
+    data class ByteArrayFoo(@PrimaryKey val id: ByteArray, val description: String)
+
     /* Interface with generics only */
     interface BaseDao<Key, Value> {
 
@@ -73,6 +76,11 @@
         fun getFirstItemId(): String
     }
 
+    interface ByteArrayBaseDao<ByteArray, Value> {
+        @Query("select id from byteArrayFoo limit 1")
+        fun getByteArray(): Array<ByteArray>
+    }
+
     // Foo interfaces that are using the base
 
     @Dao
@@ -107,17 +115,29 @@
         override fun getFirstItemId(): String
     }
 
+    @Dao
+    interface ByteArrayFooDao : ByteArrayBaseDao<ByteArray, String> {
+
+        @Insert
+        fun insert(item: ByteArrayFoo)
+
+        @Query("select id from byteArrayFoo limit 1")
+        override fun getByteArray(): Array<ByteArray>
+    }
+
     @Database(
         version = 1,
         entities = [
             LongFoo::class,
-            StringFoo::class
+            StringFoo::class,
+            ByteArrayFoo::class
         ],
         exportSchema = false
     )
     abstract class TestDatabase : RoomDatabase() {
         abstract fun longFooDao(): LongFooDao
         abstract fun stringFooDao(): StringFooDao
+        abstract fun byteArrayFooDao(): ByteArrayFooDao
     }
 
     @Test
@@ -151,4 +171,16 @@
         db.stringFooDao().delete("Key")
         assertThat(db.stringFooDao().getItem("Key")).isNull()
     }
+
+    @Test
+    fun testByteArrayFooDao() {
+        val db = Room.inMemoryDatabaseBuilder(
+            InstrumentationRegistry.getInstrumentation()
+                .getTargetContext(),
+            TestDatabase::class.java
+        ).build()
+        val foo = ByteArrayFoo(ByteArray(16), "Elif")
+        db.byteArrayFooDao().insert(foo)
+        assertThat(db.byteArrayFooDao().getByteArray()).isEqualTo(arrayOf(ByteArray(16)))
+    }
 }
\ No newline at end of file
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/JvmNameInDaoTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/JvmNameInDaoTest.kt
new file mode 100644
index 0000000..d4f970b
--- /dev/null
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/JvmNameInDaoTest.kt
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.room.androidx.room.integration.kotlintestapp.test
+
+import androidx.room.Dao
+import androidx.room.Database
+import androidx.room.Delete
+import androidx.room.Entity
+import androidx.room.Insert
+import androidx.room.PrimaryKey
+import androidx.room.Query
+import androidx.room.Room
+import androidx.room.RoomDatabase
+import androidx.room.TypeConverter
+import androidx.room.TypeConverters
+import androidx.test.core.app.ApplicationProvider
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+/**
+ * This test has JvmName annotation on @Dao declarations to ensure Room properly handles them.
+ *
+ * If this this test fails because of the  `INAPPLICABLE_JVM_NAME` suppression, we can disable the
+ * test if needed. We should not try too hard to support cases when developer disables a compiler
+ * error.
+ */
+class JvmNameInDaoTest {
+    @Test
+    fun test() {
+        val entity = JvmNameEntity(
+            id = 1,
+            name = "value1",
+            convertedClass = MyConvertedClass("value2")
+        )
+        val db = Room.inMemoryDatabaseBuilder(
+            ApplicationProvider.getApplicationContext(),
+            JvmNameDb::class.java
+        ).build()
+        try {
+            db.dao.insert(entity)
+            assertThat(
+                db.dao.query()
+            ).containsExactly(entity)
+            db.dao.delete(entity)
+            assertThat(
+                db.dao.query()
+            ).isEmpty()
+        } finally {
+            db.close()
+        }
+    }
+
+    data class MyConvertedClass(
+        val value: String
+    )
+
+    object MyConverterConverter {
+        @TypeConverter
+        @JvmName("jvmToDb")
+        fun toDb(value: MyConvertedClass): String = value.value
+
+        @TypeConverter
+        @JvmName("jvmFromDb")
+        fun fromDb(value: String): MyConvertedClass = MyConvertedClass(value)
+    }
+
+    @Entity
+    data class JvmNameEntity(
+        @PrimaryKey(autoGenerate = true)
+        val id: Int,
+        val name: String,
+        val convertedClass: MyConvertedClass
+    )
+
+    @Dao
+    interface JvmBaseDao<T> {
+        @Delete
+        @Suppress("INAPPLICABLE_JVM_NAME")
+        @JvmName("jvmDelete")
+        fun delete(t: T)
+
+        @Delete
+        fun overriddenJvmDelete(t: T)
+    }
+
+    @Dao
+    interface JvmNameDao : JvmBaseDao<JvmNameEntity> {
+        @Insert
+        @Suppress("INAPPLICABLE_JVM_NAME")
+        @JvmName("jvmInsert")
+        fun insert(entity: JvmNameEntity)
+
+        @Suppress("INAPPLICABLE_JVM_NAME")
+        @JvmName("jvmQuery")
+        @Query("SELECT * FROM JvmNameEntity")
+        fun query(): List<JvmNameEntity>
+
+        // This will generate two methods for `overriddenJvmDelete`, which is not
+        // supported in KSP. Keeping this code here as an ack that this is WAI.
+        // @Suppress("INAPPLICABLE_JVM_NAME")
+        // @JvmName("jvmDeleteChild")
+        @Delete
+        override fun overriddenJvmDelete(t: JvmNameEntity)
+    }
+
+    @Database(entities = [JvmNameEntity::class], exportSchema = false, version = 1)
+    @TypeConverters(MyConverterConverter::class)
+    abstract class JvmNameDb : RoomDatabase() {
+        @Suppress("INAPPLICABLE_JVM_NAME")
+        @get:JvmName("jvmDao")
+        abstract val dao: JvmNameDao
+    }
+}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt
index 227a69a..f0027c5 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt
@@ -51,7 +51,10 @@
     xTypeElement: XTypeElement
 ): Sequence<XMethodElement> {
     return sequence {
-        // group methods by name for faster override checks
+        // group methods by name for faster override checks. Note that we are using name here
+        // instead of jvmName because resolving jvmName is expensive and @JvmName is not allowed on
+        // overriding methods or open methods (unless suppressed, which we don't support).
+        // As a result of this, name is as good as jvmName for grouping.
         val methodsByName = mutableMapOf<String, LinkedHashSet<XMethodElement>>()
         val visitedInterfaces = mutableSetOf<XTypeElement>()
         fun collectAllMethodsByName(type: XTypeElement) {
@@ -69,14 +72,16 @@
             // Finally, visit all methods declared in this type.
             if (type == xTypeElement) {
                 type.getDeclaredMethods().forEach {
-                    methodsByName.getOrPut(it.jvmName) { linkedSetOf() }.add(it)
+                    methodsByName.getOrPut(it.name) { linkedSetOf() }.add(it)
                 }
             } else {
                 type.getDeclaredMethods()
                     .filter { it.isAccessibleFrom(type.packageName) }
                     .filterNot { it.isStaticInterfaceMethod() }
                     .map { it.copyTo(xTypeElement) }
-                    .forEach { methodsByName.getOrPut(it.jvmName) { linkedSetOf() }.add(it) }
+                    .forEach {
+                        methodsByName.getOrPut(it.name) { linkedSetOf() }.add(it)
+                    }
             }
         }
         collectAllMethodsByName(xTypeElement)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
index e541a17..5aef173 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
@@ -108,7 +108,7 @@
     fun isAnnotationClass(): Boolean
 
     /**
-     * Returns `true` if this [XTypeElement] is a non-companion `object` in Kotlin
+     * Returns `true` if this [XTypeElement] is an `object` or `companion object` in Kotlin
      */
     fun isKotlinObject(): Boolean
 
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
index 339f5c7..5d319c9 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
@@ -90,7 +90,8 @@
         return _declaredFields
     }
 
-    override fun isKotlinObject() = kotlinMetadata?.isObject() == true
+    override fun isKotlinObject() = kotlinMetadata?.isObject() == true ||
+            kotlinMetadata?.isCompanionObject() == true
     override fun isCompanionObject() = kotlinMetadata?.isCompanionObject() == true
     override fun isDataClass() = kotlinMetadata?.isDataClass() == true
     override fun isValueClass() = kotlinMetadata?.isValueClass() == true
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/ResolverExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/ResolverExt.kt
index 35daded..21df2cf 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/ResolverExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/ResolverExt.kt
@@ -57,10 +57,7 @@
     if (overriderElement.parameters.size != overrideeElement.parameters.size) {
         return false
     }
-    // do a quick check on name before doing the more expensive operations
-    if (overriderElement.jvmName != overrideeElement.jvmName) {
-        return false
-    }
+
     val ksOverrider = overriderElement.getDeclarationForOverride()
     val ksOverridee = overrideeElement.getDeclarationForOverride()
     if (overrides(ksOverrider, ksOverridee)) {
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
index 6793e2e8..5970140 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
@@ -174,8 +174,9 @@
         runProcessorTest(sources = listOf(src)) { invocation ->
             invocation.processingEnv.requireTypeElement("foo.bar.Baz").let {
                 assertThat(it.superInterfaces).hasSize(1)
-                val superInterface = it.superInterfaces.first {
-                        type -> type.rawType.toString() == "foo.bar.MyInterface" }
+                val superInterface = it.superInterfaces.first { type ->
+                    type.rawType.toString() == "foo.bar.MyInterface"
+                }
                 assertThat(superInterface.typeArguments).hasSize(1)
                 assertThat(superInterface.typeArguments[0].typeName)
                     .isEqualTo(ClassName.get("java.lang", "String"))
@@ -912,6 +913,70 @@
         }
     }
 
+    /**
+     * When JvmNames is used along with a suppression over the error, the behavior becomes
+     * complicated. Normally, JvmName annotation is not allowed in overrides and open methods, yet
+     * developers can still use it by putting a suppression over it. The compiler will generate a
+     * delegating method in these cases in the .class file, yet in KSP, we don't really see that
+     * method (also shouldn't ideally).
+     *
+     * This test is here to acknowledge that the behavior is inconsistent yet working as intended
+     * from XProcessing's perspective.
+     *
+     * Also see: https://youtrack.jetbrains.com/issue/KT-50782 as a sign why this suppression is
+     * not worth supporting :).
+     */
+    @Test
+    fun allMethods_withJvmNames() {
+        fun buildSource(pkg: String) = listOf(
+            Source.kotlin(
+                "Foo.kt",
+                """
+                package $pkg
+                interface Interface {
+                    fun f1()
+                    @JvmName("notF2")
+                    @Suppress("INAPPLICABLE_JVM_NAME")
+                    fun f2()
+                }
+                abstract class Subject : Interface {
+                    @JvmName("notF1")
+                    @Suppress("INAPPLICABLE_JVM_NAME")
+                    override fun f1() {
+                    }
+                }
+            """.trimIndent()
+            )
+        )
+
+        runProcessorTest(
+            sources = buildSource("app"),
+            classpath = compileFiles(buildSource("lib"))
+        ) { invocation ->
+            listOf("app", "lib").forEach {
+                val appSubject = invocation.processingEnv.requireTypeElement("$it.Subject")
+                val methodNames = appSubject.getAllMethods().map { it.name }.toList()
+                val methodJvmNames = appSubject.getAllMethods().map { it.jvmName }.toList()
+                val objectMethodNames = invocation.objectMethodNames()
+                if (invocation.isKsp) {
+                    assertThat(methodNames - objectMethodNames).containsExactly(
+                        "f1", "f2"
+                    )
+                    assertThat(methodJvmNames - objectMethodNames).containsExactly(
+                        "notF1", "notF2"
+                    )
+                } else {
+                    assertThat(methodNames - objectMethodNames).containsExactly(
+                        "f1", "f1", "f2"
+                    )
+                    assertThat(methodJvmNames - objectMethodNames).containsExactly(
+                        "f1", "notF1", "notF2"
+                    )
+                }
+            }
+        }
+    }
+
     @Test
     fun gettersSetters() {
         val src = Source.kotlin(
@@ -1375,6 +1440,30 @@
         }
     }
 
+    @Test
+    fun kotlinObjects() {
+        val kotlinSrc = Source.kotlin(
+            "Test.kt",
+            """
+            package foo.bar
+            class KotlinClass {
+                companion object
+                object NestedObject
+            }
+            """.trimIndent()
+        )
+        runProcessorTest(listOf(kotlinSrc)) { invocation ->
+            val kotlinClass = invocation.processingEnv.requireTypeElement(
+                "foo.bar.KotlinClass")
+            val companionObjects = kotlinClass.getEnclosedTypeElements().filter {
+                it.isCompanionObject()
+            }
+            assertThat(companionObjects.size).isEqualTo(1)
+            val companionObj = companionObjects.first()
+            assertThat(companionObj.isKotlinObject()).isTrue()
+        }
+    }
+
     /**
      * it is good to exclude methods coming from Object when testing as they differ between KSP
      * and KAPT but irrelevant for Room.
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/profiling/GetMethodsScenarioTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/profiling/GetMethodsScenarioTest.kt
index 595c81b..ec1b072 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/profiling/GetMethodsScenarioTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/profiling/GetMethodsScenarioTest.kt
@@ -28,7 +28,25 @@
     val profileRule = ProfileRule()
 
     @Test
-    fun keepInline_declaredMethods() {
+    fun allMethods_keepInline() {
+        profileAllMethods(
+            XProcessingEnvConfig.DEFAULT.copy(
+                excludeMethodsWithInvalidJvmSourceNames = false
+            )
+        )
+    }
+
+    @Test
+    fun allMethods_filterOutInline() {
+        profileAllMethods(
+            XProcessingEnvConfig.DEFAULT.copy(
+                excludeMethodsWithInvalidJvmSourceNames = true
+            )
+        )
+    }
+
+    @Test
+    fun declaredMethods_keepInline() {
         profileDeclaredMethods(
             XProcessingEnvConfig.DEFAULT.copy(
                 excludeMethodsWithInvalidJvmSourceNames = false
@@ -37,7 +55,7 @@
     }
 
     @Test
-    fun filterOutInline_declaredMethods() {
+    fun declaredMethods_filterOutInline() {
         profileDeclaredMethods(
             XProcessingEnvConfig.DEFAULT.copy(
                 excludeMethodsWithInvalidJvmSourceNames = true
@@ -46,7 +64,7 @@
     }
 
     @Test
-    fun keepInline_enclosedElements() {
+    fun enclosedElements_keepInline() {
         profileEnclosedElements(
             XProcessingEnvConfig.DEFAULT.copy(
                 excludeMethodsWithInvalidJvmSourceNames = false
@@ -55,7 +73,7 @@
     }
 
     @Test
-    fun filterOutInline_enclosedElements() {
+    fun enclosedElements_filterOutInline() {
         profileEnclosedElements(
             XProcessingEnvConfig.DEFAULT.copy(
                 excludeMethodsWithInvalidJvmSourceNames = true
@@ -63,6 +81,12 @@
         )
     }
 
+    private fun profileAllMethods(processingConfig: XProcessingEnvConfig) {
+        profile(processingConfig) {
+            getAllMethods().toList()
+        }
+    }
+
     private fun profileDeclaredMethods(processingConfig: XProcessingEnvConfig) {
         profile(processingConfig) {
             getDeclaredMethods().toList()
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
index c944130..0a4a532 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
@@ -31,6 +31,7 @@
 import androidx.room.vo.Dao
 import androidx.room.vo.KotlinBoxedPrimitiveMethodDelegate
 import androidx.room.vo.KotlinDefaultMethodDelegate
+import androidx.room.vo.Warning
 
 class DaoProcessor(
     baseContext: Context,
@@ -83,6 +84,13 @@
                     PROCESSED_ANNOTATIONS.count { method.hasAnnotation(it) } <= 1, method,
                     ProcessorErrors.INVALID_ANNOTATION_COUNT_IN_DAO_METHOD
                 )
+                if (method.hasAnnotation(JvmName::class)) {
+                    context.logger.w(
+                        Warning.JVM_NAME_ON_OVERRIDDEN_METHOD,
+                        method,
+                        ProcessorErrors.JVM_NAME_ON_OVERRIDDEN_METHOD
+                    )
+                }
                 if (method.hasAnnotation(Query::class)) {
                     Query::class
                 } else if (method.hasAnnotation(Insert::class)) {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index 8ad1fd4..8fcba1b 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -38,6 +38,7 @@
 import androidx.room.vo.DatabaseView
 import androidx.room.vo.Entity
 import androidx.room.vo.FtsEntity
+import androidx.room.vo.Warning
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
 import com.squareup.javapoet.TypeName
@@ -105,6 +106,13 @@
                 )
                 null
             } else {
+                if (executable.hasAnnotation(JvmName::class)) {
+                    context.logger.w(
+                        Warning.JVM_NAME_ON_OVERRIDDEN_METHOD,
+                        executable,
+                        ProcessorErrors.JVM_NAME_ON_OVERRIDDEN_METHOD
+                    )
+                }
                 val dao = DaoProcessor(context, daoElement, declaredType, dbVerifier)
                     .process()
                 DaoMethod(executable, dao)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
index 283c92d..c48afce 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
@@ -1025,4 +1025,8 @@
     val AUTOMIGRATION_SPEC_MISSING_NOARG_CONSTRUCTOR = "Classes that are used as " +
         "AutoMigrationSpec " +
         "implementations must have no-argument public constructors."
+
+    val JVM_NAME_ON_OVERRIDDEN_METHOD = "Using @JvmName annotation on a function or accessor " +
+        "that will be overridden by Room is not supported. If this is important for your use " +
+        "case, please file a bug at $ISSUE_TRACKER_LINK with details."
 }
\ No newline at end of file
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
index 88cdd1a..cb5b392b 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.solver.query.result
 
+import androidx.room.compiler.processing.isArray
 import androidx.room.ext.L
 import androidx.room.ext.T
 import androidx.room.solver.CodeGenScope
@@ -31,10 +32,19 @@
             rowAdapter.onCursorReady(cursorVarName, scope)
 
             val arrayType = ArrayTypeName.of(type.typeName)
-            addStatement(
-                "final $T $L = new $T[$L.getCount()]",
-                arrayType, outVarName, type.typeName, cursorVarName
-            )
+
+            if (type.isArray()) {
+                addStatement(
+                    "final $T $L = new $T[$L.getCount()][]",
+                    arrayType, outVarName, type.componentType.typeName, cursorVarName
+                )
+            } else {
+                addStatement(
+                    "final $T $L = new $T[$L.getCount()]",
+                    arrayType, outVarName, type.typeName, cursorVarName
+                )
+            }
+
             val tmpVarName = scope.getTmpVar("_item")
             val indexVar = scope.getTmpVar("_index")
             addStatement("$T $L = 0", TypeName.INT, indexVar)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/vo/Warning.kt b/room/room-compiler/src/main/kotlin/androidx/room/vo/Warning.kt
index fc3bd6a..6574d67 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/vo/Warning.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/vo/Warning.kt
@@ -46,7 +46,9 @@
     MISMATCHED_SETTER_TYPE("ROOM_MISMATCHED_SETTER_TYPE"),
     // NOTE there is no constant for this in RoomWarnings since this is a temporary case until
     // expand projection is removed.
-    EXPAND_PROJECTION_WITH_REMOVE_UNUSED_COLUMNS("ROOM_EXPAND_PROJECTION_WITH_UNUSED_COLUMNS");
+    EXPAND_PROJECTION_WITH_REMOVE_UNUSED_COLUMNS("ROOM_EXPAND_PROJECTION_WITH_UNUSED_COLUMNS"),
+    // We shouldn't let devs suppress this error via Room so there is no runtime constant for it
+    JVM_NAME_ON_OVERRIDDEN_METHOD("ROOM_JVM_NAME_IN_OVERRIDDEN_METHOD");
 
     companion object {
         val PUBLIC_KEY_MAP = values().associateBy { it.publicKey }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
index 57c1b26..5ad5c50 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
@@ -410,6 +410,35 @@
         }
     }
 
+    @Test
+    fun jvmNameOnDao() {
+        val source = Source.kotlin("MyDao.kt", """
+            import androidx.room.*;
+            @Dao
+            interface MyDao {
+                @Suppress("INAPPLICABLE_JVM_NAME")
+                @JvmName("jvmMethodName")
+                @Query("SELECT 1")
+                fun method(): Int
+            }
+        """.trimIndent())
+        runProcessorTest(sources = listOf(source)) { invocation ->
+            val dao = invocation.processingEnv.requireTypeElement("MyDao")
+            val dbType = invocation.context.processingEnv.requireType(RoomTypeNames.ROOM_DB)
+            DaoProcessor(
+                baseContext = invocation.context,
+                element = dao,
+                dbType = dbType,
+                dbVerifier = null
+            ).process()
+            invocation.assertCompilationResult {
+                hasWarningContaining(
+                    ProcessorErrors.JVM_NAME_ON_OVERRIDDEN_METHOD
+                )
+            }
+        }
+    }
+
     private fun singleDao(
         vararg inputs: String,
         classpathFiles: List<File> = emptyList(),
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index 169bdf9..e0b669e 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -1437,6 +1437,39 @@
         ).isTrue()
     }
 
+    @Test
+    fun jvmNameOnDaoMethod() {
+        val jvmNameInDaoGetter = Source.kotlin(
+            "MyDb.kt",
+            """
+                package foo.bar;
+                import androidx.room.*;
+                @Dao
+                interface MyDao
+                @Entity
+                data class MyEntity(@PrimaryKey val id:Int)
+                @Database(version = 1, entities = [MyEntity::class])
+                abstract class MyDb: RoomDatabase() {
+                    @Suppress("INAPPLICABLE_JVM_NAME")
+                    @get:JvmName("jvmDao")
+                    abstract val dao: MyDao
+                }
+                """
+        )
+        runProcessorTest(sources = listOf(jvmNameInDaoGetter)) { invocation ->
+            val element = invocation.processingEnv.requireTypeElement("foo.bar.MyDb")
+            DatabaseProcessor(
+                baseContext = invocation.context,
+                element = element
+            ).process()
+            invocation.assertCompilationResult {
+                hasWarningContaining(
+                    ProcessorErrors.JVM_NAME_ON_OVERRIDDEN_METHOD
+                )
+            }
+        }
+    }
+
     private fun resolveDatabaseViews(
         views: Map<String, Set<String>>,
         body: (List<DatabaseView>, XTestInvocation) -> Unit
diff --git a/samples/Support4Demos/build.gradle b/samples/Support4Demos/build.gradle
index c857650..756cc36 100644
--- a/samples/Support4Demos/build.gradle
+++ b/samples/Support4Demos/build.gradle
@@ -7,7 +7,7 @@
 dependencies {
     implementation(project(":core:core"))
     implementation(project(":cursoradapter:cursoradapter"))
-    implementation(project(":localbroadcastmanager:localbroadcastmanager"))
+    implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")
     implementation(project(":slidingpanelayout:slidingpanelayout"))
     implementation(project(":swiperefreshlayout:swiperefreshlayout"))
     implementation(project(":fragment:fragment-ktx"))
diff --git a/settings.gradle b/settings.gradle
index 82f5026..86614bfd 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -64,18 +64,18 @@
             if (os.contains("mac os x") ||  os.contains("darwin") || os.contains("osx")) {
                 def arch = System.getProperty("os.arch")
                 if (arch == "aarch64") {
-                    currentOsArtifact = "skiko-jvm-runtime-macos-arm64"
+                    currentOsArtifact = "skiko-awt-runtime-macos-arm64"
                 } else {
-                    currentOsArtifact = "skiko-jvm-runtime-macos-x64"
+                    currentOsArtifact = "skiko-awt-runtime-macos-x64"
                 }
             } else if (os.startsWith("win")) {
-                currentOsArtifact = "skiko-jvm-runtime-windows-x64"
+                currentOsArtifact = "skiko-awt-runtime-windows-x64"
             } else if (os.startsWith("linux") ) {
                 def arch = System.getProperty("os.arch")
                 if (arch == "aarch64") {
-                    currentOsArtifact = "skiko-jvm-runtime-linux-arm64"
+                    currentOsArtifact = "skiko-awt-runtime-linux-arm64"
                 } else {
-                    currentOsArtifact = "skiko-jvm-runtime-linux-x64"
+                    currentOsArtifact = "skiko-awt-runtime-linux-x64"
                 }
             } else {
                 throw GradleException("Unsupported operating system $os")
@@ -570,7 +570,6 @@
 includeProject(":lint-demos:lint-demo-appcompat", "lint-demos/lint-demo-appcompat", [BuildType.MAIN])
 includeProject(":loader:loader", "loader/loader", [BuildType.MAIN])
 includeProject(":loader:loader-ktx", "loader/loader-ktx", [BuildType.MAIN])
-includeProject(":localbroadcastmanager:localbroadcastmanager", "localbroadcastmanager/localbroadcastmanager", [BuildType.MAIN])
 includeProject(":media2:integration-tests:testapp", "media2/integration-tests/testapp", [BuildType.MAIN, BuildType.MEDIA])
 includeProject(":media2:media2-common", "media2/media2-common", [BuildType.MAIN, BuildType.MEDIA])
 includeProject(":media2:media2-exoplayer", "media2/media2-exoplayer", [BuildType.MAIN, BuildType.MEDIA])
@@ -684,6 +683,8 @@
 includeProject(":startup:startup-runtime", "startup/startup-runtime", [BuildType.MAIN])
 includeProject(":startup:startup-runtime-lint", "startup/startup-runtime-lint", [BuildType.MAIN])
 includeProject(":swiperefreshlayout:swiperefreshlayout", "swiperefreshlayout/swiperefreshlayout", [BuildType.MAIN])
+includeProject(":template:template", "template/template", [BuildType.MAIN])
+includeProject(":template:template-appwidget", "template/template-appwidget", [BuildType.MAIN])
 includeProject(":test:junit:junit-gtest", "test/junit/junit-gtest", [BuildType.MAIN])
 includeProject(":test:screenshot:screenshot", "test/screenshot/screenshot")
 includeProject(":test:screenshot:screenshot-proto", "test/screenshot/screenshot/proto", [BuildType.MAIN])
diff --git a/template/template-appwidget/api/current.txt b/template/template-appwidget/api/current.txt
new file mode 100644
index 0000000..6289209
--- /dev/null
+++ b/template/template-appwidget/api/current.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.template.appwidget {
+
+  public abstract class GlanceTemplateAppWidget extends androidx.glance.appwidget.GlanceAppWidget {
+    ctor public GlanceTemplateAppWidget(androidx.template.template.GlanceTemplate<?> template);
+    method @androidx.compose.runtime.Composable public final void Content();
+    method public androidx.glance.appwidget.SizeMode.Exact getSizeMode();
+    property public androidx.glance.appwidget.SizeMode.Exact sizeMode;
+    property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
+  }
+
+}
+
diff --git a/template/template-appwidget/api/public_plus_experimental_current.txt b/template/template-appwidget/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..6289209
--- /dev/null
+++ b/template/template-appwidget/api/public_plus_experimental_current.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.template.appwidget {
+
+  public abstract class GlanceTemplateAppWidget extends androidx.glance.appwidget.GlanceAppWidget {
+    ctor public GlanceTemplateAppWidget(androidx.template.template.GlanceTemplate<?> template);
+    method @androidx.compose.runtime.Composable public final void Content();
+    method public androidx.glance.appwidget.SizeMode.Exact getSizeMode();
+    property public androidx.glance.appwidget.SizeMode.Exact sizeMode;
+    property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-current.txt b/template/template-appwidget/api/res-current.txt
similarity index 100%
rename from localbroadcastmanager/localbroadcastmanager/api/res-current.txt
rename to template/template-appwidget/api/res-current.txt
diff --git a/template/template-appwidget/api/restricted_current.txt b/template/template-appwidget/api/restricted_current.txt
new file mode 100644
index 0000000..6289209
--- /dev/null
+++ b/template/template-appwidget/api/restricted_current.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.template.appwidget {
+
+  public abstract class GlanceTemplateAppWidget extends androidx.glance.appwidget.GlanceAppWidget {
+    ctor public GlanceTemplateAppWidget(androidx.template.template.GlanceTemplate<?> template);
+    method @androidx.compose.runtime.Composable public final void Content();
+    method public androidx.glance.appwidget.SizeMode.Exact getSizeMode();
+    property public androidx.glance.appwidget.SizeMode.Exact sizeMode;
+    property public androidx.glance.state.GlanceStateDefinition<?>? stateDefinition;
+  }
+
+}
+
diff --git a/template/template-appwidget/build.gradle b/template/template-appwidget/build.gradle
new file mode 100644
index 0000000..eca13a8
--- /dev/null
+++ b/template/template-appwidget/build.gradle
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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.
+ */
+
+import androidx.build.AndroidXComposePlugin
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXComposePlugin")
+}
+
+AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project, /* isMultiplatformEnabled= */ false)
+
+dependencies {
+    kotlinPlugin(project(":compose:compiler:compiler"))
+
+    api(project(path: ':glance:glance-appwidget'))
+    api(project(path: ':template:template'))
+
+    implementation(libs.kotlinStdlib)
+    implementation('androidx.core:core-ktx:1.7.0')
+}
+
+androidx {
+    name = "Glance Templates For App Widgets"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.GLANCE_TEMPLATE
+    inceptionYear = "2021"
+    description = "Glance-templates-appwidget extends the glance templates library to provide " +
+            "template functionality to widget development."
+    targetsJavaConsumers = false
+}
diff --git a/template/template-appwidget/src/androidMain/AndroidManifest.xml b/template/template-appwidget/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..13e7214
--- /dev/null
+++ b/template/template-appwidget/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  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.
+  -->
+
+<manifest package="androidx.template.appwidget" />
diff --git a/template/template-appwidget/src/main/java/androidx/template/appwidget/GlanceTemplateAppWidget.kt b/template/template-appwidget/src/main/java/androidx/template/appwidget/GlanceTemplateAppWidget.kt
new file mode 100644
index 0000000..a6b1332
--- /dev/null
+++ b/template/template-appwidget/src/main/java/androidx/template/appwidget/GlanceTemplateAppWidget.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.template.appwidget
+
+import androidx.compose.runtime.Composable
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.SizeMode
+import androidx.glance.state.GlanceStateDefinition
+import androidx.glance.state.PreferencesGlanceStateDefinition
+import androidx.template.template.GlanceTemplate
+import androidx.template.template.TemplateTranslator
+
+/**
+ * A [GlanceAppWidget] that uses a [GlanceTemplate] to define its layout.
+ */
+public abstract class GlanceTemplateAppWidget(
+    private val template: GlanceTemplate<*>
+) : GlanceAppWidget() {
+
+    /** Default widget size mode is [SizeMode.Exact] */
+    override val sizeMode = SizeMode.Exact
+
+    /** Default widget state definition is [PreferencesGlanceStateDefinition] */
+    override val stateDefinition: GlanceStateDefinition<*>? = PreferencesGlanceStateDefinition
+
+    private val translator = TemplateTranslator()
+
+    @Composable
+    final override fun Content() {
+        translator.TemplateContent(template)
+    }
+}
diff --git a/template/template/api/current.txt b/template/template/api/current.txt
new file mode 100644
index 0000000..0c935f3
--- /dev/null
+++ b/template/template/api/current.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.template.template {
+
+  public abstract class GlanceTemplate<T> {
+    ctor public GlanceTemplate();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutCollapsed();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutHorizontal();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutVertical();
+    method public abstract T! getData(Object? state);
+  }
+
+  public abstract class SingleItemTemplate extends androidx.template.template.GlanceTemplate<androidx.template.template.SingleItemTemplate.Data> {
+    ctor public SingleItemTemplate();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutCollapsed();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutHorizontal();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutVertical();
+  }
+
+  public static class SingleItemTemplate.Data {
+    ctor public SingleItemTemplate.Data(String title, String buttonText, androidx.glance.action.Action buttonAction, androidx.glance.ImageProvider image, int backgroundColor);
+    method public final int getBackgroundColor();
+    method public final androidx.glance.action.Action getButtonAction();
+    method public final String getButtonText();
+    method public final androidx.glance.ImageProvider getImage();
+    method public final String getTitle();
+    method public final void setBackgroundColor(int backgroundColor);
+    method public final void setButtonAction(androidx.glance.action.Action buttonAction);
+    method public final void setButtonText(String buttonText);
+    method public final void setImage(androidx.glance.ImageProvider image);
+    method public final void setTitle(String title);
+    property public final int backgroundColor;
+    property public final androidx.glance.action.Action buttonAction;
+    property public final String buttonText;
+    property public final androidx.glance.ImageProvider image;
+    property public final String title;
+  }
+
+  public final class TemplateTranslator {
+    ctor public TemplateTranslator();
+    method @androidx.compose.runtime.Composable public void TemplateContent(androidx.template.template.GlanceTemplate<?> template);
+  }
+
+}
+
diff --git a/template/template/api/public_plus_experimental_current.txt b/template/template/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..0c935f3
--- /dev/null
+++ b/template/template/api/public_plus_experimental_current.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.template.template {
+
+  public abstract class GlanceTemplate<T> {
+    ctor public GlanceTemplate();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutCollapsed();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutHorizontal();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutVertical();
+    method public abstract T! getData(Object? state);
+  }
+
+  public abstract class SingleItemTemplate extends androidx.template.template.GlanceTemplate<androidx.template.template.SingleItemTemplate.Data> {
+    ctor public SingleItemTemplate();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutCollapsed();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutHorizontal();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutVertical();
+  }
+
+  public static class SingleItemTemplate.Data {
+    ctor public SingleItemTemplate.Data(String title, String buttonText, androidx.glance.action.Action buttonAction, androidx.glance.ImageProvider image, int backgroundColor);
+    method public final int getBackgroundColor();
+    method public final androidx.glance.action.Action getButtonAction();
+    method public final String getButtonText();
+    method public final androidx.glance.ImageProvider getImage();
+    method public final String getTitle();
+    method public final void setBackgroundColor(int backgroundColor);
+    method public final void setButtonAction(androidx.glance.action.Action buttonAction);
+    method public final void setButtonText(String buttonText);
+    method public final void setImage(androidx.glance.ImageProvider image);
+    method public final void setTitle(String title);
+    property public final int backgroundColor;
+    property public final androidx.glance.action.Action buttonAction;
+    property public final String buttonText;
+    property public final androidx.glance.ImageProvider image;
+    property public final String title;
+  }
+
+  public final class TemplateTranslator {
+    ctor public TemplateTranslator();
+    method @androidx.compose.runtime.Composable public void TemplateContent(androidx.template.template.GlanceTemplate<?> template);
+  }
+
+}
+
diff --git a/localbroadcastmanager/localbroadcastmanager/api/res-current.txt b/template/template/api/res-current.txt
similarity index 100%
copy from localbroadcastmanager/localbroadcastmanager/api/res-current.txt
copy to template/template/api/res-current.txt
diff --git a/template/template/api/restricted_current.txt b/template/template/api/restricted_current.txt
new file mode 100644
index 0000000..0c935f3
--- /dev/null
+++ b/template/template/api/restricted_current.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.template.template {
+
+  public abstract class GlanceTemplate<T> {
+    ctor public GlanceTemplate();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutCollapsed();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutHorizontal();
+    method @androidx.compose.runtime.Composable public abstract void WidgetLayoutVertical();
+    method public abstract T! getData(Object? state);
+  }
+
+  public abstract class SingleItemTemplate extends androidx.template.template.GlanceTemplate<androidx.template.template.SingleItemTemplate.Data> {
+    ctor public SingleItemTemplate();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutCollapsed();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutHorizontal();
+    method @androidx.compose.runtime.Composable public void WidgetLayoutVertical();
+  }
+
+  public static class SingleItemTemplate.Data {
+    ctor public SingleItemTemplate.Data(String title, String buttonText, androidx.glance.action.Action buttonAction, androidx.glance.ImageProvider image, int backgroundColor);
+    method public final int getBackgroundColor();
+    method public final androidx.glance.action.Action getButtonAction();
+    method public final String getButtonText();
+    method public final androidx.glance.ImageProvider getImage();
+    method public final String getTitle();
+    method public final void setBackgroundColor(int backgroundColor);
+    method public final void setButtonAction(androidx.glance.action.Action buttonAction);
+    method public final void setButtonText(String buttonText);
+    method public final void setImage(androidx.glance.ImageProvider image);
+    method public final void setTitle(String title);
+    property public final int backgroundColor;
+    property public final androidx.glance.action.Action buttonAction;
+    property public final String buttonText;
+    property public final androidx.glance.ImageProvider image;
+    property public final String title;
+  }
+
+  public final class TemplateTranslator {
+    ctor public TemplateTranslator();
+    method @androidx.compose.runtime.Composable public void TemplateContent(androidx.template.template.GlanceTemplate<?> template);
+  }
+
+}
+
diff --git a/template/template/build.gradle b/template/template/build.gradle
new file mode 100644
index 0000000..c656007
--- /dev/null
+++ b/template/template/build.gradle
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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.
+ */
+
+import androidx.build.AndroidXComposePlugin
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("AndroidXComposePlugin")
+}
+
+AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project, /* isMultiplatformEnabled= */ false)
+
+dependencies {
+    kotlinPlugin(project(":compose:compiler:compiler"))
+
+    api(project(path: ':glance:glance'))
+
+    implementation(libs.kotlinStdlib)
+    implementation(project(path: ':compose:runtime:runtime'))
+    implementation('androidx.core:core-ktx:1.7.0')
+}
+
+androidx {
+    name = "Glance Templates"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.GLANCE_TEMPLATE
+    inceptionYear = "2021"
+    description = "Glance template extends the Glance library to allow simpler development of " +
+            "glanceable layouts across surface types."
+    targetsJavaConsumers = false
+}
diff --git a/template/template/src/androidMain/AndroidManifest.xml b/template/template/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..e82e9b1
--- /dev/null
+++ b/template/template/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2022 The Android Open Source Project
+
+  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.
+  -->
+
+<manifest package="androidx.template.template" />
diff --git a/template/template/src/main/java/androidx/template/template/GlanceTemplate.kt b/template/template/src/main/java/androidx/template/template/GlanceTemplate.kt
new file mode 100644
index 0000000..6ccd1b3
--- /dev/null
+++ b/template/template/src/main/java/androidx/template/template/GlanceTemplate.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.template.template
+
+import androidx.compose.runtime.Composable
+
+/** Transforms semantic data into a composable layout for any glanceable */
+abstract class GlanceTemplate<T> {
+
+    /** Defines the data associated with this template */
+    abstract fun getData(state: Any?): T
+
+    @Composable
+    abstract fun WidgetLayoutCollapsed()
+
+    @Composable
+    abstract fun WidgetLayoutVertical()
+
+    @Composable
+    abstract fun WidgetLayoutHorizontal()
+
+    // TODO: templates include layouts for every supported size and surface type
+}
diff --git a/template/template/src/main/java/androidx/template/template/SingleItemTemplate.kt b/template/template/src/main/java/androidx/template/template/SingleItemTemplate.kt
new file mode 100644
index 0000000..080403a
--- /dev/null
+++ b/template/template/src/main/java/androidx/template/template/SingleItemTemplate.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.template.template
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.unit.dp
+import androidx.glance.Button
+import androidx.glance.GlanceModifier
+import androidx.glance.Image
+import androidx.glance.ImageProvider
+import androidx.glance.action.Action
+import androidx.glance.background
+import androidx.glance.currentState
+import androidx.glance.layout.Column
+import androidx.glance.layout.Row
+import androidx.glance.layout.fillMaxSize
+import androidx.glance.layout.padding
+import androidx.glance.text.Text
+
+/**
+ * A basic [GlanceTemplate] implementation based around a single item, using [Data].
+ */
+abstract class SingleItemTemplate : GlanceTemplate<SingleItemTemplate.Data>() {
+
+    @Composable
+    override fun WidgetLayoutCollapsed() {
+        getData(currentState()).let {
+            Column(
+                modifier = GlanceModifier.fillMaxSize().padding(8.dp).background(it.backgroundColor)
+            ) {
+                Text(it.title)
+                Button(text = it.buttonText, onClick = it.buttonAction)
+            }
+        }
+    }
+
+    @Composable
+    override fun WidgetLayoutVertical() {
+        getData(currentState()).let {
+            Column(
+                modifier = GlanceModifier.fillMaxSize().padding(8.dp).background(it.backgroundColor)
+            ) {
+                Text(it.title)
+                Image(provider = it.image, contentDescription = "test")
+                Button(text = it.buttonText, onClick = it.buttonAction)
+            }
+        }
+    }
+
+    @Composable
+    override fun WidgetLayoutHorizontal() {
+        getData(currentState()).let {
+            Row(
+                modifier = GlanceModifier.fillMaxSize().padding(8.dp).background(it.backgroundColor)
+            ) {
+                Column(modifier = GlanceModifier.padding(8.dp)) {
+                    Text(it.title)
+                    Button(text = it.buttonText, onClick = it.buttonAction)
+                }
+                Image(provider = it.image, contentDescription = "test")
+            }
+        }
+    }
+
+    open class Data(
+        var title: String,
+        var buttonText: String,
+        var buttonAction: Action,
+        var image: ImageProvider,
+        var backgroundColor: Int
+    )
+}
diff --git a/template/template/src/main/java/androidx/template/template/TemplateTranslator.kt b/template/template/src/main/java/androidx/template/template/TemplateTranslator.kt
new file mode 100644
index 0000000..d005c82
--- /dev/null
+++ b/template/template/src/main/java/androidx/template/template/TemplateTranslator.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * 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 androidx.template.template
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.unit.Dp
+import androidx.glance.LocalSize
+
+/**
+ * Fetches composable content from a template, appropriate to the given surface and display context.
+ * The translator parses the display context to determine which template content to fetch.
+ */
+public class TemplateTranslator {
+
+    @Composable
+    public fun TemplateContent(template: GlanceTemplate<*>) {
+        // TODO: pass in host context and get layout for display params, including surface type etc.
+        val height = LocalSize.current.height
+        val width = LocalSize.current.width
+        if (height < Dp(240f) && width < Dp(240f)) {
+            template.WidgetLayoutCollapsed()
+        } else if ((width / height) < (3.0 / 2.0)) {
+            template.WidgetLayoutVertical()
+        } else {
+            template.WidgetLayoutHorizontal()
+        }
+    }
+}
diff --git a/test/junit/junit-gtest/build.gradle b/test/junit/junit-gtest/build.gradle
index 44556c8..82632a6 100644
--- a/test/junit/junit-gtest/build.gradle
+++ b/test/junit/junit-gtest/build.gradle
@@ -53,7 +53,7 @@
     }
     externalNativeBuild {
         cmake {
-            version "3.22.1"
+            version libs.versions.cmake.get()
             path "src/main/cpp/CMakeLists.txt"
         }
     }
diff --git a/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutGetHorizontalMultiLineTest.kt b/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutGetHorizontalMultiLineTest.kt
new file mode 100644
index 0000000..9095208
--- /dev/null
+++ b/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutGetHorizontalMultiLineTest.kt
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * 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 androidx.compose.ui.text.android
+
+import android.text.TextPaint
+import androidx.compose.ui.text.font.test.R
+import androidx.core.content.res.ResourcesCompat
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+@SmallTest
+@OptIn(InternalPlatformTextApi::class)
+@RunWith(AndroidJUnit4::class)
+class LayoutGetHorizontalMultiLineTest {
+
+    private val sampleTypeface = ResourcesCompat.getFont(
+        InstrumentationRegistry.getInstrumentation().targetContext,
+        R.font.sample_font
+    )
+
+    private val fontSize = 10f
+    private val width = 3 * fontSize
+
+    private val paint = TextPaint().apply {
+        textSize = fontSize
+        typeface = sampleTypeface
+    }
+
+    private fun createLayout(
+        text: String,
+        textDirectionHeuristic: Int
+    ): TextLayout = TextLayout(
+        charSequence = text,
+        textPaint = paint,
+        textDirectionHeuristic = textDirectionHeuristic,
+        width = width
+    )
+
+    @Test
+    fun ltrTextLtrDirection() {
+        val char = "a"
+        val text = (char + "\n").repeat(4)
+        val layout = createLayout(text, LayoutCompat.TEXT_DIRECTION_LTR)
+        val result = collectResult(text, layout)
+
+        // width is 3 chars
+        // \n is zero width
+        // _ is empty space (not white space)
+        // | → | \n | _ | _ |
+        // | → | \n | _ | _ |
+        // | → | \n | _ | _ |
+        // | → | \n | _ | _ |
+        // | _ | _  | _ | _ | // as a result of last new line
+        val lineStart = 0f
+        val lineEnd = fontSize
+        assertThat(result).isEqualTo(
+            arrayOf(
+                // first ltr char in ltr direction is always at line start
+                Pos(lineStart),
+                // new line: all values are the end of the line
+                Pos(lineEnd),
+                // char at the beginning of line, upstream is previous lineEnd
+                Pos(
+                    primaryUpstream = lineEnd,
+                    primaryDownstream = lineStart,
+                    secondaryUpstream = lineEnd,
+                    secondaryDownstream = lineStart
+                ),
+                // remaining is the repetition
+                Pos(lineEnd),
+                Pos(lineEnd, lineStart, lineEnd, lineStart),
+                Pos(lineEnd),
+                Pos(lineEnd, lineStart, lineEnd, lineStart),
+                Pos(lineEnd),
+            )
+        )
+    }
+
+    @Test
+    fun rtlTextRtlDirection() {
+        val char = "\u05D0"
+        val text = (char + "\n").repeat(4)
+        val layout = createLayout(text, LayoutCompat.TEXT_DIRECTION_RTL)
+        val result = collectResult(text, layout)
+
+        // width is 3 chars
+        // \n is zero width
+        // _ is empty space (not white space)
+        // | _ | _ | \n | ← |
+        // | _ | _ | \n | ← |
+        // | _ | _ | \n | ← |
+        // | _ | _ | \n | ← |
+        // | _ | _  | _ | _ | // as a result of last new line
+        val lineStart = width
+        val lineEnd = width - fontSize
+        assertThat(result).isEqualTo(
+            arrayOf(
+                // first rtl char in rtl direction is always at line start
+                Pos(lineStart),
+                // new line: all values are the end of the line
+                Pos(lineEnd),
+                // char at the beginning of line, upstream is previous lineEnd
+                Pos(
+                    primaryUpstream = lineEnd,
+                    primaryDownstream = lineStart,
+                    secondaryUpstream = lineEnd,
+                    secondaryDownstream = lineStart
+                ),
+                // remaining is the repetition
+                Pos(lineEnd),
+                Pos(lineEnd, lineStart, lineEnd, lineStart),
+                Pos(lineEnd),
+                Pos(lineEnd, lineStart, lineEnd, lineStart),
+                Pos(lineEnd)
+            )
+        )
+    }
+
+    /**
+     * This case is minimum repro for a magnifier tests.
+     *
+     * Failure was java.lang.IllegalArgumentException: Invalid ranges (start=2, limit=3, length=2)
+     *
+     * State is:
+     *  RTL text
+     *  LTR TextDirection
+     *  multi line with line feeds in between
+     */
+    @Test
+    fun rtlTextLtrDirection() {
+        val char = "\u05D0"
+        val text = (char + "\n").repeat(4)
+        val layout = createLayout(text, LayoutCompat.TEXT_DIRECTION_LTR)
+        val result = collectResult(text, layout)
+
+        // width is 3 chars
+        // \n is zero width
+        // _ is empty space (not white space)
+        // | ← | \n | _ | _ |
+        // | ← | \n | _ | _ |
+        // | ← | \n | _ | _ |
+        // | ← | \n | _ | _ |
+        // | _ | _  | _ | _ | // as a result of last new line
+
+        assertThat(result).isEqualTo(
+            arrayOf(
+                Pos(
+                    // primary (ltr) direction puts the position to 0, first char has no upstream
+                    primaryUpstream = 0f,
+                    primaryDownstream = 0f,
+                    // secondary starts writing from 1 char right which is the line end
+                    secondaryUpstream = fontSize,
+                    secondaryDownstream = fontSize
+                ),
+                // new line
+                Pos(
+                    // new line for ltr starts from lineEnd
+                    primaryUpstream = fontSize,
+                    primaryDownstream = fontSize,
+                    // new line for rtl continues on 0 on new line
+                    secondaryUpstream = 0f,
+                    secondaryDownstream = 0f
+                ),
+                // second line first char
+                Pos(
+                    // primary ltr direction upstream is previous line end
+                    primaryUpstream = fontSize,
+                    // primary ltr direction downstream is next line start
+                    primaryDownstream = 0f,
+                    // rtl direction *** I did not understand this part ***
+                    secondaryUpstream = 0f,
+                    // downstream is where character is rendered, from right to left starting
+                    // from the 1 char width
+                    secondaryDownstream = fontSize
+                ),
+                // remaining is the repetition
+                Pos(fontSize, fontSize, 0f, 0f),
+                Pos(fontSize, 0f, 0f, fontSize),
+                Pos(fontSize, fontSize, 0f, 0f),
+                Pos(fontSize, 0f, 0f, fontSize),
+                Pos(fontSize, fontSize, 0f, 0f),
+            )
+        )
+    }
+
+    @Test
+    fun ltrTextRtlDirection() {
+        val char = "a"
+        val text = (char + "\n").repeat(4)
+        val layout = createLayout(text, LayoutCompat.TEXT_DIRECTION_RTL)
+        val result = collectResult(text, layout)
+
+        // width is 3 chars
+        // \n is zero width
+        // _ is empty space (not white space)
+        // | _ | _ | \n | → |
+        // | _ | _ | \n | → |
+        // | _ | _ | \n | → |
+        // | _ | _ | \n | → |
+        // | _ | _ | _  | _ | // as a result of last new line
+        val lineStart = width
+        val lineEnd = width - fontSize
+        assertThat(result).isEqualTo(
+            arrayOf(
+                Pos(
+                    // rtl direction line start is width
+                    primaryUpstream = width,
+                    // rtl direction no upstream for first char
+                    primaryDownstream = width,
+                    // ltr direction char, *** I did not understand this part ***
+                    secondaryUpstream = lineEnd,
+                    secondaryDownstream = lineEnd
+                ),
+                Pos(
+                    primaryUpstream = lineEnd,
+                    primaryDownstream = lineEnd,
+                    secondaryUpstream = width,
+                    secondaryDownstream = width
+                ),
+                Pos(
+                    primaryUpstream = lineEnd,
+                    primaryDownstream = width,
+                    secondaryUpstream = width,
+                    secondaryDownstream = lineEnd
+                ),
+                // remaining is the repetition
+                Pos(lineEnd, lineEnd, width, lineStart),
+                Pos(lineEnd, width, width, lineEnd),
+                Pos(lineEnd, lineEnd, width, width),
+                Pos(lineEnd, width, width, lineEnd),
+                Pos(lineEnd, lineEnd, width, width)
+            )
+        )
+    }
+
+    private fun collectResult(text: String, layout: TextLayout): Array<Pos> {
+        return text.indices.map { index ->
+            Pos(
+                primaryUpstream = layout.getPrimaryHorizontal(offset = index, upstream = true),
+                primaryDownstream = layout.getPrimaryHorizontal(offset = index, upstream = false),
+                secondaryUpstream = layout.getSecondaryHorizontal(offset = index, upstream = true),
+                secondaryDownstream = layout.getSecondaryHorizontal(
+                    offset = index,
+                    upstream = false
+                )
+            )
+        }.toTypedArray()
+    }
+
+    private data class Pos(
+        val primaryUpstream: Float,
+        val primaryDownstream: Float,
+        val secondaryUpstream: Float,
+        val secondaryDownstream: Float,
+    ) {
+        constructor(value: Float) : this(
+            primaryUpstream = value,
+            primaryDownstream = value,
+            secondaryUpstream = value,
+            secondaryDownstream = value
+        )
+    }
+}
\ No newline at end of file
diff --git a/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt b/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt
index 5ece2b5..d8d1305 100644
--- a/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt
+++ b/text/text/src/androidTest/java/androidx/compose/ui/text/android/LayoutHelperParagraphTest.kt
@@ -123,6 +123,19 @@
     }
 
     @Test
+    fun testParagraphForOffsetUpstream() {
+        val layoutHelper = buildLayoutHelper("aa\nbb\ncc")
+        assertThat(layoutHelper.getParagraphForOffset(0, true)).isEqualTo(0) // a
+        assertThat(layoutHelper.getParagraphForOffset(1, true)).isEqualTo(0) // a
+        assertThat(layoutHelper.getParagraphForOffset(2, true)).isEqualTo(0) // \n
+        assertThat(layoutHelper.getParagraphForOffset(3, true)).isEqualTo(0) // b*
+        assertThat(layoutHelper.getParagraphForOffset(4, true)).isEqualTo(1) // b
+        assertThat(layoutHelper.getParagraphForOffset(5, true)).isEqualTo(1) // \n
+        assertThat(layoutHelper.getParagraphForOffset(6, true)).isEqualTo(1) // c*
+        assertThat(layoutHelper.getParagraphForOffset(7, true)).isEqualTo(2) // c
+    }
+
+    @Test
     fun testParagraphForOffset_lineFeedOnlyCase() {
         val layoutHelper = buildLayoutHelper("\n\n")
         assertThat(layoutHelper.getParagraphForOffset(0)).isEqualTo(0)
@@ -130,7 +143,7 @@
     }
 
     @Test
-    fun testParagarphDirection() {
+    fun testParagraphDirection() {
         val layoutHelper = buildLayoutHelper("aa\nאא\ncc")
         assertThat(layoutHelper.isRtlParagraph(0)).isFalse()
         assertThat(layoutHelper.isRtlParagraph(1)).isTrue()
@@ -138,7 +151,7 @@
     }
 
     @Test
-    fun testParagarphDirection_case2() {
+    fun testParagraphDirection_case2() {
         val layoutHelper = buildLayoutHelper("אא\nbb\nאא")
         assertThat(layoutHelper.isRtlParagraph(0)).isTrue()
         assertThat(layoutHelper.isRtlParagraph(1)).isFalse()
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt
index 73ed983..17a719a 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt
@@ -153,8 +153,17 @@
      * @param offset a character offset in the text
      * @return the paragraph number
      */
-    fun getParagraphForOffset(@IntRange(from = 0) offset: Int): Int =
-        paragraphEnds.binarySearch(offset).let { if (it < 0) - (it + 1) else it + 1 }
+    fun getParagraphForOffset(@IntRange(from = 0) offset: Int, upstream: Boolean = false): Int {
+        val paragraphIndex = paragraphEnds.binarySearch(offset).let {
+            if (it < 0) -(it + 1) else it + 1
+        }
+
+        if (upstream && paragraphIndex > 0 && offset == paragraphEnds[paragraphIndex - 1]) {
+            return paragraphIndex - 1
+        }
+
+        return paragraphIndex
+    }
 
     /**
      * Returns the inclusive paragraph starting offset of the given paragraph index.
@@ -212,6 +221,11 @@
      * @return the horizontal offset from the drawing origin.
      */
     fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean, upstream: Boolean): Float {
+        // Android already calculates downstream
+        if (!upstream) {
+            return getDownstreamHorizontal(offset, usePrimaryDirection)
+        }
+
         val lineNo = layout.getLineForOffset(offset, upstream)
         val lineStart = layout.getLineStart(lineNo)
         val lineEnd = layout.getLineEnd(lineNo)
@@ -228,12 +242,16 @@
             return getDownstreamHorizontal(offset, usePrimaryDirection)
         }
 
-        val paraNo = getParagraphForOffset(offset)
+        val paraNo = getParagraphForOffset(offset, upstream)
         val isParaRtl = isRtlParagraph(paraNo)
 
         // Use line visible end for creating bidi object since invisible whitespaces should not be
         // considered for location retrieval.
-        val lineBidi = analyzeBidi(paraNo)?.createLineBidi(lineStart, lineEndToVisibleEnd(lineEnd))
+        val lineVisibleEnd = lineEndToVisibleEnd(lineEnd)
+        val paragraphStart = getParagraphStart(paraNo)
+        val bidiStart = lineStart - paragraphStart
+        val bidiEnd = lineVisibleEnd - paragraphStart
+        val lineBidi = analyzeBidi(paraNo)?.createLineBidi(bidiStart, bidiEnd)
         if (lineBidi == null || lineBidi.runCount == 1) { // easy case. All directions are the same
             val runDirection = layout.isRtlCharAt(lineStart)
             val isStartLeft = if (usePrimaryDirection || isParaRtl == runDirection) {
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
index 1103629..4ecda1d 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
@@ -215,6 +215,8 @@
             }
     }
 
+    private val layoutHelper by lazy(LazyThreadSafetyMode.NONE) { LayoutHelper(layout) }
+
     val text: CharSequence
         get() = layout.text
 
@@ -270,9 +272,11 @@
     fun getOffsetForHorizontal(line: Int, horizontal: Float): Int =
         layout.getOffsetForHorizontal(line, horizontal)
 
-    fun getPrimaryHorizontal(offset: Int): Float = layout.getPrimaryHorizontal(offset)
+    fun getPrimaryHorizontal(offset: Int, upstream: Boolean = false): Float =
+        layoutHelper.getHorizontalPosition(offset, usePrimaryDirection = true, upstream = upstream)
 
-    fun getSecondaryHorizontal(offset: Int): Float = layout.getSecondaryHorizontal(offset)
+    fun getSecondaryHorizontal(offset: Int, upstream: Boolean = false): Float =
+        layoutHelper.getHorizontalPosition(offset, usePrimaryDirection = false, upstream = upstream)
 
     fun getLineForOffset(offset: Int): Int = layout.getLineForOffset(offset)
 
@@ -343,4 +347,4 @@
             else -> Layout.Alignment.ALIGN_NORMAL
         }
     }
-}
\ No newline at end of file
+}
diff --git a/tracing/tracing-perfetto-binary/build.gradle b/tracing/tracing-perfetto-binary/build.gradle
index 3332ff8..529781a 100644
--- a/tracing/tracing-perfetto-binary/build.gradle
+++ b/tracing/tracing-perfetto-binary/build.gradle
@@ -28,7 +28,7 @@
     externalNativeBuild {
         cmake {
             path "src/main/cpp/CMakeLists.txt"
-            version "3.22.1"
+            version libs.versions.cmake.get()
         }
     }
 }
diff --git a/wear/compose/compose-material/api/current.txt b/wear/compose/compose-material/api/current.txt
index fa4acbe..96b388d 100644
--- a/wear/compose/compose-material/api/current.txt
+++ b/wear/compose/compose-material/api/current.txt
@@ -153,10 +153,6 @@
 
   public final class InlineSliderDefaults {
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.InlineSliderColors colors(optional long backgroundColor, optional long spacerColor, optional long selectedBarColor, optional long unselectedBarColor, optional long disabledBackgroundColor, optional long disabledSpacerColor, optional long disabledSelectedBarColor, optional long disabledUnselectedBarColor);
-    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
-    method public androidx.compose.ui.graphics.vector.ImageVector getIncreaseIcon();
-    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
-    property public final androidx.compose.ui.graphics.vector.ImageVector IncreaseIcon;
     field public static final androidx.wear.compose.material.InlineSliderDefaults INSTANCE;
   }
 
@@ -366,18 +362,12 @@
 
   public final class SliderKt {
     method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
-  }
-
-  public final class StepperDefaults {
-    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
-    method public androidx.compose.ui.graphics.vector.ImageVector getIncreaseIcon();
-    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
-    property public final androidx.compose.ui.graphics.vector.ImageVector IncreaseIcon;
-    field public static final androidx.wear.compose.material.StepperDefaults INSTANCE;
+    method @androidx.compose.runtime.Composable public static void InlineSlider(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, kotlin.ranges.IntProgression valueProgression, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
   }
 
   public final class StepperKt {
     method @androidx.compose.runtime.Composable public static void Stepper(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional long backgroundColor, optional long contentColor, optional long iconTintColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Stepper(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, kotlin.ranges.IntProgression valueProgression, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional long backgroundColor, optional long contentColor, optional long iconTintColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
   }
 
   public final class SwipeToDismissBoxKt {
diff --git a/wear/compose/compose-material/api/public_plus_experimental_current.txt b/wear/compose/compose-material/api/public_plus_experimental_current.txt
index aeee589..7441372 100644
--- a/wear/compose/compose-material/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-material/api/public_plus_experimental_current.txt
@@ -168,10 +168,6 @@
 
   public final class InlineSliderDefaults {
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.InlineSliderColors colors(optional long backgroundColor, optional long spacerColor, optional long selectedBarColor, optional long unselectedBarColor, optional long disabledBackgroundColor, optional long disabledSpacerColor, optional long disabledSelectedBarColor, optional long disabledUnselectedBarColor);
-    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
-    method public androidx.compose.ui.graphics.vector.ImageVector getIncreaseIcon();
-    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
-    property public final androidx.compose.ui.graphics.vector.ImageVector IncreaseIcon;
     field public static final androidx.wear.compose.material.InlineSliderDefaults INSTANCE;
   }
 
@@ -392,18 +388,12 @@
 
   public final class SliderKt {
     method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
-  }
-
-  public final class StepperDefaults {
-    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
-    method public androidx.compose.ui.graphics.vector.ImageVector getIncreaseIcon();
-    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
-    property public final androidx.compose.ui.graphics.vector.ImageVector IncreaseIcon;
-    field public static final androidx.wear.compose.material.StepperDefaults INSTANCE;
+    method @androidx.compose.runtime.Composable public static void InlineSlider(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, kotlin.ranges.IntProgression valueProgression, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
   }
 
   public final class StepperKt {
     method @androidx.compose.runtime.Composable public static void Stepper(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional long backgroundColor, optional long contentColor, optional long iconTintColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Stepper(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, kotlin.ranges.IntProgression valueProgression, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional long backgroundColor, optional long contentColor, optional long iconTintColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
   }
 
   @androidx.wear.compose.material.ExperimentalWearMaterialApi public enum SwipeDismissTarget {
diff --git a/wear/compose/compose-material/api/restricted_current.txt b/wear/compose/compose-material/api/restricted_current.txt
index fa4acbe..96b388d 100644
--- a/wear/compose/compose-material/api/restricted_current.txt
+++ b/wear/compose/compose-material/api/restricted_current.txt
@@ -153,10 +153,6 @@
 
   public final class InlineSliderDefaults {
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.InlineSliderColors colors(optional long backgroundColor, optional long spacerColor, optional long selectedBarColor, optional long unselectedBarColor, optional long disabledBackgroundColor, optional long disabledSpacerColor, optional long disabledSelectedBarColor, optional long disabledUnselectedBarColor);
-    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
-    method public androidx.compose.ui.graphics.vector.ImageVector getIncreaseIcon();
-    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
-    property public final androidx.compose.ui.graphics.vector.ImageVector IncreaseIcon;
     field public static final androidx.wear.compose.material.InlineSliderDefaults INSTANCE;
   }
 
@@ -366,18 +362,12 @@
 
   public final class SliderKt {
     method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
-  }
-
-  public final class StepperDefaults {
-    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
-    method public androidx.compose.ui.graphics.vector.ImageVector getIncreaseIcon();
-    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
-    property public final androidx.compose.ui.graphics.vector.ImageVector IncreaseIcon;
-    field public static final androidx.wear.compose.material.StepperDefaults INSTANCE;
+    method @androidx.compose.runtime.Composable public static void InlineSlider(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, kotlin.ranges.IntProgression valueProgression, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
   }
 
   public final class StepperKt {
     method @androidx.compose.runtime.Composable public static void Stepper(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional long backgroundColor, optional long contentColor, optional long iconTintColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Stepper(int value, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, kotlin.ranges.IntProgression valueProgression, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional long backgroundColor, optional long contentColor, optional long iconTintColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
   }
 
   public final class SwipeToDismissBoxKt {
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/SliderSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/SliderSample.kt
index 060f8bc..954a634 100644
--- a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/SliderSample.kt
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/SliderSample.kt
@@ -49,3 +49,15 @@
         segmented = true
     )
 }
+
+@Sampled
+@Composable
+fun InlineSliderWithIntegerSample() {
+    var value by remember { mutableStateOf(4) }
+    InlineSlider(
+        value = value,
+        onValueChange = { value = it },
+        valueProgression = 0..10,
+        segmented = false
+    )
+}
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/StepperSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/StepperSample.kt
index 61b3ea8..b0a6e38 100644
--- a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/StepperSample.kt
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/StepperSample.kt
@@ -36,3 +36,14 @@
         steps = 7
     ) { Text("Value: $value") }
 }
+
+@Sampled
+@Composable
+fun StepperWithIntegerSample() {
+    var value by remember { mutableStateOf(2) }
+    Stepper(
+        value = value,
+        onValueChange = { value = it },
+        valueProgression = 1..10
+    ) { Text("Value: $value") }
+}
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt
index 9404de4..dede24f 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt
@@ -55,12 +55,12 @@
 import org.junit.Rule
 import org.junit.Test
 
-class ButtonBehaviourTest {
+public class ButtonBehaviourTest {
     @get:Rule
-    val rule = createComposeRule()
+    public val rule = createComposeRule()
 
     @Test
-    fun supports_testtag_on_button_for_image() {
+    public fun supports_testtag_on_button_for_image() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -74,7 +74,7 @@
     }
 
     @Test
-    fun supports_testtag_on_button_for_text() {
+    public fun supports_testtag_on_button_for_text() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -88,7 +88,7 @@
     }
 
     @Test
-    fun supports_testtag_on_compactbutton_for_image() {
+    public fun supports_testtag_on_compactbutton_for_image() {
         rule.setContentWithTheme {
             CompactButton(
                 onClick = {},
@@ -102,7 +102,7 @@
     }
 
     @Test
-    fun supports_testtag_on_compactbutton_for_text() {
+    public fun supports_testtag_on_compactbutton_for_text() {
         rule.setContentWithTheme {
             CompactButton(
                 onClick = {},
@@ -116,7 +116,7 @@
     }
 
     @Test
-    fun has_clickaction_when_enabled_for_image() {
+    public fun has_clickaction_when_enabled_for_image() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -131,7 +131,7 @@
     }
 
     @Test
-    fun has_clickaction_when_enabled_for_text() {
+    public fun has_clickaction_when_enabled_for_text() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -146,7 +146,7 @@
     }
 
     @Test
-    fun has_clickaction_when_disabled_for_image() {
+    public fun has_clickaction_when_disabled_for_image() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -161,7 +161,7 @@
     }
 
     @Test
-    fun has_clickaction_when_disabled_for_text() {
+    public fun has_clickaction_when_disabled_for_text() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -176,7 +176,7 @@
     }
 
     @Test
-    fun is_correctly_enabled_when_enabled_equals_true() {
+    public fun is_correctly_enabled_when_enabled_equals_true() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -191,7 +191,7 @@
     }
 
     @Test
-    fun is_correctly_disabled_when_enabled_equals_false() {
+    public fun is_correctly_disabled_when_enabled_equals_false() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -206,7 +206,7 @@
     }
 
     @Test
-    fun responds_to_click_when_enabled_on_compact_button() {
+    public fun responds_to_click_when_enabled_on_compact_button() {
         var clicked = false
 
         rule.setContentWithTheme {
@@ -227,7 +227,7 @@
     }
 
     @Test
-    fun responds_to_click_when_enabled_on_button() {
+    public fun responds_to_click_when_enabled_on_button() {
         var clicked = false
 
         rule.setContentWithTheme {
@@ -248,7 +248,7 @@
     }
 
     @Test
-    fun does_not_respond_to_click_when_disabled_on_compact_button() {
+    public fun does_not_respond_to_click_when_disabled_on_compact_button() {
         var clicked = false
 
         rule.setContentWithTheme {
@@ -269,7 +269,7 @@
     }
 
     @Test
-    fun does_not_respond_to_click_when_disabled_on_button() {
+    public fun does_not_respond_to_click_when_disabled_on_button() {
         var clicked = false
 
         rule.setContentWithTheme {
@@ -290,7 +290,7 @@
     }
 
     @Test
-    fun has_role_button_for_compact_image() {
+    public fun has_role_button_for_compact_image() {
         rule.setContentWithTheme {
             CompactButton(
                 onClick = {},
@@ -310,7 +310,7 @@
     }
 
     @Test
-    fun has_role_button_for_text() {
+    public fun has_role_button_for_text() {
         rule.setContentWithTheme {
             Button(
                 onClick = {},
@@ -330,7 +330,7 @@
     }
 
     @Test
-    fun contains_text_for_button() {
+    public fun contains_text_for_button() {
         val text = "Test"
         rule.setContentWithTheme {
             Button(
@@ -344,7 +344,7 @@
     }
 
     @Test
-    fun contains_text_for_compact_button() {
+    public fun contains_text_for_compact_button() {
         val text = "Test"
         rule.setContentWithTheme {
             CompactButton(
@@ -358,7 +358,7 @@
     }
 
     @Test
-    fun matches_has_text_for_button() {
+    public fun matches_has_text_for_button() {
         val text = "Test"
         rule.setContentWithTheme {
             Button(
@@ -372,7 +372,7 @@
     }
 
     @Test
-    fun matches_has_text_for_compactbutton() {
+    public fun matches_has_text_for_compactbutton() {
         val text = "Test"
         rule.setContentWithTheme {
             CompactButton(
@@ -386,7 +386,7 @@
     }
 
     @Test
-    fun is_circular_under_ltr_for_button() =
+    public fun is_circular_under_ltr_for_button() =
         rule.isCircular(LayoutDirection.Ltr) {
             Button(
                 modifier = Modifier.testTag(TEST_TAG),
@@ -397,7 +397,7 @@
         }
 
     @Test
-    fun is_circular_under_rtl_for_button() =
+    public fun is_circular_under_rtl_for_button() =
         rule.isCircular(LayoutDirection.Rtl) {
             Button(
                 modifier = Modifier.testTag(TEST_TAG),
@@ -408,12 +408,12 @@
         }
 }
 
-class ButtonSizeTest {
+public class ButtonSizeTest {
     @get:Rule
-    val rule = createComposeRule()
+    public val rule = createComposeRule()
 
     @Test
-    fun gives_compactbutton_correct_tapsize() {
+    public fun gives_compactbutton_correct_tapsize() {
         rule.verifyTapSize(TapSize.Small) {
             CompactButton(
                 onClick = {},
@@ -424,7 +424,7 @@
     }
 
     @Test
-    fun gives_button_correct_tapsize() {
+    public fun gives_button_correct_tapsize() {
         rule.verifyTapSize(TapSize.Default) {
             Button(
                 onClick = {},
@@ -435,7 +435,7 @@
     }
 
     @Test
-    fun gives_small_button_correct_tapsize() {
+    public fun gives_small_button_correct_tapsize() {
         rule.verifyTapSize(TapSize.Small) {
             Button(
                 onClick = {},
@@ -447,7 +447,7 @@
     }
 
     @Test
-    fun gives_large_button_correct_tapsize() {
+    public fun gives_large_button_correct_tapsize() {
         rule.verifyTapSize(TapSize.Large) {
             Button(
                 onClick = {},
@@ -459,12 +459,12 @@
     }
 }
 
-class ButtonColorTest {
+public class ButtonColorTest {
     @get:Rule
-    val rule = createComposeRule()
+    public val rule = createComposeRule()
 
     @Test
-    fun gives_enabled_button_primary_colors() =
+    public fun gives_enabled_button_primary_colors() =
         verifyButtonColors(
             Status.Enabled,
             { ButtonDefaults.primaryButtonColors() },
@@ -473,7 +473,7 @@
         )
 
     @Test
-    fun gives_enabled_compact_button_primary_colors() =
+    public fun gives_enabled_compact_button_primary_colors() =
         verifyCompactButtonColors(
             Status.Enabled,
             { ButtonDefaults.primaryButtonColors() },
@@ -482,7 +482,7 @@
         )
 
     @Test
-    fun gives_disabled_button_primary_colors() =
+    public fun gives_disabled_button_primary_colors() =
         verifyButtonColors(
             Status.Disabled,
             { ButtonDefaults.primaryButtonColors() },
@@ -491,7 +491,7 @@
         )
 
     @Test
-    fun gives_disabled_compact_button_primary_colors() =
+    public fun gives_disabled_compact_button_primary_colors() =
         verifyCompactButtonColors(
             Status.Disabled,
             { ButtonDefaults.primaryButtonColors() },
@@ -500,7 +500,7 @@
         )
 
     @Test
-    fun gives_enabled_button_secondary_colors() =
+    public fun gives_enabled_button_secondary_colors() =
         verifyButtonColors(
             Status.Enabled,
             { ButtonDefaults.secondaryButtonColors() },
@@ -509,7 +509,7 @@
         )
 
     @Test
-    fun gives_enabled_compact_button_secondary_colors() =
+    public fun gives_enabled_compact_button_secondary_colors() =
         verifyCompactButtonColors(
             Status.Enabled,
             { ButtonDefaults.secondaryButtonColors() },
@@ -518,7 +518,7 @@
         )
 
     @Test
-    fun gives_disabled_button_secondary_colors() =
+    public fun gives_disabled_button_secondary_colors() =
         verifyButtonColors(
             Status.Disabled,
             { ButtonDefaults.secondaryButtonColors() },
@@ -527,7 +527,7 @@
         )
 
     @Test
-    fun gives_disabled_compact_button_secondary_colors() =
+    public fun gives_disabled_compact_button_secondary_colors() =
         verifyCompactButtonColors(
             Status.Disabled,
             { ButtonDefaults.secondaryButtonColors() },
@@ -536,7 +536,7 @@
         )
 
     @Test
-    fun gives_enabled_button_icon_colors() =
+    public fun gives_enabled_button_icon_colors() =
         verifyButtonColors(
             Status.Enabled,
             { ButtonDefaults.iconButtonColors() },
@@ -545,7 +545,7 @@
         )
 
     @Test
-    fun gives_enabled_compact_button_icon_colors() =
+    public fun gives_enabled_compact_button_icon_colors() =
         verifyCompactButtonColors(
             Status.Enabled,
             { ButtonDefaults.iconButtonColors() },
@@ -554,7 +554,7 @@
         )
 
     @Test
-    fun gives_disabled_button_icon_colors() =
+    public fun gives_disabled_button_icon_colors() =
         verifyButtonColors(
             Status.Disabled,
             { ButtonDefaults.iconButtonColors() },
@@ -563,7 +563,7 @@
         )
 
     @Test
-    fun gives_disabled_compact_button_icon_colors() =
+    public fun gives_disabled_compact_button_icon_colors() =
         verifyCompactButtonColors(
             Status.Disabled,
             { ButtonDefaults.iconButtonColors() },
@@ -573,7 +573,7 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun allows_button_custom_enabled_background_color_override() {
+    public fun allows_button_custom_enabled_background_color_override() {
         val overrideColor = Color.Yellow
         rule.setContentWithTheme {
             Box(modifier = Modifier.fillMaxSize()) {
@@ -594,7 +594,7 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun allows_compactbutton_custom_enabled_background_color_override() {
+    public fun allows_compactbutton_custom_enabled_background_color_override() {
         val overrideColor = Color.Yellow
         rule.setContentWithTheme {
             Box(modifier = Modifier.fillMaxSize()) {
@@ -615,7 +615,7 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun allows_button_custom_disabled_background_color_override() {
+    public fun allows_button_custom_disabled_background_color_override() {
         val overrideColor = Color.Yellow
         rule.setContentWithTheme {
             Box(modifier = Modifier.fillMaxSize()) {
@@ -636,7 +636,7 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun allows_compactbutton_custom_disabled_background_color_override() {
+    public fun allows_compactbutton_custom_disabled_background_color_override() {
         val overrideColor = Color.Yellow
         rule.setContentWithTheme {
             Box(modifier = Modifier.fillMaxSize()) {
@@ -656,7 +656,7 @@
     }
 
     @Test
-    fun allows_button_custom_enabled_content_color_override() {
+    public fun allows_button_custom_enabled_content_color_override() {
         val overrideColor = Color.Red
         var actualContentColor = Color.Transparent
         rule.setContentWithTheme {
@@ -674,7 +674,7 @@
     }
 
     @Test
-    fun allows_compactbutton_custom_enabled_content_color_override() {
+    public fun allows_compactbutton_custom_enabled_content_color_override() {
         val overrideColor = Color.Red
         var actualContentColor = Color.Transparent
         rule.setContentWithTheme {
@@ -692,7 +692,7 @@
     }
 
     @Test
-    fun allows_button_custom_disabled_content_color_override() {
+    public fun allows_button_custom_disabled_content_color_override() {
         val overrideColor = Color.Yellow
         var actualContentColor = Color.Transparent
         rule.setContentWithTheme {
@@ -710,7 +710,7 @@
     }
 
     @Test
-    fun allows_compactbutton_custom_disabled_content_color_override() {
+    public fun allows_compactbutton_custom_disabled_content_color_override() {
         val overrideColor = Color.Yellow
         var actualContentColor = Color.Transparent
         rule.setContentWithTheme {
@@ -727,7 +727,7 @@
         assertEquals(overrideColor, actualContentColor)
     }
 
-    fun verifyButtonColors(
+    public fun verifyButtonColors(
         status: Status,
         buttonColors: @Composable () -> ButtonColors,
         backgroundColor: @Composable () -> Color,
@@ -751,7 +751,7 @@
         }
     }
 
-    fun verifyCompactButtonColors(
+    public fun verifyCompactButtonColors(
         status: Status,
         buttonColors: @Composable () -> ButtonColors,
         backgroundColor: @Composable () -> Color,
@@ -819,12 +819,12 @@
     }
 }
 
-class ButtonTextStyleTest {
+public class ButtonTextStyleTest {
     @get:Rule
-    val rule = createComposeRule()
+    public val rule = createComposeRule()
 
     @Test
-    fun gives_button_correct_font() {
+    public fun gives_button_correct_font() {
         var actualTextStyle = TextStyle.Default
         var expectedTextStyle = TextStyle.Default
 
@@ -841,7 +841,7 @@
     }
 
     @Test
-    fun gives_compactbutton_correct_font() {
+    public fun gives_compactbutton_correct_font() {
         var actualTextStyle = TextStyle.Default
         var expectedTextStyle = TextStyle.Default
 
@@ -909,9 +909,9 @@
     Large(60.dp)
 }
 
-enum class Status {
+public enum class Status {
     Enabled,
     Disabled;
 
-    fun enabled() = this == Enabled
+    public fun enabled() = this == Enabled
 }
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/InlineSliderTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/InlineSliderTest.kt
index 54dce95..2f21e7c 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/InlineSliderTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/InlineSliderTest.kt
@@ -38,12 +38,12 @@
 import org.junit.Test
 
 @ExperimentalWearMaterialApi
-class InlineSliderTest {
+public class InlineSliderTest {
     @get:Rule
-    val rule = createComposeRule()
+    public val rule = createComposeRule()
 
     @Test
-    fun supports_testtag() {
+    public fun supports_testtag() {
         rule.setContentWithTheme {
             InlineSlider(
                 value = 1f,
@@ -57,7 +57,7 @@
     }
 
     @Test
-    fun coerces_value_top_limit() {
+    public fun coerces_value_top_limit() {
         val state = mutableStateOf(4f)
 
         rule.setContentWithTheme {
@@ -77,7 +77,7 @@
     }
 
     @Test
-    fun coerces_value_lower_limit() {
+    public fun coerces_value_lower_limit() {
         val state = mutableStateOf(4f)
 
         rule.setContentWithTheme {
@@ -97,14 +97,14 @@
     }
 
     @Test(expected = IllegalArgumentException::class)
-    fun throws_when_steps_negative() {
+    public fun throws_when_steps_negative() {
         rule.setContent {
             InlineSlider(value = 0f, onValueChange = {}, steps = -1)
         }
     }
 
     @Test
-    fun snaps_value_exactly() {
+    public fun snaps_value_exactly() {
         val state = mutableStateOf(0f)
         val range = 0f..1f
 
@@ -127,7 +127,7 @@
     }
 
     @Test
-    fun snaps_value_to_previous() {
+    public fun snaps_value_to_previous() {
         val state = mutableStateOf(0f)
         val range = 0f..1f
 
@@ -150,7 +150,7 @@
     }
 
     @Test
-    fun snaps_value_to_next() {
+    public fun snaps_value_to_next() {
         val state = mutableStateOf(0f)
         val range = 0f..1f
 
@@ -173,7 +173,7 @@
     }
 
     @Test
-    fun decreases_value_by_clicking_left() {
+    public fun decreases_value_by_clicking_left() {
         val state = mutableStateOf(2f)
         rule.setContentWithTheme {
             InlineSlider(
@@ -192,7 +192,7 @@
     }
 
     @Test
-    fun increases_value_by_clicking_right() {
+    public fun increases_value_by_clicking_right() {
         val state = mutableStateOf(2f)
         rule.setContentWithTheme {
             InlineSlider(
@@ -211,7 +211,7 @@
     }
 
     @Test
-    fun ignores_left_click_when_disabled() {
+    public fun ignores_left_click_when_disabled() {
         val state = mutableStateOf(2f)
         rule.setContentWithTheme {
             InlineSlider(
@@ -231,7 +231,7 @@
     }
 
     @Test
-    fun ignores_right_click_when_disabled() {
+    public fun ignores_right_click_when_disabled() {
         val state = mutableStateOf(2f)
         rule.setContentWithTheme {
             InlineSlider(
@@ -251,7 +251,7 @@
     }
 
     @Test
-    fun reaches_min_clicking_left() {
+    public fun reaches_min_clicking_left() {
         val state = mutableStateOf(1f)
         rule.setContentWithTheme {
             InlineSlider(
@@ -270,7 +270,7 @@
     }
 
     @Test
-    fun reaches_max_clicking_right() {
+    public fun reaches_max_clicking_right() {
         val state = mutableStateOf(4f)
         rule.setContentWithTheme {
             InlineSlider(
@@ -289,7 +289,7 @@
     }
 
     @Test
-    fun sets_custom_decrease_icon() {
+    public fun sets_custom_decrease_icon() {
         val iconTag = "iconTag_test"
 
         rule.setContentWithTheme {
@@ -315,7 +315,7 @@
     }
 
     @Test
-    fun sets_custom_increase_icon() {
+    public fun sets_custom_increase_icon() {
         val iconTag = "iconTag_test"
 
         rule.setContentWithTheme {
@@ -347,3 +347,260 @@
     private val IconsOuterHorizontalMargin = 8.dp
     private val DefaultIconWidth = 24.dp
 }
+
+@ExperimentalWearMaterialApi
+public class IntegerInlineSliderTest {
+    @get:Rule
+    public val rule = createComposeRule()
+
+    @Test
+    public fun supports_testtag() {
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = 1,
+                onValueChange = {},
+                valueProgression = 0..10,
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG).assertExists()
+    }
+
+    @Test
+    public fun default_step_in_valueProgression() {
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = 2,
+                onValueChange = {},
+                valueProgression = 0..10,
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(2f, 0f..10f, 9))
+    }
+
+    @Test
+    public fun custom_valueProgression() {
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = 2,
+                onValueChange = {},
+                valueProgression = IntProgression.fromClosedRange(0, 10, 2),
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(2f, 0f..10f, 4))
+    }
+
+    @Test
+    public fun valueProgression_trimmed() {
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = 6,
+                onValueChange = {},
+                valueProgression = IntProgression.fromClosedRange(0, 16, 6),
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(6f, 0f..12f, 1))
+    }
+
+    @Test
+    public fun coerces_value_top_limit() {
+        val state = mutableStateOf(4)
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = 0..10,
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+        rule.runOnIdle {
+            state.value = 20
+        }
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(10f, 0f..10f, 9))
+    }
+
+    @Test
+    public fun coerces_value_lower_limit() {
+        val state = mutableStateOf(4)
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = 0..10,
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+        rule.runOnIdle {
+            state.value = -20
+        }
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..10f, 9))
+    }
+
+    @Test
+    public fun snaps_value_exactly() {
+        val state = mutableStateOf(0)
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = IntProgression.fromClosedRange(0, 12, 3)
+            )
+        }
+
+        rule.runOnUiThread {
+            state.value = 6
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(6f, 0f..12f, 3))
+    }
+
+    @Test
+    public fun snaps_value_to_previous() {
+        val state = mutableStateOf(0)
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = IntProgression.fromClosedRange(0, 12, 3)
+            )
+        }
+
+        rule.runOnUiThread {
+            state.value = 7
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(6f, 0f..12f, 3))
+    }
+
+    @Test
+    public fun snaps_value_to_next() {
+        val state = mutableStateOf(0)
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = IntProgression.fromClosedRange(0, 12, 3)
+            )
+        }
+
+        rule.runOnUiThread {
+            state.value = 8
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(9f, 0f..12f, 3))
+    }
+
+    @Test
+    public fun decreases_value_by_clicking_left() {
+        val state = mutableStateOf(2)
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = 1..4,
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG).performTouchInput { click(Offset(15f, height / 2f)) }
+        rule.runOnIdle {
+            Truth.assertThat(state.value).isEqualTo(1)
+        }
+    }
+
+    @Test
+    public fun increases_value_by_clicking_right() {
+        val state = mutableStateOf(2)
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = 1..4,
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG).performTouchInput { click(Offset(width - 15f, height / 2f)) }
+        rule.runOnIdle {
+            Truth.assertThat(state.value).isEqualTo(3)
+        }
+    }
+
+    @Test
+    public fun ignores_left_click_when_disabled() {
+        val state = mutableStateOf(2)
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                enabled = false,
+                onValueChange = { state.value = it },
+                valueProgression = 1..4,
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG).performTouchInput { click(Offset(15f, height / 2f)) }
+        rule.runOnIdle {
+            Truth.assertThat(state.value).isEqualTo(2)
+        }
+    }
+
+    @Test
+    public fun reaches_min_clicking_left() {
+        val state = mutableStateOf(1)
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = 1..4,
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG).performTouchInput { click(Offset(15f, height / 2f)) }
+        rule.runOnIdle {
+            Truth.assertThat(state.value).isEqualTo(1)
+        }
+    }
+
+    @Test
+    public fun reaches_max_clicking_right() {
+        val state = mutableStateOf(4)
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueProgression = 1..4,
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG).performTouchInput { click(Offset(width - 15f, height / 2f)) }
+        rule.runOnIdle {
+            Truth.assertThat(state.value).isEqualTo(4)
+        }
+    }
+}
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt
index 9f11543..cafe043 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/PositionIndicatorTest.kt
@@ -92,6 +92,8 @@
             )
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(
                 positionIndicatorState.positionFraction
@@ -130,6 +132,8 @@
             )
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(
                 positionIndicatorState.positionFraction
@@ -171,6 +175,8 @@
             )
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(
                 positionIndicatorState.positionFraction
@@ -212,6 +218,8 @@
             )
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             // Scroll forwards so that item with index 2 is in the center of the viewport
             runBlocking {
@@ -258,6 +266,8 @@
             )
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(
                 positionIndicatorState.positionFraction
@@ -302,6 +312,8 @@
             )
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(
                 positionIndicatorState.positionFraction
@@ -346,6 +358,8 @@
             )
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             runBlocking {
                 state.scrollBy(itemSizePx.toFloat() + itemSpacingPx.toFloat())
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnIndexedTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnIndexedTest.kt
index afad32f..aa721fd 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnIndexedTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnIndexedTest.kt
@@ -41,10 +41,12 @@
 
     @Test
     fun scalingLazyColumnShowsIndexedItems() {
+        lateinit var state: ScalingLazyListState
         val items = (1..4).map { it.toString() }
 
         rule.setContent {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState().also { state = it },
                 modifier = Modifier.height(200.dp),
                 scalingParams = ScalingLazyColumnDefaults.scalingParams(edgeScale = 1.0f)
             ) {
@@ -57,6 +59,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         // Fully visible
         rule.onNodeWithTag("0-1")
             .assertIsDisplayed()
@@ -76,10 +80,15 @@
 
     @Test
     fun columnWithIndexesComposedWithCorrectIndexAndItem() {
+        lateinit var state: ScalingLazyListState
         val items = (0..1).map { it.toString() }
 
         rule.setContent {
-            ScalingLazyColumn(Modifier.height(200.dp), autoCentering = false) {
+            ScalingLazyColumn(
+                state = rememberScalingLazyListState().also { state = it },
+                modifier = Modifier.height(200.dp),
+                autoCentering = false
+            ) {
                 itemsIndexed(items) { index, item ->
                     BasicText(
                         "${index}x$item", Modifier.requiredHeight(100.dp)
@@ -88,6 +97,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithText("0x0")
             .assertTopPositionInRootIsEqualTo(0.dp)
 
@@ -97,12 +108,14 @@
 
     @Test
     fun columnWithIndexesComposedWithCorrectIndexAndItemWithAutoCentering() {
+        lateinit var state: ScalingLazyListState
         val items = (0..1).map { it.toString() }
         val viewPortHeight = 200.dp
         val itemHeight = 100.dp
         val gapBetweenItems = 4.dp
         rule.setContent {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState().also { state = it },
                 modifier = Modifier.height(viewPortHeight),
                 autoCentering = true,
                 verticalArrangement = Arrangement.spacedBy(gapBetweenItems)
@@ -115,6 +128,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         // Check that first item is in the center of the viewport
         val firstItemStart = viewPortHeight / 2f - itemHeight / 2f
         rule.onNodeWithText("0x0")
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
index f5bda9e..7381fd3 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
@@ -89,6 +89,8 @@
                 }
             }
         }
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
         rule.onNodeWithTag(TEST_TAG).performTouchInput {
             swipeUp(endY = bottom - (itemSizePx.toFloat() + defaultItemSpacingPx.toFloat()))
@@ -116,6 +118,8 @@
                 }
             }
         }
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
         state.layoutInfo.assertVisibleItems(count = 3, startIndex = 0)
 
@@ -148,6 +152,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithTag(TEST_TAG).performTouchInput {
             swipeDown(
                 startY = top,
@@ -178,6 +184,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
         rule.mainClock.autoAdvance = false
         rule.onNodeWithTag(TEST_TAG).performTouchInput {
@@ -211,6 +219,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
         rule.mainClock.autoAdvance = false
         rule.onNodeWithTag(TEST_TAG).performTouchInput {
@@ -253,6 +263,8 @@
                 ObservingFun(state, currentInfo)
             }
         }
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
         rule.mainClock.autoAdvance = false
         currentInfo.value = null
@@ -292,8 +304,10 @@
 
     @Test
     fun itemFillingParentWidth() {
+        lateinit var state: ScalingLazyListState
         rule.setContentWithTestViewConfiguration {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState(8).also { state = it },
                 modifier = Modifier.requiredSize(width = 100.dp, height = 150.dp),
                 contentPadding = PaddingValues(horizontal = 0.dp),
                 scalingParams = ScalingLazyColumnDefaults.scalingParams(1.0f, 1.0f)
@@ -306,6 +320,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithTag(firstItemTag)
             .assertWidthIsEqualTo(100.dp)
             .assertHeightIsEqualTo(50.dp)
@@ -313,8 +329,10 @@
 
     @Test
     fun itemFillingParentHeight() {
+        lateinit var state: ScalingLazyListState
         rule.setContentWithTestViewConfiguration {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState(8).also { state = it },
                 modifier = Modifier.requiredSize(width = 100.dp, height = 150.dp),
                 scalingParams = ScalingLazyColumnDefaults.scalingParams(1.0f, 1.0f)
             ) {
@@ -326,6 +344,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithTag(firstItemTag)
             .assertWidthIsEqualTo(50.dp)
             .assertHeightIsEqualTo(150.dp)
@@ -333,8 +353,10 @@
 
     @Test
     fun itemFillingParentSize() {
+        lateinit var state: ScalingLazyListState
         rule.setContentWithTestViewConfiguration {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState(8).also { state = it },
                 modifier = Modifier.requiredSize(width = 100.dp, height = 150.dp),
                 contentPadding = PaddingValues(horizontal = 0.dp),
                 scalingParams = ScalingLazyColumnDefaults.scalingParams(1.0f, 1.0f)
@@ -345,6 +367,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithTag(firstItemTag)
             .assertWidthIsEqualTo(100.dp)
             .assertHeightIsEqualTo(150.dp)
@@ -352,8 +376,10 @@
 
     @Test
     fun itemFillingParentWidthFraction() {
+        lateinit var state: ScalingLazyListState
         rule.setContentWithTestViewConfiguration {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState(8).also { state = it },
                 modifier = Modifier.requiredSize(width = 100.dp, height = 150.dp),
                 contentPadding = PaddingValues(horizontal = 0.dp),
                 scalingParams = ScalingLazyColumnDefaults.scalingParams(1.0f, 1.0f)
@@ -368,6 +394,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithTag(firstItemTag)
             .assertWidthIsEqualTo(70.dp)
             .assertHeightIsEqualTo(50.dp)
@@ -375,8 +403,12 @@
 
     @Test
     fun itemFillingParentHeightFraction() {
+        lateinit var state: ScalingLazyListState
         rule.setContentWithTestViewConfiguration {
-            ScalingLazyColumn(Modifier.requiredSize(width = 100.dp, height = 150.dp)) {
+            ScalingLazyColumn(
+                state = rememberScalingLazyListState(8).also { state = it },
+                modifier = Modifier.requiredSize(width = 100.dp, height = 150.dp)
+            ) {
                 items(listOf(0)) {
                     Spacer(
                         Modifier.requiredWidth(50.dp)
@@ -387,6 +419,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithTag(firstItemTag)
             .assertWidthIsEqualTo(50.dp)
             .assertHeightIsEqualTo(45.dp)
@@ -394,8 +428,10 @@
 
     @Test
     fun itemFillingParentSizeFraction() {
+        lateinit var state: ScalingLazyListState
         rule.setContentWithTestViewConfiguration {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState(8).also { state = it },
                 modifier = Modifier.requiredSize(width = 100.dp, height = 150.dp),
                 contentPadding = PaddingValues(horizontal = 0.dp)
             ) {
@@ -405,6 +441,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.onNodeWithTag(firstItemTag)
             .assertWidthIsEqualTo(50.dp)
             .assertHeightIsEqualTo(75.dp)
@@ -412,9 +450,11 @@
 
     @Test
     fun itemFillingParentSizeParentResized() {
+        lateinit var state: ScalingLazyListState
         var parentSize by mutableStateOf(100.dp)
         rule.setContentWithTestViewConfiguration {
             ScalingLazyColumn(
+                state = rememberScalingLazyListState(8).also { state = it },
                 modifier = Modifier.requiredSize(parentSize),
                 contentPadding = PaddingValues(horizontal = 0.dp),
             ) {
@@ -424,6 +464,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             parentSize = 150.dp
         }
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyListLayoutInfoTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyListLayoutInfoTest.kt
index 2ac17d5..00870c1 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyListLayoutInfoTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyListLayoutInfoTest.kt
@@ -83,6 +83,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             state.layoutInfo.assertVisibleItems(count = 4)
         }
@@ -106,6 +108,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(state.centerItemIndex).isEqualTo(1)
             state.layoutInfo.assertVisibleItems(count = 4)
@@ -130,6 +134,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(state.centerItemIndex).isEqualTo(0)
             assertThat(state.centerItemScrollOffset).isEqualTo(0)
@@ -154,6 +160,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             runBlocking {
                 state.scrollBy(itemSizePx.toFloat() + defaultItemSpacingPx.toFloat())
@@ -179,6 +187,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             runBlocking {
                 state.scrollBy(itemSizePx.toFloat() + defaultItemSpacingPx.toFloat())
@@ -207,6 +217,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             // Get the middle item on the screen
             val centerScreenItem =
@@ -236,6 +248,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             runBlocking {
                 state.scrollBy(itemSizePx.toFloat() + defaultItemSpacingPx.toFloat())
@@ -261,6 +275,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             state.layoutInfo.assertVisibleItems(count = 3, startIndex = 1)
             assertThat(state.centerItemIndex).isEqualTo(2)
@@ -285,6 +301,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             state.layoutInfo.assertVisibleItems(count = 3, startIndex = 1)
             assertThat(state.centerItemIndex).isEqualTo(2)
@@ -310,6 +328,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             state.layoutInfo.assertVisibleItems(count = 3, startIndex = 1)
             assertThat(state.centerItemIndex).isEqualTo(2)
@@ -335,6 +355,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             state.layoutInfo.assertVisibleItems(count = 3, startIndex = 1)
             assertThat(state.centerItemIndex).isEqualTo(2)
@@ -360,6 +382,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
 
         // Assert that items are being shown at the end of the parent as this is reverseLayout
@@ -391,6 +415,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
 
         rule.onNodeWithTag(testTag = "Item:0").assertIsDisplayed()
@@ -434,6 +460,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.waitForIdle()
 
         rule.onNodeWithTag(testTag = "Item:8").assertIsDisplayed()
@@ -476,6 +504,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         val scrollAmount = itemSizePx.toFloat() + defaultItemSpacingPx.toFloat()
         rule.runOnIdle {
             runBlocking {
@@ -513,6 +543,8 @@
                 }
             }
         }
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         val firstItemOffset = state.layoutInfo.visibleItemsInfo.first().offset
         rule.runOnIdle {
             runBlocking {
@@ -548,6 +580,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             val spacingPx = with(rule.density) {
                 spacing.roundToPx()
@@ -584,6 +618,8 @@
             ObservingFun(state, currentInfo)
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             // empty it here and scrolling should invoke observingFun again
             currentInfo.value = null
@@ -615,6 +651,8 @@
             ObservingFun(state, currentInfo)
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             // empty it here and scrolling should invoke observingFun again
             currentInfo.value = null
@@ -658,6 +696,8 @@
             ObservingIsScrollInProgressTrueFun(state, currentInfo)
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         scope!!.launch {
             // empty it here and scrolling should invoke observingFun again
             currentInfo.value = null
@@ -697,6 +737,8 @@
             ObservingCentralItemIndexFun(state, currentInfo)
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         scope!!.launch {
             // empty it here and scrolling should invoke observingFun again
             currentInfo.value = null
@@ -729,6 +771,8 @@
             observingFun()
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(currentInfo).isNotNull()
             currentInfo!!.assertVisibleItems(count = 1, unscaledSize = itemSizePx * 2)
@@ -758,6 +802,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(0)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx)
@@ -785,6 +831,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(-startPaddingPx)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx - startPaddingPx)
@@ -808,6 +856,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(state.layoutInfo.viewportStartOffset).isEqualTo(0)
             assertThat(state.layoutInfo.viewportEndOffset).isEqualTo(sizePx)
@@ -828,6 +878,8 @@
             }
         }
 
+        // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+        rule.waitUntil { state.initialized.value }
         rule.runOnIdle {
             assertThat(state.layoutInfo.totalItemsCount).isEqualTo(10)
             count = 20
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperScreenshotTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperScreenshotTest.kt
index 888b3c1..c7e3477 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperScreenshotTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperScreenshotTest.kt
@@ -46,18 +46,18 @@
 @MediumTest
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
-class StepperScreenshotTest {
+public class StepperScreenshotTest {
     @get:Rule
-    val rule = createComposeRule()
+    public val rule = createComposeRule()
 
     @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(SCREENSHOT_GOLDEN_PATH)
+    public val screenshotRule = AndroidXScreenshotTestRule(SCREENSHOT_GOLDEN_PATH)
 
     @get:Rule
-    val testName = TestName()
+    public val testName = TestName()
 
     @Test
-    fun stepper_no_content() {
+    public fun stepper_no_content() {
         rule.setContentWithThemeAndBackground {
             Stepper(
                 modifier = Modifier.testTag(TEST_TAG),
@@ -73,7 +73,7 @@
     }
 
     @Test
-    fun stepper_custom_icons() {
+    public fun stepper_custom_icons() {
         rule.setContentWithThemeAndBackground {
             Stepper(
                 modifier = Modifier.testTag(TEST_TAG),
@@ -101,7 +101,7 @@
     }
 
     @Test
-    fun stepper_with_content() {
+    public fun stepper_with_content() {
         rule.setContentWithThemeAndBackground {
             Stepper(
                 modifier = Modifier.testTag(TEST_TAG),
@@ -124,7 +124,7 @@
     }
 
     @Test
-    fun stepper_with_custom_colors() {
+    public fun stepper_with_custom_colors() {
         rule.setContentWithThemeAndBackground {
             Stepper(
                 modifier = Modifier.testTag(TEST_TAG),
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperTest.kt
index dd43f76..d38c8d6 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/StepperTest.kt
@@ -42,12 +42,12 @@
 import org.junit.Test
 
 @ExperimentalWearMaterialApi
-class StepperTest {
+public class StepperTest {
     @get:Rule
-    val rule = createComposeRule()
+    public val rule = createComposeRule()
 
     @Test
-    fun supports_testtag() {
+    public fun supports_testtag() {
         rule.setContentWithTheme {
             Stepper(
                 value = 1f,
@@ -61,7 +61,7 @@
     }
 
     @Test
-    fun coerces_value_top_limit() = rule.setNewValueAndCheck(
+    public fun coerces_value_top_limit() = rule.setNewValueAndCheck(
         range = 0f..10f,
         steps = 4,
         initialValue = 4f,
@@ -70,7 +70,7 @@
     )
 
     @Test
-    fun coerces_value_lower_limit() = rule.setNewValueAndCheck(
+    public fun coerces_value_lower_limit() = rule.setNewValueAndCheck(
         range = 0f..10f,
         steps = 4,
         initialValue = 4f,
@@ -79,7 +79,7 @@
     )
 
     @Test
-    fun coerces_value_top_limit_and_doesnt_change_state() {
+    public fun coerces_value_top_limit_and_doesnt_change_state() {
         val state = mutableStateOf(4f)
         val valueRange = 0f..10f
 
@@ -92,7 +92,7 @@
     }
 
     @Test
-    fun coerces_value_lower_limit_and_doesnt_change_state() {
+    public fun coerces_value_lower_limit_and_doesnt_change_state() {
         val state = mutableStateOf(4f)
         val valueRange = 0f..10f
 
@@ -105,14 +105,14 @@
     }
 
     @Test(expected = IllegalArgumentException::class)
-    fun throws_when_steps_negative() {
+    public fun throws_when_steps_negative() {
         rule.setContent {
             Stepper(value = 0f, onValueChange = {}, steps = -1) {}
         }
     }
 
     @Test
-    fun snaps_value_exactly() = rule.setNewValueAndCheck(
+    public fun snaps_value_exactly() = rule.setNewValueAndCheck(
         range = 0f..1f,
         steps = 4,
         initialValue = 0f,
@@ -122,7 +122,7 @@
     )
 
     @Test
-    fun snaps_value_to_previous() = rule.setNewValueAndCheck(
+    public fun snaps_value_to_previous() = rule.setNewValueAndCheck(
         range = 0f..1f,
         steps = 4,
         initialValue = 0f,
@@ -132,7 +132,7 @@
     )
 
     @Test
-    fun snaps_value_to_next() = rule.setNewValueAndCheck(
+    public fun snaps_value_to_next() = rule.setNewValueAndCheck(
         range = 0f..1f,
         steps = 4,
         initialValue = 0f,
@@ -142,7 +142,7 @@
     )
 
     @Test
-    fun snaps_value_to_next_and_does_not_change_state() {
+    public fun snaps_value_to_next_and_does_not_change_state() {
         val state = mutableStateOf(0f)
         val valueRange = 0f..1f
 
@@ -155,7 +155,7 @@
     }
 
     @Test
-    fun decreases_value_by_clicking_bottom() {
+    public fun decreases_value_by_clicking_bottom() {
         val state = mutableStateOf(2f)
         val range = 1f..4f
 
@@ -170,7 +170,7 @@
     }
 
     @Test
-    fun increases_value_by_clicking_top() {
+    public fun increases_value_by_clicking_top() {
         val state = mutableStateOf(2f)
         val range = 1f..4f
 
@@ -185,7 +185,7 @@
     }
 
     @Test
-    fun reaches_min_clicking_bottom() {
+    public fun reaches_min_clicking_bottom() {
         val state = mutableStateOf(1f)
         val range = 1f..4f
 
@@ -200,7 +200,7 @@
     }
 
     @Test
-    fun reaches_max_clicking_top() {
+    public fun reaches_max_clicking_top() {
         val state = mutableStateOf(4f)
         val range = 1f..4f
 
@@ -215,7 +215,7 @@
     }
 
     @Test
-    fun sets_custom_decrease_icon() {
+    public fun sets_custom_decrease_icon() {
         val iconTag = "iconTag_test"
 
         rule.setContentWithTheme {
@@ -245,7 +245,7 @@
     }
 
     @Test
-    fun sets_custom_increase_icon() {
+    public fun sets_custom_increase_icon() {
         val iconTag = "iconTag_test"
 
         rule.setContentWithTheme {
@@ -270,7 +270,7 @@
     }
 
     @Test
-    fun sets_content() {
+    public fun sets_content() {
         val contentTag = "contentTag_test"
 
         rule.setContentWithTheme {
@@ -302,6 +302,107 @@
     private val DefaultIconHeight = 24.dp
 }
 
+@ExperimentalWearMaterialApi
+public class IntegerStepperTest {
+    @get:Rule
+    public val rule = createComposeRule()
+
+    @Test
+    public fun supports_testtag() {
+        rule.setContentWithTheme {
+            Stepper(
+                value = 1,
+                onValueChange = {},
+                valueProgression = 0..5,
+                modifier = Modifier.testTag(TEST_TAG)
+            ) {}
+        }
+
+        rule.onNodeWithTag(TEST_TAG).assertExists()
+    }
+
+    @Test
+    public fun default_step_in_valueProgression() {
+        rule.setContentWithTheme {
+            Stepper(
+                value = 1,
+                onValueChange = {},
+                valueProgression = 0..10,
+                modifier = Modifier.testTag(TEST_TAG)
+            ) {}
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(1f, 0f..10f, 9))
+    }
+
+    @Test
+    public fun coerces_value_top_limit() = rule.setNewValueAndCheck(
+        progression = 0..10,
+        initialValue = 4,
+        newValue = 20,
+        expectedValue = 10
+    )
+
+    @Test
+    public fun coerces_value_lower_limit() = rule.setNewValueAndCheck(
+        progression = 0..10,
+        initialValue = 4,
+        newValue = -20,
+        expectedValue = 0
+    )
+
+    @Test
+    public fun coerces_value_top_limit_and_doesnt_change_state() {
+        val state = mutableStateOf(4)
+        val valueProgression = 0..10
+
+        rule.initDefaultStepper(state, valueProgression)
+
+        rule.runOnIdle {
+            state.value = 20
+        }
+        assertEquals(20, state.value)
+    }
+
+    @Test
+    public fun coerces_value_lower_limit_and_doesnt_change_state() {
+        val state = mutableStateOf(4)
+        val valueProgression = 0..10
+
+        rule.initDefaultStepper(state, valueProgression)
+
+        rule.runOnIdle {
+            state.value = -20
+        }
+        assertEquals(-20, state.value)
+    }
+
+    @Test
+    public fun snaps_value_exactly() = rule.setNewValueAndCheck(
+        progression = IntProgression.fromClosedRange(0, 12, 3),
+        initialValue = 0,
+        newValue = 3,
+        expectedValue = 3
+    )
+
+    @Test
+    public fun snaps_value_to_previous() = rule.setNewValueAndCheck(
+        progression = IntProgression.fromClosedRange(0, 12, 3),
+        initialValue = 0,
+        newValue = 4,
+        expectedValue = 3
+    )
+
+    @Test
+    public fun snaps_value_to_next() = rule.setNewValueAndCheck(
+        progression = IntProgression.fromClosedRange(0, 12, 3),
+        initialValue = 0,
+        newValue = 5,
+        expectedValue = 6
+    )
+}
+
 private fun ComposeContentTestRule.setNewValueAndCheck(
     range: ClosedFloatingPointRange<Float>,
     steps: Int,
@@ -333,3 +434,38 @@
         ) {}
     }
 }
+
+private fun ComposeContentTestRule.setNewValueAndCheck(
+    progression: IntProgression,
+    initialValue: Int,
+    newValue: Int,
+    expectedValue: Int
+) {
+    val state = mutableStateOf(initialValue)
+
+    initDefaultStepper(state, progression)
+
+    runOnIdle { state.value = newValue }
+    onNodeWithTag(TEST_TAG)
+        .assertRangeInfoEquals(
+            ProgressBarRangeInfo(
+                expectedValue.toFloat(),
+                progression.first.toFloat()..progression.last.toFloat(),
+                progression.stepsNumber()
+            )
+        )
+}
+
+private fun ComposeContentTestRule.initDefaultStepper(
+    state: MutableState<Int>,
+    valueProgression: IntProgression,
+) {
+    setContentWithTheme {
+        Stepper(
+            value = state.value,
+            onValueChange = { state.value = it },
+            valueProgression = valueProgression,
+            modifier = Modifier.testTag(TEST_TAG)
+        ) {}
+    }
+}
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/RangeDefaults.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/RangeDefaults.kt
index 706cc65..cba5570 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/RangeDefaults.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/RangeDefaults.kt
@@ -33,12 +33,12 @@
 internal object RangeIcons {
 
     /**
-     * An [Icon] with a minus sign.
+     * An [ImageVector] with a minus sign.
      */
-    val MinusIcon: ImageVector
-        get() = if (_minusIcon != null) _minusIcon!!
+    val Minus: ImageVector
+        get() = if (_minus != null) _minus!!
         else {
-            _minusIcon = materialIcon(name = "MinusIcon") {
+            _minus = materialIcon(name = "MinusIcon") {
                 materialPath {
                     moveTo(19.0f, 13.0f)
                     horizontalLineTo(5.0f)
@@ -48,10 +48,10 @@
                     close()
                 }
             }
-            _minusIcon!!
+            _minus!!
         }
 
-    private var _minusIcon: ImageVector? = null
+    private var _minus: ImageVector? = null
 }
 
 /**
@@ -105,3 +105,5 @@
     RangeDefaults.calculateCurrentStepValue(step, steps, valueRange),
     valueRange, steps
 )
+
+internal fun IntProgression.stepsNumber(): Int = (last - first) / step - 1
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
index b8a52fc..c8081d7 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
@@ -43,12 +43,12 @@
 import androidx.compose.ui.draw.drawWithContent
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.wear.compose.material.RangeDefaults.calculateCurrentStepValue
 import androidx.wear.compose.material.RangeDefaults.snapValueToStep
+import kotlin.math.roundToInt
 
 /**
  * [InlineSlider] allows users to make a selection from a range of values. The range of selections
@@ -73,8 +73,8 @@
  * @param value Current value of the Slider. If outside of [valueRange] provided, value will be
  * coerced to this range.
  * @param onValueChange Lambda in which value should be updated
- * @param steps Specifies the number of discrete values, evenly distributed
- * between across the whole value range. Must not be negative. If 0, slider will have only
+ * @param steps Specifies the number of discrete values, excluding min and max values, evenly
+ * distributed across the whole value range. Must not be negative. If 0, slider will have only
  * min and max values and no steps in between
  * @param modifier Modifiers for the Slider layout
  * @param enabled Controls the enabled state of the slider.
@@ -90,7 +90,7 @@
  * color for this slider in different states
  */
 @Composable
-fun InlineSlider(
+public fun InlineSlider(
     value: Float,
     onValueChange: (Float) -> Unit,
     steps: Int,
@@ -98,18 +98,8 @@
     enabled: Boolean = true,
     valueRange: ClosedFloatingPointRange<Float> = 0f..(steps + 1).toFloat(),
     segmented: Boolean = steps <= 8,
-    decreaseIcon: @Composable () -> Unit = {
-        Icon(
-            imageVector = InlineSliderDefaults.DecreaseIcon,
-            contentDescription = "Decrease" // TODO(b/204187777) i18n
-        )
-    },
-    increaseIcon: @Composable () -> Unit = {
-        Icon(
-            imageVector = InlineSliderDefaults.IncreaseIcon,
-            contentDescription = "Increase" // TODO(b/204187777) i18n
-        )
-    },
+    decreaseIcon: @Composable () -> Unit = { InlineSliderDefaults.DecreaseIcon() },
+    increaseIcon: @Composable () -> Unit = { InlineSliderDefaults.IncreaseIcon() },
     colors: InlineSliderColors = InlineSliderDefaults.colors(),
 ) {
     require(steps >= 0) { "steps should be >= 0" }
@@ -195,6 +185,74 @@
 }
 
 /**
+ * [InlineSlider] allows users to make a selection from a range of values. The range of selections
+ * is shown as a bar between the minimum and maximum values of the range,
+ * from which users may select a single value.
+ * InlineSlider is ideal for adjusting settings such as volume or brightness.
+ *
+ * Value can be increased and decreased by clicking on the increase and decrease buttons, located
+ * accordingly to the start and end of the control. Buttons can have custom icons -
+ * [decreaseIcon] and [increaseIcon].
+ *
+ * The bar in the middle of control can have separators if [segmented] flag is set to true.
+ * A number of steps is calculated as the difference between max and min values of
+ * [valueProgression] divided by [valueProgression].step - 1.
+ * For example, with a range of 100..120 and a step 5,
+ * number of steps will be (120-100)/ 5 - 1 = 3. Steps are 100(first), 105, 110, 115, 120(last)
+ *
+ * If [valueProgression] range is not equally divisible by [valueProgression].step,
+ * then [valueProgression].last will be adjusted to the closest divisible value in the range.
+ * For example, 1..13 range and a step = 5, steps will be 1(first) , 6 , 11(last)
+ *
+ * A continuous non-segmented slider sample:
+ * @sample androidx.wear.compose.material.samples.InlineSliderWithIntegerSample
+ *
+ * A segmented slider sample:
+ * @sample androidx.wear.compose.material.samples.InlineSliderSegmentedSample
+ *
+ * @param value Current value of the Slider. If outside of [valueProgression] provided, value will be
+ * coerced to this range.
+ * @param onValueChange Lambda in which value should be updated
+ * @param modifier Modifiers for the Slider layout
+ * @param enabled Controls the enabled state of the slider.
+ * When `false`, this slider will not be clickable
+ * @param valueProgression Progression of values that Slider value can take. Consists of
+ * rangeStart, rangeEnd and step. Range will be equally divided by step size
+ * @param segmented A boolean value which specifies whether a bar will be split into
+ * segments or not. Recommendation is while using this flag do not have more than 8 steps
+ * as it might affect user experience. By default true if number of steps is <=8.
+ * @param decreaseIcon A slot for an icon which is placed on the decrease (start) button
+ * @param increaseIcon A slot for an icon which is placed on the increase (end) button
+ * @param colors [InlineSliderColors] that will be used to resolve the background and content
+ * color for this slider in different states
+ */
+@Composable
+public fun InlineSlider(
+    value: Int,
+    onValueChange: (Int) -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    valueProgression: IntProgression,
+    segmented: Boolean = valueProgression.stepsNumber() <= 8,
+    decreaseIcon: @Composable () -> Unit = { InlineSliderDefaults.DecreaseIcon() },
+    increaseIcon: @Composable () -> Unit = { InlineSliderDefaults.IncreaseIcon() },
+    colors: InlineSliderColors = InlineSliderDefaults.colors(),
+) {
+    InlineSlider(
+        value = value.toFloat(),
+        onValueChange = { onValueChange(it.roundToInt()) },
+        steps = valueProgression.stepsNumber(),
+        modifier = modifier,
+        enabled = enabled,
+        valueRange = valueProgression.first.toFloat()..valueProgression.last.toFloat(),
+        segmented = segmented,
+        decreaseIcon = decreaseIcon,
+        increaseIcon = increaseIcon,
+        colors = colors
+    )
+}
+
+/**
  * Represents the background and content colors used in [InlineSlider] in different states.
  */
 @Stable
@@ -229,7 +287,7 @@
 /**
  * Defaults used by slider
  */
-object InlineSliderDefaults {
+public object InlineSliderDefaults {
 
     /**
      * The default height applied for the [InlineSlider].
@@ -264,7 +322,7 @@
      * @param disabledUnselectedBarColor The background color of the progress bar when disabled
      */
     @Composable
-    fun colors(
+    public fun colors(
         backgroundColor: Color = MaterialTheme.colors.surface,
         spacerColor: Color = MaterialTheme.colors.background,
         selectedBarColor: Color = MaterialTheme.colors.secondary,
@@ -284,17 +342,21 @@
         disabledUnselectedBarColor = disabledUnselectedBarColor
     )
 
-    /**
-     * A decrease [Icon].
-     */
-    val DecreaseIcon: ImageVector
-        get() = RangeIcons.MinusIcon
+    @Composable
+    internal fun DecreaseIcon() {
+        Icon(
+            imageVector = RangeIcons.Minus,
+            contentDescription = "Decrease" // TODO(b/204187777) i18n
+        )
+    }
 
-    /**
-     * An increase [Icon].
-     */
-    val IncreaseIcon: ImageVector
-        get() = Icons.Filled.Add
+    @Composable
+    internal fun IncreaseIcon() {
+        Icon(
+            imageVector = Icons.Filled.Add,
+            contentDescription = "Increase" // TODO(b/204187777) i18n
+        )
+    }
 }
 
 @Immutable
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt
index fa71cb1..7c4586a 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Stepper.kt
@@ -39,10 +39,10 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.unit.dp
 import androidx.wear.compose.material.RangeDefaults.calculateCurrentStepValue
 import androidx.wear.compose.material.RangeDefaults.snapValueToStep
+import kotlin.math.roundToInt
 
 /**
  * [Stepper] allows users to make a selection from a range of values.
@@ -59,8 +59,8 @@
  * @param value Current value of the Stepper. If outside of [valueRange] provided, value will be
  * coerced to this range.
  * @param onValueChange Lambda in which value should be updated
- * @param steps Specifies the number of discrete values, evenly distributed
- * between across the whole value range. Must not be negative. If 0, stepper will have only
+ * @param steps Specifies the number of discrete values, excluding min and max values, evenly
+ * distributed across the whole value range. Must not be negative. If 0, stepper will have only
  * min and max values and no steps in between
  * @param modifier Modifiers for the Stepper layout
  * @param valueRange Range of values that Stepper value can take. Passed [value] will be coerced to
@@ -73,26 +73,14 @@
  * that defaults to [contentColor], unless specifically overridden.
  */
 @Composable
-fun Stepper(
+public fun Stepper(
     value: Float,
     onValueChange: (Float) -> Unit,
     steps: Int,
     modifier: Modifier = Modifier,
     valueRange: ClosedFloatingPointRange<Float> = 0f..(steps + 1).toFloat(),
-    decreaseIcon: @Composable () -> Unit = {
-        Icon(
-            imageVector = StepperDefaults.DecreaseIcon,
-            contentDescription = "Decrease", // TODO(b/204187777) i18n
-            modifier = Modifier.padding(14.dp)
-        )
-    },
-    increaseIcon: @Composable () -> Unit = {
-        Icon(
-            imageVector = StepperDefaults.IncreaseIcon,
-            contentDescription = "Increase", // TODO(b/204187777) i18n
-            modifier = Modifier.padding(14.dp)
-        )
-    },
+    decreaseIcon: @Composable () -> Unit = { StepperDefaults.DecreaseIcon() },
+    increaseIcon: @Composable () -> Unit = { StepperDefaults.IncreaseIcon() },
     backgroundColor: Color = MaterialTheme.colors.background,
     contentColor: Color = contentColorFor(backgroundColor),
     iconTintColor: Color = contentColor,
@@ -147,6 +135,67 @@
     }
 }
 
+/**
+ * [Stepper] allows users to make a selection from a range of values.
+ * It's a full-screen control with increase button on the top, decrease button on the bottom and
+ * a slot (expected to have either [Text] or [Chip]) in the middle.
+ * Value can be increased and decreased by clicking on the increase and decrease buttons.
+ * Buttons can have custom icons - [decreaseIcon] and [increaseIcon].
+ * Stepper itself doesn't show the current value but can be displayed via the content slot or
+ * [PositionIndicator] if required.
+ *
+ * @sample androidx.wear.compose.material.samples.StepperWithIntegerSample
+ *
+ * A number of steps is calculated as the difference between max and min values of
+ * [valueProgression] divided by [valueProgression].step - 1.
+ * For example, with a range of 100..120 and a step 5,
+ * number of steps will be (120-100)/ 5 - 1 = 3. Steps are 100(first), 105, 110, 115, 120(last)
+ *
+ * If [valueProgression] range is not equally divisible by [valueProgression].step,
+ * then [valueProgression].last will be adjusted to the closest divisible value in the range.
+ * For example, 1..13 range and a step = 5, steps will be 1(first) , 6 , 11(last)
+ *
+ * @param value Current value of the Stepper. If outside of [valueProgression] provided, value will be
+ * coerced to this range.
+ * @param onValueChange Lambda in which value should be updated
+ * @param modifier Modifiers for the Stepper layout
+ * @param valueProgression Progression of values that Stepper value can take. Consists of
+ * rangeStart, rangeEnd and step. Range will be equally divided by step size
+ * @param decreaseIcon A slot for an icon which is placed on the decrease (bottom) button
+ * @param increaseIcon A slot for an icon which is placed on the increase (top) button
+ * @param backgroundColor [Color] representing the background color for the stepper.
+ * @param contentColor [Color] representing the color for [content] in the middle.
+ * @param iconTintColor Icon tint [Color] which used by [increaseIcon] and [decreaseIcon]
+ * that defaults to [contentColor], unless specifically overridden.
+ */
+@Composable
+public fun Stepper(
+    value: Int,
+    onValueChange: (Int) -> Unit,
+    modifier: Modifier = Modifier,
+    valueProgression: IntProgression,
+    decreaseIcon: @Composable () -> Unit = { StepperDefaults.DecreaseIcon() },
+    increaseIcon: @Composable () -> Unit = { StepperDefaults.IncreaseIcon() },
+    backgroundColor: Color = MaterialTheme.colors.background,
+    contentColor: Color = contentColorFor(backgroundColor),
+    iconTintColor: Color = contentColor,
+    content: @Composable BoxScope.() -> Unit
+) {
+    Stepper(
+        value = value.toFloat(),
+        onValueChange = { onValueChange(it.roundToInt()) },
+        steps = valueProgression.stepsNumber(),
+        modifier = modifier,
+        valueRange = valueProgression.first.toFloat()..valueProgression.last.toFloat(),
+        decreaseIcon = decreaseIcon,
+        increaseIcon = increaseIcon,
+        backgroundColor = backgroundColor,
+        contentColor = contentColor,
+        iconTintColor = iconTintColor,
+        content = content
+    )
+}
+
 @Composable
 private fun ColumnScope.FullScreenButton(
     onClick: () -> Unit,
@@ -173,20 +222,26 @@
 /**
  * Defaults used by stepper
  */
-object StepperDefaults {
-    internal const val ButtonWeight = 0.35f
-    internal const val ContentWeight = 0.3f
-    internal val BorderPadding = 8.dp
+private object StepperDefaults {
+    const val ButtonWeight = 0.35f
+    const val ContentWeight = 0.3f
+    val BorderPadding = 8.dp
 
-    /**
-     * A decrease [Icon].
-     */
-    val DecreaseIcon: ImageVector
-        get() = RangeIcons.MinusIcon
+    @Composable
+    fun DecreaseIcon() {
+        Icon(
+            imageVector = RangeIcons.Minus,
+            contentDescription = "Decrease", // TODO(b/204187777) i18n
+            modifier = Modifier.padding(14.dp)
+        )
+    }
 
-    /**
-     * An increase [Icon].
-     */
-    val IncreaseIcon: ImageVector
-        get() = Icons.Filled.Add
+    @Composable
+    fun IncreaseIcon() {
+        Icon(
+            imageVector = Icons.Filled.Add,
+            contentDescription = "Increase", // TODO(b/204187777) i18n
+            modifier = Modifier.padding(14.dp)
+        )
+    }
 }
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
index 947af72..82a121e0 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
@@ -33,6 +33,7 @@
 import androidx.wear.compose.material.samples.CurvedTextDemo
 import androidx.wear.compose.material.samples.InlineSliderSample
 import androidx.wear.compose.material.samples.InlineSliderSegmentedSample
+import androidx.wear.compose.material.samples.InlineSliderWithIntegerSample
 import androidx.wear.compose.material.samples.OptionChangePicker
 import androidx.wear.compose.material.samples.ScalingLazyColumnWithHeaders
 import androidx.wear.compose.material.samples.ScalingLazyColumnWithHeadersReversed
@@ -44,6 +45,7 @@
 import androidx.wear.compose.material.samples.SplitToggleChipWithCheckbox
 import androidx.wear.compose.material.samples.StatefulSwipeToDismissBox
 import androidx.wear.compose.material.samples.StepperSample
+import androidx.wear.compose.material.samples.StepperWithIntegerSample
 import androidx.wear.compose.material.samples.TimeTextWithCustomSeparator
 import androidx.wear.compose.material.samples.TimeTextWithFullDateAndTimeFormat
 import androidx.wear.compose.material.samples.TitleCardStandard
@@ -96,6 +98,9 @@
                         ComposableDemo("Segmented inline slider") {
                             Centralize { InlineSliderSegmentedSample() }
                         },
+                        ComposableDemo("Integer inline slider") {
+                            Centralize { InlineSliderWithIntegerSample() }
+                        },
                     )
                 ),
                 DemoCategory(
@@ -103,7 +108,11 @@
                     listOf(
                         ComposableDemo("Inline slider") { InlineSliderDemo() },
                         ComposableDemo("RTL Inline slider") { InlineSliderRTLDemo() },
+                        ComposableDemo("With custom colors") { InlineSliderCustomColorsDemo() },
                         ComposableDemo("Inline slider segmented") { InlineSliderSegmented() },
+                        ComposableDemo("Inline slider with integers") {
+                            InlineSliderWithIntegersDemo()
+                        },
                     )
                 )
             )
@@ -117,12 +126,16 @@
                         ComposableDemo("Stepper") {
                             Centralize({ StepperSample() })
                         },
+                        ComposableDemo("Integer Stepper") {
+                            Centralize({ StepperWithIntegerSample() })
+                        },
                     )
                 ),
                 DemoCategory(
                     "Demos",
                     listOf(
                         ComposableDemo("Simple stepper") { StepperDemo() },
+                        ComposableDemo("Stepper with integer") { StepperWithIntegerDemo() },
                         ComposableDemo("With scrollbar") {
                             StepperWithScrollBarDemo()
                         },
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/SliderDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/SliderDemo.kt
index 1118ea7..1cc50ec 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/SliderDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/SliderDemo.kt
@@ -17,6 +17,7 @@
 package androidx.wear.compose.integration.demos
 
 import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.fillMaxSize
@@ -28,10 +29,12 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 import androidx.wear.compose.material.InlineSlider
+import androidx.wear.compose.material.InlineSliderDefaults
 import androidx.wear.compose.material.ScalingLazyColumn
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.ToggleChip
@@ -84,6 +87,40 @@
 }
 
 @Composable
+fun InlineSliderWithIntegersDemo() {
+    var valueWithoutSegments by remember { mutableStateOf(5) }
+    var valueWithSegments by remember { mutableStateOf(2) }
+
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(
+            space = 4.dp,
+            alignment = Alignment.CenterVertically
+        ),
+        contentPadding = PaddingValues(horizontal = 8.dp, vertical = 30.dp),
+        modifier = Modifier.fillMaxSize()
+    ) {
+        item { Text("No segments, value = $valueWithoutSegments") }
+        item {
+            InlineSlider(
+                value = valueWithoutSegments,
+                valueProgression = IntProgression.fromClosedRange(0, 15, 3),
+                segmented = false,
+                onValueChange = { valueWithoutSegments = it })
+        }
+        item { Text("With segments, value = $valueWithSegments") }
+        item {
+            InlineSlider(
+                value = valueWithSegments,
+                onValueChange = { valueWithSegments = it },
+                valueProgression = IntProgression.fromClosedRange(110, 220, 5),
+                segmented = true
+            )
+        }
+    }
+}
+
+@Composable
 fun InlineSliderRTLDemo() {
     CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
         InlineSliderDemo()
@@ -91,6 +128,33 @@
 }
 
 @Composable
+fun InlineSliderCustomColorsDemo() {
+    var value by remember { mutableStateOf(4.5f) }
+    Box(
+        contentAlignment = Alignment.Center,
+        modifier = Modifier.fillMaxSize()
+    ) {
+        InlineSlider(
+            value = value,
+            onValueChange = { value = it },
+            valueRange = 3f..6f,
+            steps = 5,
+            segmented = false,
+            colors = InlineSliderDefaults.colors(
+                backgroundColor = Color.Green,
+                spacerColor = Color.Yellow,
+                selectedBarColor = Color.Magenta,
+                unselectedBarColor = Color.White,
+                disabledBackgroundColor = Color.DarkGray,
+                disabledSpacerColor = Color.LightGray,
+                disabledSelectedBarColor = Color.Red,
+                disabledUnselectedBarColor = Color.Blue
+            )
+        )
+    }
+}
+
+@Composable
 fun InlineSliderSegmented() {
     var numberOfSegments by remember { mutableStateOf(5f) }
     var progress by remember { mutableStateOf(10f) }
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/StepperDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/StepperDemo.kt
index cbde90a..1052233 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/StepperDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/StepperDemo.kt
@@ -45,6 +45,16 @@
 }
 
 @Composable
+fun StepperWithIntegerDemo() {
+    var value by remember { mutableStateOf(2) }
+    Stepper(
+        value = value,
+        onValueChange = { value = it },
+        valueProgression = 1..10
+    ) { Text("Value: $value") }
+}
+
+@Composable
 fun StepperWithScrollBarDemo() {
     val valueState = remember { mutableStateOf(4f) }
     val range = 0f..10f
diff --git a/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/BaselineProfile.kt b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/BaselineProfile.kt
index 3789840..2b216c9 100644
--- a/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/BaselineProfile.kt
+++ b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/BaselineProfile.kt
@@ -78,12 +78,10 @@
     fun profile() {
         baselineRule.collectBaselineProfile(
             packageName = PACKAGE_NAME,
-            setupBlock = {
+            profileBlock = {
                 val intent = Intent()
                 intent.action = ACTION
                 startActivityAndWait(intent)
-            },
-            profileBlock = {
                 testDestination(ALERT_DIALOG)
                 testDestination(CONFIRMATION_DIALOG)
                 testDestination(STEPPER)
diff --git a/wear/tiles/tiles-material/api/current.txt b/wear/tiles/tiles-material/api/current.txt
index ea063a6..92156c6 100644
--- a/wear/tiles/tiles-material/api/current.txt
+++ b/wear/tiles/tiles-material/api/current.txt
@@ -62,7 +62,7 @@
     method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelContent(String, String);
     method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelIconContent(String, String, String);
     method public androidx.wear.tiles.material.Chip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
   }
 
   public class ChipColors {
diff --git a/wear/tiles/tiles-material/api/public_plus_experimental_current.txt b/wear/tiles/tiles-material/api/public_plus_experimental_current.txt
index ea063a6..92156c6 100644
--- a/wear/tiles/tiles-material/api/public_plus_experimental_current.txt
+++ b/wear/tiles/tiles-material/api/public_plus_experimental_current.txt
@@ -62,7 +62,7 @@
     method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelContent(String, String);
     method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelIconContent(String, String, String);
     method public androidx.wear.tiles.material.Chip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
   }
 
   public class ChipColors {
diff --git a/wear/tiles/tiles-material/api/restricted_current.txt b/wear/tiles/tiles-material/api/restricted_current.txt
index ea063a6..92156c6 100644
--- a/wear/tiles/tiles-material/api/restricted_current.txt
+++ b/wear/tiles/tiles-material/api/restricted_current.txt
@@ -62,7 +62,7 @@
     method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelContent(String, String);
     method public androidx.wear.tiles.material.Chip.Builder setPrimaryTextLabelIconContent(String, String, String);
     method public androidx.wear.tiles.material.Chip.Builder setWidth(androidx.wear.tiles.DimensionBuilders.DpProp);
-    method public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+    method public androidx.wear.tiles.material.Chip.Builder setWidth(@Dimension(unit=androidx.annotation.Dimension.DP) float);
   }
 
   public class ChipColors {
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
index 1e8f862..e2ff6c7 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
@@ -159,7 +159,6 @@
          * ButtonDefaults#PRIMARY_BUTTON_COLORS} will be used.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
         public Builder setButtonColors(@NonNull ButtonColors buttonColors) {
             mButtonColors = buttonColors;
             return this;
@@ -183,7 +182,7 @@
          * channel and not an actual image.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setIconContent(@NonNull String resourceId, @NonNull DpProp size) {
             resetContent();
             this.mIcon = resourceId;
@@ -200,7 +199,7 @@
          * should be image with chosen alpha channel and not an actual image.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setIconContent(@NonNull String resourceId) {
             resetContent();
             this.mIcon = resourceId;
@@ -218,7 +217,7 @@
          * more than 3 characters, otherwise it will overflow from the edges.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setTextContent(
                 @NonNull String text, @NonNull DeviceParameters deviceParameters) {
             resetContent();
@@ -230,12 +229,14 @@
         }
 
         /**
-         * Sets the content of this Button to be the given text with the given font. You should add
-         * chosen color to your font. Any previously added content will be overridden. Text should
-         * contain no more than 3 characters, otherwise it will overflow from the edges.
+         * Sets the content of this Button to be the given text with the given font. You shouldn't
+         * add color to your font as it will be overridden by the {@link
+         * ButtonColors#getContentColor}. Only {@link #setButtonColors} should be used for
+         * customizing the colors of the button. Any previously added content will be overridden.
+         * Text should contain no more than 3 characters, otherwise it will overflow from the edges.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setTextContent(@NonNull String text, @NonNull FontStyle font) {
             resetContent();
             this.mText = text;
@@ -252,7 +253,7 @@
          * image with chosen alpha channel and not an actual image.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setImageContent(@NonNull String resourceId) {
             resetContent();
             this.mImage = resourceId;
@@ -316,7 +317,8 @@
                 case ICON:
                 {
                     DpProp iconSize =
-                            mDefaultSize ? ButtonDefaults.recommendedIconSize(mSize)
+                            mDefaultSize
+                                    ? ButtonDefaults.recommendedIconSize(mSize)
                                     : checkNotNull(mIconSize);
                     mContent =
                             new Image.Builder()
@@ -338,7 +340,10 @@
                         fontStyle =
                                 FontStyle.fromProto(
                                         mFontStyle.toProto().toBuilder()
-                                                .setColor(mButtonColors.getContentColor().toProto())
+                                                .setColor(
+                                                        mButtonColors
+                                                                .getContentColor()
+                                                                .toProto())
                                                 .build());
                     } else {
                         fontStyle =
@@ -347,10 +352,11 @@
                                         .build();
                     }
 
-                    mContent = new Text.Builder()
-                            .setText(checkNotNull(mText))
-                            .setMaxLines(1)
-                            .setFontStyle(fontStyle);
+                    mContent =
+                            new Text.Builder()
+                                .setText(checkNotNull(mText))
+                                .setMaxLines(1)
+                                .setFontStyle(fontStyle);
 
                     return mContent.build();
                 }
@@ -457,8 +463,7 @@
             case Builder.ICON:
                 contentColor =
                         checkNotNull(
-                                checkNotNull(((Image) mainElement).getColorFilter()).getTint()
-                        );
+                                checkNotNull(((Image) mainElement).getColorFilter()).getTint());
                 break;
             case Builder.TEXT:
                 contentColor =
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
index 4c76b5f..9b7102e 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
@@ -157,7 +157,7 @@
          * by {@link ChipDefaults#DEFAULT_MARGIN_PERCENT}.
          */
         @NonNull
-        public Builder setWidth(@Dimension(unit = DP) int width) {
+        public Builder setWidth(@Dimension(unit = DP) float width) {
             mWidth = dp(width);
             return this;
         }
@@ -188,7 +188,7 @@
          * content will be overridden. Primary text can be on 1 or 2 lines, depending on the length.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setPrimaryTextContent(@NonNull String primaryText) {
             this.mPrimaryText = primaryText;
             this.mLabelText = null;
@@ -204,7 +204,6 @@
          * length.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
         Builder setPrimaryTextFontStyle(@NonNull FontStyle fontStyle) {
             this.mPrimaryTextFont = fontStyle;
             return this;
@@ -216,7 +215,7 @@
          * only. This content will be left aligned inside the chip.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setPrimaryTextLabelContent(
                 @NonNull String primaryText, @NonNull String label) {
             this.mPrimaryText = primaryText;
@@ -251,7 +250,7 @@
          * will be left-aligned inside the chip.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
+        @SuppressWarnings("MissingGetterMatchingBuilder")   // There's getContent() method.
         public Builder setPrimaryTextLabelIconContent(
                 @NonNull String primaryText, @NonNull String label, @NonNull String resourceId) {
             this.mPrimaryText = primaryText;
@@ -261,7 +260,6 @@
             return this;
         }
 
-        // TODO(b/210846270): Add getChipColors.
         /**
          * Sets the colors for the {@link Chip}. If set, {@link ChipColors#getBackgroundColor()}
          * will be used for the background of the button, {@link ChipColors#getContentColor()} for
@@ -270,7 +268,6 @@
          * set, {@link ChipDefaults#PRIMARY} will be used.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
         public Builder setChipColors(@NonNull ChipColors chipColors) {
             mChipColors = chipColors;
             return this;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
index ea7d70c..dc20ec5 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
@@ -112,7 +112,7 @@
         return mBackgroundColor;
     }
 
-    /** The tint color to be used on a chip Tiles components. */
+    /** The icon tint color to be used on a chip Tiles components. */
     @NonNull
     public ColorProp getIconTintColor() {
         return mIconTintColor;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
index 3462c3c..04d5487 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
@@ -86,7 +86,6 @@
          * ChipDefaults#COMPACT_PRIMARY} will be used.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
         public Builder setChipColors(@NonNull ChipColors chipColors) {
             mChipColors = chipColors;
             return this;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
index 367356a..e13e83f 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
@@ -96,7 +96,6 @@
          * ChipDefaults#LARGE_PRIMARY} will be used.
          */
         @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
         public Builder setChipColors(@NonNull ChipColors chipColors) {
             mChipColors = chipColors;
             return this;
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt
index af6f7bb..f8441c1d 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/ComplicationSlotState.kt
@@ -238,4 +238,56 @@
         complicationStateWireFormat.nameResourceId,
         complicationStateWireFormat.screenReaderNameResourceId
     )
+
+    @Suppress("Deprecation")
+    override fun toString(): String {
+        return "ComplicationSlotState(bounds=$bounds, boundsType=$boundsType, " +
+            "supportedTypes=$supportedTypes, defaultDataSourcePolicy=$defaultDataSourcePolicy, " +
+            "defaultDataSourceType=$defaultDataSourceType, isEnabled=$isEnabled, " +
+            "isInitiallyEnabled=$isInitiallyEnabled, currentType=$currentType, " +
+            "fixedComplicationDataSource=$fixedComplicationDataSource, " +
+            "complicationConfigExtras=$complicationConfigExtras, " +
+            "nameResourceId=$nameResourceId, " +
+            "screenReaderNameResourceId=$screenReaderNameResourceId)"
+    }
+
+    @Suppress("Deprecation")
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as ComplicationSlotState
+
+        if (bounds != other.bounds) return false
+        if (boundsType != other.boundsType) return false
+        if (supportedTypes != other.supportedTypes) return false
+        if (defaultDataSourcePolicy != other.defaultDataSourcePolicy) return false
+        if (defaultDataSourceType != other.defaultDataSourceType) return false
+        if (isEnabled != other.isEnabled) return false
+        if (isInitiallyEnabled != other.isInitiallyEnabled) return false
+        if (currentType != other.currentType) return false
+        if (fixedComplicationDataSource != other.fixedComplicationDataSource) return false
+        if (complicationConfigExtras != other.complicationConfigExtras) return false
+        if (nameResourceId != other.nameResourceId) return false
+        if (screenReaderNameResourceId != other.screenReaderNameResourceId) return false
+
+        return true
+    }
+
+    @Suppress("Deprecation")
+    override fun hashCode(): Int {
+        var result = bounds.hashCode()
+        result = 31 * result + boundsType
+        result = 31 * result + supportedTypes.hashCode()
+        result = 31 * result + defaultDataSourcePolicy.hashCode()
+        result = 31 * result + defaultDataSourceType.hashCode()
+        result = 31 * result + isEnabled.hashCode()
+        result = 31 * result + isInitiallyEnabled.hashCode()
+        result = 31 * result + currentType.hashCode()
+        result = 31 * result + fixedComplicationDataSource.hashCode()
+        result = 31 * result + complicationConfigExtras.hashCode()
+        result = 31 * result + (nameResourceId ?: 0)
+        result = 31 * result + (screenReaderNameResourceId ?: 0)
+        return result
+    }
 }
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
index 647d502..220def1 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/DeviceConfig.kt
@@ -46,6 +46,42 @@
         analogPreviewReferenceTimeMillis,
         digitalPreviewReferenceTimeMillis
     )
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as DeviceConfig
+
+        if (hasLowBitAmbient != other.hasLowBitAmbient) {
+            return false
+        }
+        if (hasBurnInProtection != other.hasBurnInProtection) {
+            return false
+        }
+        if (analogPreviewReferenceTimeMillis != other.analogPreviewReferenceTimeMillis) {
+            return false
+        }
+        if (digitalPreviewReferenceTimeMillis != other.digitalPreviewReferenceTimeMillis) {
+            return false
+        }
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = hasLowBitAmbient.hashCode()
+        result = 31 * result + hasBurnInProtection.hashCode()
+        result = 31 * result + analogPreviewReferenceTimeMillis.hashCode()
+        result = 31 * result + digitalPreviewReferenceTimeMillis.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        return "DeviceConfig(hasLowBitAmbient=$hasLowBitAmbient, " +
+            "hasBurnInProtection=$hasBurnInProtection, " +
+            "analogPreviewReferenceTimeMillis=$analogPreviewReferenceTimeMillis, " +
+            "digitalPreviewReferenceTimeMillis=$digitalPreviewReferenceTimeMillis)"
+    }
 }
 
 /** @hide */
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
index bf9ab79..b085aab 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/EditorState.kt
@@ -50,6 +50,10 @@
     override fun hashCode(): Int {
         return id.hashCode()
     }
+
+    override fun toString(): String {
+        return "WatchFaceId(id='$id')"
+    }
 }
 
 /**
@@ -85,6 +89,30 @@
             ", previewComplicationsData: [" +
             previewComplicationsData.map { "${it.key} -> ${it.value}" }.joinToString() +
             "], shouldCommitChanges: $shouldCommitChanges, previewImage: ${previewImage != null}"
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as EditorState
+
+        if (watchFaceId != other.watchFaceId) return false
+        if (userStyle != other.userStyle) return false
+        if (previewComplicationsData != other.previewComplicationsData) return false
+        if (shouldCommitChanges != other.shouldCommitChanges) return false
+        if (previewImage != other.previewImage) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = watchFaceId.hashCode()
+        result = 31 * result + userStyle.hashCode()
+        result = 31 * result + previewComplicationsData.hashCode()
+        result = 31 * result + shouldCommitChanges.hashCode()
+        result = 31 * result + (previewImage?.hashCode() ?: 0)
+        return result
+    }
 }
 
 /** @hide */
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
index ecdd49c..3975627 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchUiState.kt
@@ -52,4 +52,26 @@
 
     @InterruptionFilter
     public val interruptionFilter: Int
-)
\ No newline at end of file
+) {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as WatchUiState
+
+        if (inAmbientMode != other.inAmbientMode) return false
+        if (interruptionFilter != other.interruptionFilter) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = inAmbientMode.hashCode()
+        result = 31 * result + interruptionFilter
+        return result
+    }
+
+    override fun toString(): String {
+        return "WatchUiState(inAmbientMode=$inAmbientMode, interruptionFilter=$interruptionFilter)"
+    }
+}
\ No newline at end of file
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
index 85f4110..1e01a43 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
@@ -974,6 +974,7 @@
                     else -> contentDescription?.toWireComplicationText()
                 }
             )
+            setTapAction(tapAction)
             setValidTimeRange(validTimeRange, this)
         }.build().also { cachedWireComplicationData = it }
     }
@@ -1223,6 +1224,7 @@
                 largeImage!!,
                 contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
             ).apply {
+                setTapAction(tapAction)
                 setValidTimeRange(parseTimeRange())
                 setCachedWireComplicationData(wireComplicationData)
             }.build()
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
index 0cbac9a..ce9b901 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
@@ -536,7 +536,7 @@
     }
 
     @Test
-    public fun backgroundImageComplicationData() {
+    public fun photoImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
         assertRoundtrip(
             WireComplicationDataBuilder(WireComplicationData.TYPE_LARGE_IMAGE)
@@ -631,11 +631,89 @@
     @Test
     public fun photoImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
+        assertThat(
+            PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY)
+                .setTapAction(mPendingIntent).build()
+                .asWireComplicationData()
+                .tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+}
+
+@RunWith(SharedRobolectricTestRunner::class)
+public class RoundtripTapActionTest {
+    private val mPendingIntent = PendingIntent.getBroadcast(
+        ApplicationProvider.getApplicationContext(),
+        0,
+        Intent(),
+        0
+    )
+
+    @Test
+    public fun shortTextComplicationData() {
+        assertThat(
+            ShortTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                .setTapAction(mPendingIntent)
+                .build().asWireComplicationData().toApiComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @Test
+    public fun longTextComplicationData() {
+        assertThat(
+            LongTextComplicationData.Builder("text".complicationText, ComplicationText.EMPTY)
+                .setTapAction(mPendingIntent)
+                .build().asWireComplicationData().toApiComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @Test
+    public fun rangedValueComplicationData() {
+        assertThat(
+            RangedValueComplicationData.Builder(
+                value = 95f, min = 0f, max = 100f,
+                contentDescription = ComplicationText.EMPTY
+            )
+                .setTapAction(mPendingIntent)
+                .build().asWireComplicationData().toApiComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @Test
+    public fun monochromaticImageComplicationData() {
+        val icon = Icon.createWithContentUri("someuri")
+        val image = MonochromaticImage.Builder(icon).build()
+        assertThat(
+            MonochromaticImageComplicationData.Builder(image, ComplicationText.EMPTY)
+                .setTapAction(mPendingIntent)
+                .build()
+                .asWireComplicationData()
+                .toApiComplicationData()
+                .tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @Test
+    public fun smallImageComplicationData() {
+        val icon = Icon.createWithContentUri("someuri")
         val image = SmallImage.Builder(icon, SmallImageType.PHOTO).build()
         assertThat(
             SmallImageComplicationData.Builder(image, ComplicationText.EMPTY)
                 .setTapAction(mPendingIntent).build()
                 .asWireComplicationData()
+                .toApiComplicationData()
+                .tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @Test
+    public fun photoImageComplicationData() {
+        val icon = Icon.createWithContentUri("someuri")
+        assertThat(
+            PhotoImageComplicationData.Builder(icon, ComplicationText.EMPTY)
+                .setTapAction(mPendingIntent).build()
+                .asWireComplicationData()
+                .toApiComplicationData()
                 .tapAction
         ).isEqualTo(mPendingIntent)
     }
diff --git a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
index e7caa3a..359fd02 100644
--- a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
+++ b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
@@ -110,7 +110,6 @@
 import org.junit.Assert.assertNull
 import org.junit.Assert.assertTrue
 import org.junit.Assert.fail
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.ArgumentMatchers.any
@@ -1937,7 +1936,6 @@
     }
 
     @Test
-    @Ignore // TODO(b/200917204): This test is flaking on the bots.
     public fun forceCloseEditorSessionDuring_fetchComplicationsData() {
         val getProviderInfosLatch = CountDownLatch(1)
         val complicationDataSourceInfoRetrieverProvider =
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
index accac7a..2b1decd 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
@@ -436,6 +436,8 @@
         public fun create(): SharedAssets
     }
 
+    internal abstract fun renderBlackFrame()
+
     /**
      * Watch faces that require [Canvas] rendering should extend their [Renderer] from this class.
      *
@@ -592,6 +594,19 @@
             zonedDateTime: ZonedDateTime
         )
 
+        internal override fun renderBlackFrame() {
+            val canvas = if (canvasType == CanvasType.SOFTWARE) {
+                surfaceHolder.lockCanvas()
+            } else {
+                surfaceHolder.lockHardwareCanvas()
+            }
+            try {
+                canvas.drawColor(Color.BLACK)
+            } finally {
+                surfaceHolder.unlockCanvasAndPost(canvas)
+            }
+        }
+
         /**
          * Sub-classes should override this to implement their watch face highlight layer rendering
          * logic for the [RenderParameters.highlightLayer] aspect of [renderParameters]. Typically
@@ -1172,6 +1187,17 @@
             }
         }
 
+        internal override fun renderBlackFrame() {
+            runBlocking {
+                runUiThreadGlCommands {
+                    GLES20.glClearColor(0f, 0f, 0f, 0f)
+                    if (!EGL14.eglSwapBuffers(eglDisplay, eglSurface)) {
+                        Log.w(TAG, "eglSwapBuffers failed")
+                    }
+                }
+            }
+        }
+
         private fun verticalFlip(
             buffer: ByteBuffer,
             width: Int,
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index 9439cf7..ac3efae 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -793,6 +793,10 @@
                 }
                 scheduleDraw()
             } else {
+                // We want to avoid a glimpse of a stale time when transitioning from hidden to
+                // visible, so we render two black frames to clear the buffers.
+                renderer.renderBlackFrame()
+                renderer.renderBlackFrame()
                 unregisterReceivers()
             }
         }
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index 0c639ce..afded57 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -994,7 +994,7 @@
 
                 /**
                  * It's possible we went ambient by the time our callback occurred in which case
-                 * there's no point drawing. Note if watchFaceImpl is null we call [drawBlack].
+                 * there's no point drawing.
                  */
                 if (watchFaceImpl?.renderer?.shouldAnimate() != false) {
                     draw()
@@ -2035,7 +2035,7 @@
                 }
 
                 val watchFaceImpl: WatchFaceImpl? = getWatchFaceImplOrNull()
-                watchFaceImpl?.onDraw() ?: drawBlack()
+                watchFaceImpl?.onDraw()
             } finally {
                 if (TRACE_DRAW) {
                     Trace.endSection()
@@ -2062,12 +2062,6 @@
             }
         }
 
-        private fun drawBlack() {
-            // TODO(b/189452267): We don't know if the watchface will use hardware or software
-            // canvas and mixing the two leads to skia crashes. For now we do nothing rather than
-            // drawing a blank frame.
-        }
-
         internal fun watchFaceCreated() = deferredWatchFaceImpl.isCompleted
 
         internal fun watchFaceCreatedOrPending() =
diff --git a/window/window/src/androidTest/java/androidx/window/layout/ExtensionWindowLayoutInfoBackendTest.kt b/window/window/src/androidTest/java/androidx/window/layout/ExtensionWindowLayoutInfoBackendTest.kt
index ea99c4d..bdc40da 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/ExtensionWindowLayoutInfoBackendTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/ExtensionWindowLayoutInfoBackendTest.kt
@@ -24,6 +24,7 @@
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.window.TestActivity
 import androidx.window.TestConsumer
+import androidx.window.core.ConsumerAdapter
 import androidx.window.extensions.layout.FoldingFeature.STATE_FLAT
 import androidx.window.extensions.layout.FoldingFeature.TYPE_HINGE
 import androidx.window.extensions.layout.WindowLayoutComponent
@@ -50,6 +51,10 @@
     public val activityScenario: ActivityScenarioRule<TestActivity> =
         ActivityScenarioRule(TestActivity::class.java)
 
+    private val consumerAdapter = ConsumerAdapter(
+        ExtensionWindowLayoutInfoBackendTest::class.java.classLoader!!
+    )
+
     @Before
     fun setUp() {
         assumeTrue("Must be at least API 24", Build.VERSION_CODES.N <= Build.VERSION.SDK_INT)
@@ -57,15 +62,15 @@
 
     @Test
     public fun testExtensionWindowBackend_delegatesToWindowLayoutComponent() {
-        val component = mock<WindowLayoutComponent>()
+        val component = RequestTrackingWindowComponent()
 
-        val backend = ExtensionWindowLayoutInfoBackend(component)
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
         activityScenario.scenario.onActivity { activity ->
             val consumer = TestConsumer<WindowLayoutInfo>()
             backend.registerLayoutChangeCallback(activity, Runnable::run, consumer)
 
-            verify(component).addWindowLayoutInfoListener(eq(activity), any())
+            assertTrue("Expected call with Activity: $activity", component.hasAddCall(activity))
         }
     }
 
@@ -73,7 +78,7 @@
     public fun testExtensionWindowBackend_registerAtMostOnce() {
         val component = mock<WindowLayoutComponent>()
 
-        val backend = ExtensionWindowLayoutInfoBackend(component)
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
         activityScenario.scenario.onActivity { activity ->
             val consumer = TestConsumer<WindowLayoutInfo>()
@@ -95,7 +100,7 @@
                 val consumer = invocation.getArgument(1) as JavaConsumer<OEMWindowLayoutInfo>
                 consumer.accept(OEMWindowLayoutInfo(emptyList()))
             }
-        val backend = ExtensionWindowLayoutInfoBackend(component)
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
         activityScenario.scenario.onActivity { activity ->
             val consumer = TestConsumer<WindowLayoutInfo>()
@@ -116,7 +121,7 @@
                 val consumer = invocation.getArgument(1) as JavaConsumer<OEMWindowLayoutInfo>
                 consumer.accept(OEMWindowLayoutInfo(emptyList()))
             }
-        val backend = ExtensionWindowLayoutInfoBackend(component)
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
         activityScenario.scenario.onActivity { activity ->
             val consumer = TestConsumer<WindowLayoutInfo>()
@@ -131,7 +136,7 @@
     public fun testExtensionWindowBackend_removeMatchingCallback() {
         val component = mock<WindowLayoutComponent>()
 
-        val backend = ExtensionWindowLayoutInfoBackend(component)
+        val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
         activityScenario.scenario.onActivity { activity ->
             val consumer = TestConsumer<WindowLayoutInfo>()
@@ -148,7 +153,7 @@
     public fun testRegisterLayoutChangeCallback_clearListeners() {
         activityScenario.scenario.onActivity { activity ->
             val component = FakeWindowComponent()
-            val backend = ExtensionWindowLayoutInfoBackend(component)
+            val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
             // Check registering the layout change callback
             val firstConsumer = mock<Consumer<WindowLayoutInfo>>()
@@ -177,7 +182,7 @@
     public fun testLayoutChangeCallback_emitNewValue() {
         activityScenario.scenario.onActivity { activity ->
             val component = FakeWindowComponent()
-            val backend = ExtensionWindowLayoutInfoBackend(component)
+            val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
 
             // Check that callbacks from the extension are propagated correctly
             val consumer = mock<Consumer<WindowLayoutInfo>>()
@@ -194,7 +199,7 @@
     public fun testWindowLayoutInfo_updatesOnSubsequentRegistration() {
         activityScenario.scenario.onActivity { activity ->
             val component = FakeWindowComponent()
-            val backend = ExtensionWindowLayoutInfoBackend(component)
+            val backend = ExtensionWindowLayoutInfoBackend(component, consumerAdapter)
             val consumer = TestConsumer<WindowLayoutInfo>()
             val oemWindowLayoutInfo = newTestOEMWindowLayoutInfo(activity)
             val expected = listOf(
@@ -223,6 +228,27 @@
         }
     }
 
+    private class RequestTrackingWindowComponent : WindowLayoutComponent {
+
+        val records = mutableListOf<AddCall>()
+
+        override fun addWindowLayoutInfoListener(
+            activity: Activity,
+            consumer: JavaConsumer<OEMWindowLayoutInfo>
+        ) {
+            records.add(AddCall(activity))
+        }
+
+        override fun removeWindowLayoutInfoListener(consumer: JavaConsumer<OEMWindowLayoutInfo>) {
+        }
+
+        class AddCall(val activity: Activity)
+
+        fun hasAddCall(activity: Activity): Boolean {
+            return records.any { addRecord -> addRecord.activity == activity }
+        }
+    }
+
     private class FakeWindowComponent : WindowLayoutComponent {
 
         val consumers = mutableListOf<JavaConsumer<OEMWindowLayoutInfo>>()
diff --git a/window/window/src/androidTest/java/androidx/window/layout/SafeWindowLayoutComponentProviderTest.kt b/window/window/src/androidTest/java/androidx/window/layout/SafeWindowLayoutComponentProviderTest.kt
index bfa5b7f..246e9a3 100644
--- a/window/window/src/androidTest/java/androidx/window/layout/SafeWindowLayoutComponentProviderTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/layout/SafeWindowLayoutComponentProviderTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.window.layout
 
+import androidx.window.core.ConsumerAdapter
 import androidx.window.extensions.WindowExtensionsProvider
 import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertNull
@@ -34,7 +35,10 @@
      */
     @Test
     fun windowLayoutComponentIsAvailable_ifProviderIsAvailable() {
-        val safeComponent = SafeWindowLayoutComponentProvider.windowLayoutComponent
+        val loader = SafeWindowLayoutComponentProviderTest::class.java.classLoader!!
+        val consumerAdapter = ConsumerAdapter(loader)
+        val safeComponent = SafeWindowLayoutComponentProvider(loader, consumerAdapter)
+            .windowLayoutComponent
 
         try {
             val extensions = WindowExtensionsProvider.getWindowExtensions()
diff --git a/window/window/src/main/java/androidx/window/core/ConsumerAdapter.kt b/window/window/src/main/java/androidx/window/core/ConsumerAdapter.kt
new file mode 100644
index 0000000..e81e16e
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/core/ConsumerAdapter.kt
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.window.core
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import androidx.annotation.CheckResult
+import java.lang.reflect.InvocationHandler
+import java.lang.reflect.Method
+import java.lang.reflect.Proxy
+import kotlin.reflect.KClass
+import kotlin.reflect.cast
+
+/**
+ * An adapter over {@link java.util.function.Consumer} to workaround mismatch in expected extension
+ * API signatures after library desugaring. See b/203472665
+ */
+@SuppressLint("BanUncheckedReflection")
+internal class ConsumerAdapter(
+    private val loader: ClassLoader
+) {
+    internal fun consumerClassOrNull(): Class<*>? {
+        return try {
+            unsafeConsumerClass()
+        } catch (e: ClassNotFoundException) {
+            null
+        }
+    }
+
+    private fun unsafeConsumerClass(): Class<*> {
+        return loader.loadClass("java.util.function.Consumer")
+    }
+
+    internal interface Subscription {
+        fun dispose()
+    }
+
+    private fun <T : Any> buildConsumer(clazz: KClass<T>, consumer: (T) -> Unit): Any {
+        val handler = ConsumerHandler(clazz, consumer)
+        return Proxy.newProxyInstance(loader, arrayOf(unsafeConsumerClass()), handler)
+    }
+
+    fun <T : Any> addConsumer(
+        obj: Any,
+        clazz: KClass<T>,
+        methodName: String,
+        consumer: (T) -> Unit
+    ) {
+        obj.javaClass.getMethod(methodName, unsafeConsumerClass())
+            .invoke(obj, buildConsumer(clazz, consumer))
+    }
+
+    @CheckResult
+    fun <T : Any> createSubscription(
+        obj: Any,
+        clazz: KClass<T>,
+        addMethodName: String,
+        removeMethodName: String,
+        activity: Activity,
+        consumer: (T) -> Unit
+    ): Subscription {
+        val javaConsumer = buildConsumer(clazz, consumer)
+        obj.javaClass.getMethod(addMethodName, Activity::class.java, unsafeConsumerClass())
+            .invoke(obj, activity, javaConsumer)
+        val removeMethod = obj.javaClass.getMethod(removeMethodName, unsafeConsumerClass())
+        return object : Subscription {
+            override fun dispose() {
+                removeMethod.invoke(obj, javaConsumer)
+            }
+        }
+    }
+
+    private class ConsumerHandler<T : Any>(
+        private val clazz: KClass<T>,
+        private val consumer: (T) -> Unit
+    ) : InvocationHandler {
+        override fun invoke(obj: Any, method: Method, parameters: Array<out Any>?): Any {
+            return when {
+                method.isAccept(parameters) -> {
+                    val argument = clazz.cast(parameters?.get(0))
+                    invokeAccept(argument)
+                }
+                method.isEquals(parameters) -> {
+                    obj === parameters?.get(0)
+                }
+                method.isHashCode(parameters) -> {
+                    consumer.hashCode()
+                }
+                method.isToString(parameters) -> {
+                    consumer.toString()
+                }
+                else -> {
+                    throw UnsupportedOperationException(
+                        "Unexpected method call object:$obj, method: $method, args: $parameters"
+                    )
+                }
+            }
+        }
+
+        fun invokeAccept(parameter: T) {
+            consumer(parameter)
+        }
+
+        private fun Method.isEquals(args: Array<out Any>?): Boolean {
+            return name == "equals" && returnType.equals(Boolean::class.java) && args?.size == 1
+        }
+
+        private fun Method.isHashCode(args: Array<out Any>?): Boolean {
+            return name == "hashCode" && returnType.equals(Int::class.java) && args == null
+        }
+
+        private fun Method.isAccept(args: Array<out Any>?): Boolean {
+            return name == "accept" && args?.size == 1
+        }
+
+        private fun Method.isToString(args: Array<out Any>?): Boolean {
+            return name == "toString" && returnType.equals(String::class.java) && args == null
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/core/PredicateAdapter.kt b/window/window/src/main/java/androidx/window/core/PredicateAdapter.kt
new file mode 100644
index 0000000..0685df8
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/core/PredicateAdapter.kt
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.window.core
+
+import android.annotation.SuppressLint
+import android.util.Pair
+import java.lang.reflect.InvocationHandler
+import java.lang.reflect.Method
+import java.lang.reflect.Proxy
+import kotlin.reflect.KClass
+import kotlin.reflect.cast
+
+/**
+ * An adapter over {@link java.util.function.Predicate} to workaround mismatch in expected extension
+ * API signatures after library desugaring. See b/203472665
+ */
+@SuppressLint("BanUncheckedReflection")
+internal class PredicateAdapter(
+    private val loader: ClassLoader
+) {
+    internal fun predicateClassOrNull(): Class<*>? {
+        return try {
+            predicateClassOrThrow()
+        } catch (e: ClassNotFoundException) {
+            null
+        }
+    }
+
+    private fun predicateClassOrThrow(): Class<*> {
+        return loader.loadClass("java.util.function.Predicate")
+    }
+
+    fun <T : Any> buildPredicate(clazz: KClass<T>, predicate: (T) -> Boolean): Any {
+        val predicateHandler = PredicateStubHandler(
+            clazz,
+            predicate
+        )
+        return Proxy.newProxyInstance(loader, arrayOf(predicateClassOrThrow()), predicateHandler)
+    }
+
+    fun <T : Any, U : Any> buildPairPredicate(
+        firstClazz: KClass<T>,
+        secondClazz: KClass<U>,
+        predicate: (T, U) -> Boolean
+    ): Any {
+        val predicateHandler = PairPredicateStubHandler(
+            firstClazz,
+            secondClazz,
+            predicate
+        )
+
+        return Proxy.newProxyInstance(loader, arrayOf(predicateClassOrThrow()), predicateHandler)
+    }
+
+    private abstract class BaseHandler<T : Any>(private val clazz: KClass<T>) : InvocationHandler {
+        override fun invoke(obj: Any, method: Method, parameters: Array<out Any>?): Any {
+            return when {
+                method.isTest(parameters) -> {
+                    val argument = clazz.cast(parameters?.get(0))
+                    invokeTest(obj, argument)
+                }
+                method.isEquals(parameters) -> {
+                    obj === parameters?.get(0)!!
+                }
+                method.isHashCode(parameters) -> {
+                    hashCode()
+                }
+                method.isToString(parameters) -> {
+                    toString()
+                }
+                else -> {
+                    throw UnsupportedOperationException(
+                        "Unexpected method call object:$obj, method: $method, args: $parameters"
+                    )
+                }
+            }
+        }
+
+        abstract fun invokeTest(obj: Any, parameter: T): Boolean
+
+        protected fun Method.isEquals(args: Array<out Any>?): Boolean {
+            return name == "equals" && returnType.equals(Boolean::class.java) && args?.size == 1
+        }
+
+        protected fun Method.isHashCode(args: Array<out Any>?): Boolean {
+            return name == "hashCode" && returnType.equals(Int::class.java) && args == null
+        }
+
+        protected fun Method.isTest(args: Array<out Any>?): Boolean {
+            return name == "test" && returnType.equals(Boolean::class.java) && args?.size == 1
+        }
+
+        protected fun Method.isToString(args: Array<out Any>?): Boolean {
+            return name == "toString" && returnType.equals(String::class.java) && args == null
+        }
+    }
+
+    private class PredicateStubHandler<T : Any>(
+        clazzT: KClass<T>,
+        private val predicate: (T) -> Boolean
+    ) : BaseHandler<T>(clazzT) {
+        override fun invokeTest(obj: Any, parameter: T): Boolean {
+            return predicate(parameter)
+        }
+
+        override fun hashCode(): Int {
+            return predicate.hashCode()
+        }
+
+        override fun toString(): String {
+            return predicate.toString()
+        }
+    }
+
+    private class PairPredicateStubHandler<T : Any, U : Any>(
+        private val clazzT: KClass<T>,
+        private val clazzU: KClass<U>,
+        private val predicate: (T, U) -> Boolean
+    ) : BaseHandler<Pair<*, *>>(Pair::class) {
+        override fun invokeTest(obj: Any, parameter: Pair<*, *>): Boolean {
+            val t = clazzT.cast(parameter.first)
+            val u = clazzU.cast(parameter.second)
+            return predicate(t, u)
+        }
+
+        override fun hashCode(): Int {
+            return predicate.hashCode()
+        }
+
+        override fun toString(): String {
+            return predicate.toString()
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
index abfd24d..b5ff4b2 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
@@ -19,27 +19,31 @@
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.content.Intent
-import android.util.Pair
 import android.view.WindowMetrics
 import androidx.window.core.ExperimentalWindowApi
-import java.lang.IllegalArgumentException
-import java.util.function.Predicate
+import androidx.window.core.PredicateAdapter
+import androidx.window.extensions.embedding.ActivityRule as OEMActivityRule
 import androidx.window.extensions.embedding.ActivityRule.Builder as ActivityRuleBuilder
+import androidx.window.extensions.embedding.EmbeddingRule as OEMEmbeddingRule
+import androidx.window.extensions.embedding.SplitInfo as OEMSplitInfo
+import androidx.window.extensions.embedding.SplitPairRule as OEMSplitPairRule
 import androidx.window.extensions.embedding.SplitPairRule.Builder as SplitPairRuleBuilder
+import androidx.window.extensions.embedding.SplitPlaceholderRule as OEMSplitPlaceholderRule
 import androidx.window.extensions.embedding.SplitPlaceholderRule.Builder as SplitPlaceholderRuleBuilder
 
 /**
  * Adapter class that translates data classes between Extension and Jetpack interfaces.
  */
 @ExperimentalWindowApi
-internal class EmbeddingAdapter {
-    fun translate(
-        splitInfoList: List<androidx.window.extensions.embedding.SplitInfo>
-    ): List<SplitInfo> {
+internal class EmbeddingAdapter(
+    private val predicateAdapter: PredicateAdapter
+) {
+
+    fun translate(splitInfoList: List<OEMSplitInfo>): List<SplitInfo> {
         return splitInfoList.map(::translate)
     }
 
-    private fun translate(splitInfo: androidx.window.extensions.embedding.SplitInfo): SplitInfo {
+    private fun translate(splitInfo: OEMSplitInfo): SplitInfo {
         val primaryActivityStack = splitInfo.primaryActivityStack
         val isPrimaryStackEmpty = try {
             primaryActivityStack.isEmpty
@@ -60,65 +64,62 @@
         }
         val secondaryFragment = ActivityStack(
             secondaryActivityStack.activities,
-            isSecondaryStackEmpty)
+            isSecondaryStackEmpty
+        )
         return SplitInfo(primaryFragment, secondaryFragment, splitInfo.splitRatio)
     }
 
     @SuppressLint("ClassVerificationFailure", "NewApi")
-    fun translateActivityPairPredicates(
-        splitPairFilters: Set<SplitPairFilter>
-    ): Predicate<Pair<Activity, Activity>> {
-        return Predicate<Pair<Activity, Activity>> {
-            (first, second) ->
+    private fun translateActivityPairPredicates(splitPairFilters: Set<SplitPairFilter>): Any {
+        return predicateAdapter.buildPairPredicate(
+            Activity::class,
+            Activity::class
+        ) { first: Activity, second: Activity ->
             splitPairFilters.any { filter -> filter.matchesActivityPair(first, second) }
         }
     }
 
     @SuppressLint("ClassVerificationFailure", "NewApi")
-    fun translateActivityIntentPredicates(
-        splitPairFilters: Set<SplitPairFilter>
-    ): Predicate<Pair<Activity, Intent>> {
-        return Predicate<Pair<Activity, Intent>> {
-            (first, second) ->
+    private fun translateActivityIntentPredicates(splitPairFilters: Set<SplitPairFilter>): Any {
+        return predicateAdapter.buildPairPredicate(
+            Activity::class,
+            Intent::class
+        ) { first, second ->
             splitPairFilters.any { filter -> filter.matchesActivityIntentPair(first, second) }
         }
     }
 
     @SuppressLint("ClassVerificationFailure", "NewApi")
-    fun translateParentMetricsPredicate(
-        splitRule: SplitRule
-    ): Predicate<WindowMetrics> {
-        return Predicate<WindowMetrics> {
-            windowMetrics ->
+    private fun translateParentMetricsPredicate(splitRule: SplitRule): Any {
+        return predicateAdapter.buildPredicate(WindowMetrics::class) { windowMetrics ->
             splitRule.checkParentMetrics(windowMetrics)
         }
     }
 
     @SuppressLint("ClassVerificationFailure", "NewApi")
-    fun translateActivityPredicates(
-        activityFilters: Set<ActivityFilter>
-    ): Predicate<Activity> {
-        return Predicate<Activity> {
-            activity ->
+    private fun translateActivityPredicates(activityFilters: Set<ActivityFilter>): Any {
+        return predicateAdapter.buildPredicate(Activity::class) { activity ->
             activityFilters.any { filter -> filter.matchesActivity(activity) }
         }
     }
 
     @SuppressLint("ClassVerificationFailure", "NewApi")
-    fun translateIntentPredicates(
-        activityFilters: Set<ActivityFilter>
-    ): Predicate<Intent> {
-        return Predicate<Intent> {
-            intent ->
+    private fun translateIntentPredicates(activityFilters: Set<ActivityFilter>): Any {
+        return predicateAdapter.buildPredicate(Intent::class) { intent ->
             activityFilters.any { filter -> filter.matchesIntent(intent) }
         }
     }
 
     @SuppressLint("WrongConstant") // Converting from Jetpack to Extensions constants
     private fun translateSplitPairRule(
-        rule: SplitPairRule
-    ): androidx.window.extensions.embedding.SplitPairRule {
-        val builder = SplitPairRuleBuilder(
+        rule: SplitPairRule,
+        predicateClass: Class<*>
+    ): OEMSplitPairRule {
+        val builder = SplitPairRuleBuilder::class.java.getConstructor(
+            predicateClass,
+            predicateClass,
+            predicateClass
+        ).newInstance(
             translateActivityPairPredicates(rule.filters),
             translateActivityIntentPredicates(rule.filters),
             translateParentMetricsPredicate(rule)
@@ -138,9 +139,15 @@
 
     @SuppressLint("WrongConstant") // Converting from Jetpack to Extensions constants
     private fun translateSplitPlaceholderRule(
-        rule: SplitPlaceholderRule
-    ): androidx.window.extensions.embedding.SplitPlaceholderRule {
-        val builder = SplitPlaceholderRuleBuilder(
+        rule: SplitPlaceholderRule,
+        predicateClass: Class<*>
+    ): OEMSplitPlaceholderRule {
+        val builder = SplitPlaceholderRuleBuilder::class.java.getConstructor(
+            Intent::class.java,
+            predicateClass,
+            predicateClass,
+            predicateClass
+        ).newInstance(
             rule.placeholderIntent,
             translateActivityPredicates(rule.filters),
             translateIntentPredicates(rule.filters),
@@ -158,33 +165,30 @@
         return builder.build()
     }
 
-    fun translate(
-        rules: Set<EmbeddingRule>
-    ): Set<androidx.window.extensions.embedding.EmbeddingRule> {
-        return rules.map {
-            rule ->
+    private fun translateActivityRule(
+        rule: ActivityRule,
+        predicateClass: Class<*>
+    ): OEMActivityRule {
+        return ActivityRuleBuilder::class.java.getConstructor(
+            predicateClass,
+            predicateClass
+        ).newInstance(
+            translateActivityPredicates(rule.filters),
+            translateIntentPredicates(rule.filters)
+        )
+            .setShouldAlwaysExpand(rule.alwaysExpand)
+            .build()
+    }
+
+    fun translate(rules: Set<EmbeddingRule>): Set<OEMEmbeddingRule> {
+        val predicateClass = predicateAdapter.predicateClassOrNull() ?: return emptySet()
+        return rules.map { rule ->
             when (rule) {
-                is SplitPairRule ->
-                    translateSplitPairRule(rule)
-                is SplitPlaceholderRule ->
-                    translateSplitPlaceholderRule(rule)
-                is ActivityRule ->
-                    ActivityRuleBuilder(
-                        translateActivityPredicates(rule.filters),
-                        translateIntentPredicates(rule.filters)
-                    )
-                        .setShouldAlwaysExpand(rule.alwaysExpand)
-                        .build()
+                is SplitPairRule -> translateSplitPairRule(rule, predicateClass)
+                is SplitPlaceholderRule -> translateSplitPlaceholderRule(rule, predicateClass)
+                is ActivityRule -> translateActivityRule(rule, predicateClass)
                 else -> throw IllegalArgumentException("Unsupported rule type")
             }
         }.toSet()
     }
-
-    private operator fun <F, S> Pair<F, S>.component1(): F {
-        return first
-    }
-
-    private operator fun <F, S> Pair<F, S>.component2(): S {
-        return second
-    }
-}
\ No newline at end of file
+}
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
index b5966da..f2129b9 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
@@ -17,13 +17,13 @@
 package androidx.window.embedding
 
 import android.util.Log
+import androidx.window.core.ConsumerAdapter
 import androidx.window.core.ExperimentalWindowApi
 import androidx.window.embedding.EmbeddingInterfaceCompat.EmbeddingCallbackInterface
 import androidx.window.extensions.WindowExtensionsProvider
 import androidx.window.extensions.embedding.ActivityEmbeddingComponent
-import androidx.window.extensions.embedding.SplitInfo
-import java.util.function.Consumer
-import androidx.window.extensions.embedding.EmbeddingRule as ExtensionsEmbeddingRule
+import java.lang.reflect.Proxy
+import androidx.window.extensions.embedding.SplitInfo as OEMSplitInfo
 
 /**
  * Adapter implementation for different historical versions of activity embedding OEM interface in
@@ -32,26 +32,23 @@
 @ExperimentalWindowApi
 internal class EmbeddingCompat constructor(
     private val embeddingExtension: ActivityEmbeddingComponent,
-    private val adapter: EmbeddingAdapter
+    private val adapter: EmbeddingAdapter,
+    private val consumerAdapter: ConsumerAdapter
 ) : EmbeddingInterfaceCompat {
-    constructor() : this(
-        embeddingComponent(),
-        EmbeddingAdapter()
-    )
 
     override fun setSplitRules(rules: Set<EmbeddingRule>) {
-        embeddingExtension.setEmbeddingRules(adapter.translate(rules))
+        val r = adapter.translate(rules)
+        embeddingExtension.setEmbeddingRules(r)
     }
 
     override fun setEmbeddingCallback(embeddingCallback: EmbeddingCallbackInterface) {
-        try {
-            embeddingExtension.setSplitInfoCallback { splitInfoList ->
-                embeddingCallback.onSplitInfoChanged(
-                    adapter.translate(splitInfoList)
-                )
-            }
-        } catch (e: NoSuchMethodError) {
-            // TODO(b/203472665): Remove the try-catch wrapper after the issue is resolved
+        consumerAdapter.addConsumer(
+            embeddingExtension,
+            List::class,
+            "setSplitInfoCallback"
+        ) { values ->
+            val splitInfoList = values.filterIsInstance<OEMSplitInfo>()
+            embeddingCallback.onSplitInfoChanged(adapter.translate(splitInfoList))
         }
     }
 
@@ -94,22 +91,16 @@
         fun embeddingComponent(): ActivityEmbeddingComponent {
             return if (isEmbeddingAvailable()) {
                 WindowExtensionsProvider.getWindowExtensions().getActivityEmbeddingComponent()
-                    ?: EmptyEmbeddingComponent()
+                    ?: Proxy.newProxyInstance(
+                        EmbeddingCompat::class.java.classLoader,
+                        arrayOf(ActivityEmbeddingComponent::class.java)
+                    ) { _, _, _ -> } as ActivityEmbeddingComponent
             } else {
-                EmptyEmbeddingComponent()
+                Proxy.newProxyInstance(
+                    EmbeddingCompat::class.java.classLoader,
+                    arrayOf(ActivityEmbeddingComponent::class.java)
+                ) { _, _, _ -> } as ActivityEmbeddingComponent
             }
         }
     }
 }
-
-// Empty implementation of the embedding component to use when the device doesn't provide one and
-// avoid null checks.
-private class EmptyEmbeddingComponent : ActivityEmbeddingComponent {
-    override fun setEmbeddingRules(splitRules: MutableSet<ExtensionsEmbeddingRule>) {
-        // empty
-    }
-
-    override fun setSplitInfoCallback(consumer: Consumer<MutableList<SplitInfo>>) {
-        // empty
-    }
-}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
index 9eb1f0e..a134c8e 100644
--- a/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
@@ -21,7 +21,9 @@
 import androidx.annotation.GuardedBy
 import androidx.annotation.VisibleForTesting
 import androidx.core.util.Consumer
+import androidx.window.core.ConsumerAdapter
 import androidx.window.core.ExperimentalWindowApi
+import androidx.window.core.PredicateAdapter
 import androidx.window.embedding.EmbeddingInterfaceCompat.EmbeddingCallbackInterface
 import java.util.concurrent.CopyOnWriteArrayList
 import java.util.concurrent.CopyOnWriteArraySet
@@ -74,7 +76,13 @@
                 if (isExtensionVersionSupported(EmbeddingCompat.getExtensionApiLevel()) &&
                     EmbeddingCompat.isEmbeddingAvailable()
                 ) {
-                    impl = EmbeddingCompat()
+                    impl = EmbeddingBackend::class.java.classLoader?.let { loader ->
+                        EmbeddingCompat(
+                            EmbeddingCompat.embeddingComponent(),
+                            EmbeddingAdapter(PredicateAdapter(loader)),
+                            ConsumerAdapter(loader)
+                        )
+                    }
                     // TODO(b/190433400): Check API conformance
                 }
             } catch (t: Throwable) {
diff --git a/window/window/src/main/java/androidx/window/layout/ExtensionWindowLayoutInfoBackend.kt b/window/window/src/main/java/androidx/window/layout/ExtensionWindowLayoutInfoBackend.kt
index 0dde6b2..da5995e 100644
--- a/window/window/src/main/java/androidx/window/layout/ExtensionWindowLayoutInfoBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/ExtensionWindowLayoutInfoBackend.kt
@@ -16,17 +16,16 @@
 
 package androidx.window.layout
 
-import android.annotation.SuppressLint
 import android.app.Activity
 import androidx.annotation.GuardedBy
 import androidx.core.util.Consumer
+import androidx.window.core.ConsumerAdapter
 import androidx.window.extensions.layout.WindowLayoutComponent
 import androidx.window.layout.ExtensionsWindowLayoutInfoAdapter.translate
 import java.util.concurrent.Executor
 import java.util.concurrent.locks.ReentrantLock
 import kotlin.concurrent.withLock
 import androidx.window.extensions.layout.WindowLayoutInfo as OEMWindowLayoutInfo
-import java.util.function.Consumer as JavaConsumer
 
 /**
  * A wrapper around [WindowLayoutComponent] that ensures
@@ -34,7 +33,8 @@
  * there are active listeners.
  */
 internal class ExtensionWindowLayoutInfoBackend(
-    private val component: WindowLayoutComponent
+    private val component: WindowLayoutComponent,
+    private val consumerAdapter: ConsumerAdapter
 ) : WindowBackend {
 
     private val extensionWindowBackendLock = ReentrantLock()
@@ -42,6 +42,8 @@
     private val activityToListeners = mutableMapOf<Activity, MulticastConsumer>()
     @GuardedBy("lock")
     private val listenerToActivity = mutableMapOf<Consumer<WindowLayoutInfo>, Activity>()
+    @GuardedBy("lock")
+    private val consumerToToken = mutableMapOf<MulticastConsumer, ConsumerAdapter.Subscription>()
 
     /**
      * Registers a listener to consume new values of [WindowLayoutInfo]. If there was a listener
@@ -65,7 +67,16 @@
                 activityToListeners[activity] = consumer
                 listenerToActivity[callback] = activity
                 consumer.addListener(callback)
-                component.addWindowLayoutInfoListener(activity, consumer)
+                val disposableToken = consumerAdapter.createSubscription(
+                    component,
+                    OEMWindowLayoutInfo::class,
+                    "addWindowLayoutInfoListener",
+                    "removeWindowLayoutInfoListener",
+                    activity
+                ) { value ->
+                    consumer.accept(value)
+                }
+                consumerToToken[consumer] = disposableToken
             }
         }
     }
@@ -81,20 +92,19 @@
             val multicastListener = activityToListeners[activity] ?: return
             multicastListener.removeListener(callback)
             if (multicastListener.isEmpty()) {
-                component.removeWindowLayoutInfoListener(multicastListener)
+                consumerToToken.remove(multicastListener)?.dispose()
             }
         }
     }
 
     /**
-     * A class that implements [JavaConsumer] by aggregating multiple instances of [JavaConsumer]
+     * A class that implements [Consumer] by aggregating multiple instances of [Consumer]
      * and multicasting each value that is consumed. [MulticastConsumer] also replays the last known
      * value whenever a new consumer registers.
      */
-    @SuppressLint("NewApi") // TODO(b/205656281) window-extensions is only available in R+
     private class MulticastConsumer(
         private val activity: Activity
-    ) : JavaConsumer<OEMWindowLayoutInfo> {
+    ) : Consumer<OEMWindowLayoutInfo> {
         private val multicastConsumerLock = ReentrantLock()
         @GuardedBy("lock")
         private var lastKnownValue: WindowLayoutInfo? = null
diff --git a/window/window/src/main/java/androidx/window/layout/SafeWindowLayoutComponentProvider.kt b/window/window/src/main/java/androidx/window/layout/SafeWindowLayoutComponentProvider.kt
index 6785ecf..6c9ec9d 100644
--- a/window/window/src/main/java/androidx/window/layout/SafeWindowLayoutComponentProvider.kt
+++ b/window/window/src/main/java/androidx/window/layout/SafeWindowLayoutComponentProvider.kt
@@ -18,65 +18,62 @@
 
 import android.app.Activity
 import android.graphics.Rect
-import android.os.Build
-import androidx.annotation.RequiresApi
+import androidx.window.core.ConsumerAdapter
 import androidx.window.extensions.WindowExtensionsProvider
 import androidx.window.extensions.layout.WindowLayoutComponent
 import java.lang.reflect.Method
 import java.lang.reflect.Modifier
-import java.util.function.Consumer
 import kotlin.reflect.KClass
 
-internal object SafeWindowLayoutComponentProvider {
+internal class SafeWindowLayoutComponentProvider(
+    private val loader: ClassLoader,
+    private val consumerAdapter: ConsumerAdapter
+) {
 
-    val windowLayoutComponent: WindowLayoutComponent? by lazy {
-        val loader = SafeWindowLayoutComponentProvider::class.java.classLoader
-        if (loader != null && canUseWindowLayoutComponent(loader)) {
-            try {
-                WindowExtensionsProvider.getWindowExtensions().windowLayoutComponent
-            } catch (e: UnsupportedOperationException) {
+    val windowLayoutComponent: WindowLayoutComponent?
+        get() {
+            return if (canUseWindowLayoutComponent()) {
+                try {
+                    WindowExtensionsProvider.getWindowExtensions().windowLayoutComponent
+                } catch (e: UnsupportedOperationException) {
+                    null
+                }
+            } else {
                 null
             }
-        } else {
-            null
         }
+
+    private fun canUseWindowLayoutComponent(): Boolean {
+        return isWindowLayoutProviderValid() &&
+            isWindowExtensionsValid() &&
+            isWindowLayoutComponentValid() &&
+            isFoldingFeatureValid()
     }
 
-    private fun canUseWindowLayoutComponent(classLoader: ClassLoader): Boolean {
-        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            isWindowLayoutProviderValid(classLoader) &&
-                isWindowExtensionsValid(classLoader) &&
-                isWindowLayoutComponentValid(classLoader) &&
-                isFoldingFeatureValid(classLoader)
-        } else {
-            false
-        }
-    }
-
-    private fun isWindowLayoutProviderValid(classLoader: ClassLoader): Boolean {
+    private fun isWindowLayoutProviderValid(): Boolean {
         return validate {
-            val providerClass = windowExtensionsProviderClass(classLoader)
+            val providerClass = windowExtensionsProviderClass
             val getWindowExtensionsMethod = providerClass.getDeclaredMethod("getWindowExtensions")
-            val windowExtensionsClass = windowExtensionsClass(classLoader)
+            val windowExtensionsClass = windowExtensionsClass
             getWindowExtensionsMethod.doesReturn(windowExtensionsClass) &&
                 getWindowExtensionsMethod.isPublic
         }
     }
 
-    private fun isWindowExtensionsValid(classLoader: ClassLoader): Boolean {
+    private fun isWindowExtensionsValid(): Boolean {
         return validate {
-            val extensionsClass = windowExtensionsClass(classLoader)
+            val extensionsClass = windowExtensionsClass
             val getWindowLayoutComponentMethod =
                 extensionsClass.getMethod("getWindowLayoutComponent")
-            val windowLayoutComponentClass = windowLayoutComponentClass(classLoader)
+            val windowLayoutComponentClass = windowLayoutComponentClass
             getWindowLayoutComponentMethod.isPublic &&
                 getWindowLayoutComponentMethod.doesReturn(windowLayoutComponentClass)
         }
     }
 
-    private fun isFoldingFeatureValid(classLoader: ClassLoader): Boolean {
+    private fun isFoldingFeatureValid(): Boolean {
         return validate {
-            val foldingFeatureClass = foldingFeatureClass(classLoader)
+            val foldingFeatureClass = foldingFeatureClass
             val getBoundsMethod = foldingFeatureClass.getMethod("getBounds")
             val getTypeMethod = foldingFeatureClass.getMethod("getType")
             val getStateMethod = foldingFeatureClass.getMethod("getState")
@@ -89,18 +86,18 @@
         }
     }
 
-    @RequiresApi(24)
-    private fun isWindowLayoutComponentValid(classLoader: ClassLoader): Boolean {
+    private fun isWindowLayoutComponentValid(): Boolean {
         return validate {
-            val windowLayoutComponent = windowLayoutComponentClass(classLoader)
+            val consumerClass = consumerAdapter.consumerClassOrNull() ?: return@validate false
+            val windowLayoutComponent = windowLayoutComponentClass
             val addListenerMethod = windowLayoutComponent
                 .getMethod(
                     "addWindowLayoutInfoListener",
                     Activity::class.java,
-                    Consumer::class.java
+                    consumerClass
                 )
             val removeListenerMethod = windowLayoutComponent
-                .getMethod("removeWindowLayoutInfoListener", Consumer::class.java)
+                .getMethod("removeWindowLayoutInfoListener", consumerClass)
             addListenerMethod.isPublic && removeListenerMethod.isPublic
         }
     }
@@ -128,15 +125,23 @@
         return returnType.equals(clazz)
     }
 
-    private fun windowExtensionsProviderClass(classLoader: ClassLoader) =
-        classLoader.loadClass("androidx.window.extensions.WindowExtensionsProvider")
+    private val windowExtensionsProviderClass: Class<*>
+        get() {
+            return loader.loadClass("androidx.window.extensions.WindowExtensionsProvider")
+        }
 
-    private fun windowExtensionsClass(classLoader: ClassLoader) =
-        classLoader.loadClass("androidx.window.extensions.WindowExtensions")
+    private val windowExtensionsClass: Class<*>
+        get() {
+            return loader.loadClass("androidx.window.extensions.WindowExtensions")
+        }
 
-    private fun foldingFeatureClass(classLoader: ClassLoader) =
-        classLoader.loadClass("androidx.window.extensions.layout.FoldingFeature")
+    private val foldingFeatureClass: Class<*>
+        get() {
+            return loader.loadClass("androidx.window.extensions.layout.FoldingFeature")
+        }
 
-    private fun windowLayoutComponentClass(classLoader: ClassLoader) =
-        classLoader.loadClass("androidx.window.extensions.layout.WindowLayoutComponent")
+    private val windowLayoutComponentClass: Class<*>
+        get() {
+            return loader.loadClass("androidx.window.extensions.layout.WindowLayoutComponent")
+        }
 }
diff --git a/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt b/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
index 683c043..9851649 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowInfoTracker.kt
@@ -21,6 +21,7 @@
 import android.util.Log
 import androidx.annotation.RestrictTo
 import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
+import androidx.window.core.ConsumerAdapter
 import kotlinx.coroutines.flow.Flow
 
 /**
@@ -52,6 +53,24 @@
         private val DEBUG = false
         private val TAG = WindowInfoTracker::class.simpleName
 
+        @Suppress("MemberVisibilityCanBePrivate") // Avoid synthetic accessor
+        internal val extensionBackend: WindowBackend? by lazy {
+            try {
+                val loader = WindowInfoTracker::class.java.classLoader
+                val provider = loader?.let {
+                    SafeWindowLayoutComponentProvider(loader, ConsumerAdapter(loader))
+                }
+                provider?.windowLayoutComponent?.let { component ->
+                    ExtensionWindowLayoutInfoBackend(component, ConsumerAdapter(loader))
+                }
+            } catch (t: Throwable) {
+                if (DEBUG) {
+                    Log.d(TAG, "Failed to load WindowExtensions")
+                }
+                null
+            }
+        }
+
         private var decorator: WindowInfoTrackerDecorator = EmptyDecorator
 
         /**
@@ -64,27 +83,11 @@
         @JvmName("getOrCreate")
         @JvmStatic
         public fun getOrCreate(context: Context): WindowInfoTracker {
-            val repo = WindowInfoTrackerImpl(
-                    WindowMetricsCalculatorCompat,
-                    windowBackend(context)
-                )
+            val backend = extensionBackend ?: SidecarWindowBackend.getInstance(context)
+            val repo = WindowInfoTrackerImpl(WindowMetricsCalculatorCompat, backend)
             return decorator.decorate(repo)
         }
 
-        @Suppress("MemberVisibilityCanBePrivate") // Avoid synthetic accessor
-        internal fun windowBackend(context: Context): WindowBackend {
-            val extensionBackend = try {
-                SafeWindowLayoutComponentProvider.windowLayoutComponent
-                    ?.let(::ExtensionWindowLayoutInfoBackend)
-            } catch (t: Throwable) {
-                if (DEBUG) {
-                    Log.d(TAG, "Failed to load WindowExtensions")
-                }
-                null
-            }
-            return extensionBackend ?: SidecarWindowBackend.getInstance(context)
-        }
-
         @JvmStatic
         @RestrictTo(LIBRARY_GROUP)
         public fun overrideDecorator(overridingDecorator: WindowInfoTrackerDecorator) {
diff --git a/window/window/src/test/java/androidx/window/core/ConsumerAdapterTest.kt b/window/window/src/test/java/androidx/window/core/ConsumerAdapterTest.kt
new file mode 100644
index 0000000..6df72e2
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/core/ConsumerAdapterTest.kt
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.window.core
+
+import android.app.Activity
+import android.os.Build
+import androidx.annotation.RequiresApi
+import com.nhaarman.mockitokotlin2.mock
+import java.util.function.Consumer
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+
+class ConsumerAdapterTest {
+
+    internal class TestListenerInterface {
+
+        val consumers = mutableListOf<Consumer<String>>()
+
+        fun addConsumer(c: Consumer<String>) {
+            consumers.add(c)
+        }
+
+        @Suppress("UNUSED_PARAMETER")
+        fun addConsumer(a: Activity, c: Consumer<String>) {
+            consumers.add(c)
+        }
+
+        fun removeConsumer(c: Consumer<String>) {
+            consumers.remove(c)
+        }
+    }
+
+    private val value = "SOME_VALUE"
+    private val loader = ConsumerAdapterTest::class.java.classLoader!!
+    private val listenerInterface = TestListenerInterface()
+    private val adapter = ConsumerAdapter(loader)
+
+    @Before
+    fun setUp() {
+        assumeTrue(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
+    }
+
+    @Test
+    @RequiresApi(24)
+    fun testAddByReflection() {
+        val values = mutableListOf<String>()
+        adapter.addConsumer(listenerInterface, String::class, "addConsumer") { s: String ->
+            values.add(s)
+        }
+
+        assertEquals(1, listenerInterface.consumers.size)
+        listenerInterface.consumers.first().accept(value)
+        assertEquals(listOf(value), values)
+    }
+
+    @Test
+    @RequiresApi(24)
+    fun testSubscribeByReflection() {
+        val values = mutableListOf<String>()
+        adapter.createSubscription(
+            listenerInterface,
+            String::class,
+            "addConsumer",
+            "removeConsumer",
+            mock()
+        ) { s: String ->
+            values.add(s)
+        }
+
+        assertEquals(1, listenerInterface.consumers.size)
+        listenerInterface.consumers.first().accept(value)
+        assertEquals(listOf(value), values)
+    }
+
+    @Test
+    @RequiresApi(24)
+    fun testDisposeSubscribe() {
+        val values = mutableListOf<String>()
+        val subscription = adapter.createSubscription(
+            listenerInterface,
+            String::class,
+            "addConsumer",
+            "removeConsumer",
+            mock()
+        ) { s: String ->
+            values.add(s)
+        }
+        subscription.dispose()
+
+        assertTrue(listenerInterface.consumers.isEmpty())
+    }
+
+    @Test
+    @RequiresApi(24)
+    fun testToStringAdd() {
+        val values = mutableListOf<String>()
+        val consumer: (String) -> Unit = { s: String -> values.add(s) }
+        adapter.addConsumer(listenerInterface, String::class, "addConsumer", consumer)
+        assertEquals(consumer.toString(), listenerInterface.consumers.first().toString())
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/test/java/androidx/window/core/PredicateAdapterTest.kt b/window/window/src/test/java/androidx/window/core/PredicateAdapterTest.kt
new file mode 100644
index 0000000..cc8e69c
--- /dev/null
+++ b/window/window/src/test/java/androidx/window/core/PredicateAdapterTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * 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 androidx.window.core
+
+import android.os.Build
+import java.util.function.Predicate
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+class PredicateAdapterTest {
+
+    private val loader = PredicateAdapterTest::class.java.classLoader!!
+    private val predicate = { s: String -> s.isEmpty() }
+    private val pairPredicate = { s: String, t: String -> s == t }
+    private val adapter = PredicateAdapter(loader)
+
+    @Test
+    fun testEquals_sameReference() {
+        val obj = adapter.buildPredicate(String::class, predicate)
+
+        assertTrue(obj == obj)
+    }
+
+    @Test
+    fun testEquals_differentReference() {
+        val lhs = adapter.buildPredicate(String::class, predicate)
+        val rhs = adapter.buildPredicate(String::class, predicate)
+
+        assertFalse(lhs == rhs)
+    }
+
+    @Test
+    fun testPairEquals_sameReference() {
+        val obj = adapter.buildPairPredicate(String::class, String::class, pairPredicate)
+
+        assertTrue(obj == obj)
+    }
+
+    @Test
+    fun testPairEquals_differentReference() {
+        val lhs = adapter.buildPairPredicate(String::class, String::class, pairPredicate)
+        val rhs = adapter.buildPairPredicate(String::class, String::class, pairPredicate)
+
+        assertFalse(lhs == rhs)
+    }
+
+    @Test
+    fun testHashCode() {
+        val actual = adapter.buildPredicate(String::class, predicate).hashCode()
+        assertEquals(predicate.hashCode(), actual)
+    }
+
+    @Test
+    fun testPairHashCode() {
+        val actual = adapter.buildPairPredicate(String::class, String::class, pairPredicate)
+            .hashCode()
+        assertEquals(pairPredicate.hashCode(), actual)
+    }
+
+    @Test
+    fun testToString() {
+        val actual = adapter.buildPredicate(String::class, predicate).toString()
+        assertEquals(predicate.toString(), actual)
+    }
+
+    @Test
+    fun testPairToString() {
+        val actual = adapter.buildPairPredicate(String::class, String::class, pairPredicate)
+            .toString()
+        assertEquals(pairPredicate.toString(), actual)
+    }
+
+    @Test
+    @Suppress("UNCHECKED_CAST") //
+    fun testWrapPredicate() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            return
+        }
+        val actual = adapter.buildPredicate(String::class, predicate) as Predicate<String>
+        val inputs = listOf("", "a", "abcd")
+        inputs.forEach { data ->
+            assertEquals("Checking predicate on $data", predicate(data), actual.test(data))
+        }
+    }
+
+    @Test
+    @Suppress("UNCHECKED_CAST") //
+    fun testWrapPairPredicate() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            return
+        }
+        val actual = adapter.buildPairPredicate(
+            String::class,
+            String::class,
+            pairPredicate
+        ) as Predicate<Pair<String, String>>
+
+        val inputs = listOf("", "a").zip(listOf("", "b"))
+        inputs.forEach { data ->
+            assertEquals(
+                "Checking predicate on $data",
+                pairPredicate(data.first, data.second),
+                actual.test(data)
+            )
+        }
+    }
+
+    @Test
+    @Suppress("UNCHECKED_CAST") //
+    fun test_additionalPredicateMethods() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            return
+        }
+        val actual = adapter.buildPredicate(String::class, predicate) as Predicate<String>
+        val innerAnd = actual.and { true }
+        val outerAnd = Predicate<String> { true }.and(actual)
+
+        val innerOr = actual.and { true }
+        val outerOr = Predicate<String> { true }.and(actual)
+
+        val notNot = actual.negate().negate()
+
+        val inputs = listOf("", "a", "abcd")
+        inputs.forEach { data ->
+            assertEquals(
+                "Checking innerAnd predicate on $data",
+                innerAnd.test(data),
+                actual.test(data)
+            )
+            assertEquals(
+                "Checking outerAnd predicate on $data",
+                outerAnd.test(data),
+                actual.test(data)
+            )
+            assertEquals(
+                "Checking innerOr predicate on $data",
+                innerOr.test(data),
+                actual.test(data)
+            )
+            assertEquals(
+                "Checking outerOr predicate on $data",
+                outerOr.test(data),
+                actual.test(data)
+            )
+            assertEquals(
+                "Checking notNot predicate on $data",
+                notNot.test(data),
+                actual.test(data)
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableConstraints.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableConstraints.java
index 7c2c149..9890dfd 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableConstraints.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableConstraints.java
@@ -79,7 +79,7 @@
                         in.createByteArray());
                 for (ContentUriTrigger trigger : contentUriTriggers) {
                     builder.addContentUriTrigger(trigger.getUri(),
-                            trigger.getTriggerForDescendants());
+                            trigger.isTriggeredForDescendants());
                 }
             }
             // triggerMaxContentDelay
@@ -135,9 +135,9 @@
                 parcel.writeByteArray(serializedTriggers);
             }
             // triggerMaxContentDelay
-            parcel.writeLong(mConstraints.getTriggerMaxContentDelay());
+            parcel.writeLong(mConstraints.getContentTriggerMaxDelayMillis());
             // triggerContentUpdateDelay
-            parcel.writeLong(mConstraints.getTriggerContentUpdateDelay());
+            parcel.writeLong(mConstraints.getContentTriggerUpdateDelayMillis());
         }
     }
 
diff --git a/work/work-runtime/api/current.txt b/work/work-runtime/api/current.txt
index c53f9c9..bae10b8 100644
--- a/work/work-runtime/api/current.txt
+++ b/work/work-runtime/api/current.txt
@@ -42,12 +42,19 @@
   }
 
   public final class Constraints {
+    ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
     ctor public Constraints(androidx.work.Constraints other);
+    method public long getContentTriggerMaxDelayMillis();
+    method public long getContentTriggerUpdateDelayMillis();
+    method public java.util.Set<androidx.work.Constraints.ContentUriTrigger> getContentUriTriggers();
     method public androidx.work.NetworkType getRequiredNetworkType();
     method public boolean requiresBatteryNotLow();
     method public boolean requiresCharging();
     method @RequiresApi(23) public boolean requiresDeviceIdle();
     method public boolean requiresStorageNotLow();
+    property public final long contentTriggerMaxDelayMillis;
+    property public final long contentTriggerUpdateDelayMillis;
+    property public final java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers;
     property public final androidx.work.NetworkType requiredNetworkType;
     field public static final androidx.work.Constraints.Companion Companion;
     field public static final androidx.work.Constraints NONE;
@@ -71,6 +78,14 @@
   public static final class Constraints.Companion {
   }
 
+  public static final class Constraints.ContentUriTrigger {
+    ctor public Constraints.ContentUriTrigger(android.net.Uri uri, boolean isTriggeredForDescendants);
+    method public android.net.Uri getUri();
+    method public boolean isTriggeredForDescendants();
+    property public final boolean isTriggeredForDescendants;
+    property public final android.net.Uri uri;
+  }
+
   public final class Data {
     ctor public Data(androidx.work.Data);
     method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
diff --git a/work/work-runtime/api/public_plus_experimental_current.txt b/work/work-runtime/api/public_plus_experimental_current.txt
index c53f9c9..bae10b8 100644
--- a/work/work-runtime/api/public_plus_experimental_current.txt
+++ b/work/work-runtime/api/public_plus_experimental_current.txt
@@ -42,12 +42,19 @@
   }
 
   public final class Constraints {
+    ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
     ctor public Constraints(androidx.work.Constraints other);
+    method public long getContentTriggerMaxDelayMillis();
+    method public long getContentTriggerUpdateDelayMillis();
+    method public java.util.Set<androidx.work.Constraints.ContentUriTrigger> getContentUriTriggers();
     method public androidx.work.NetworkType getRequiredNetworkType();
     method public boolean requiresBatteryNotLow();
     method public boolean requiresCharging();
     method @RequiresApi(23) public boolean requiresDeviceIdle();
     method public boolean requiresStorageNotLow();
+    property public final long contentTriggerMaxDelayMillis;
+    property public final long contentTriggerUpdateDelayMillis;
+    property public final java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers;
     property public final androidx.work.NetworkType requiredNetworkType;
     field public static final androidx.work.Constraints.Companion Companion;
     field public static final androidx.work.Constraints NONE;
@@ -71,6 +78,14 @@
   public static final class Constraints.Companion {
   }
 
+  public static final class Constraints.ContentUriTrigger {
+    ctor public Constraints.ContentUriTrigger(android.net.Uri uri, boolean isTriggeredForDescendants);
+    method public android.net.Uri getUri();
+    method public boolean isTriggeredForDescendants();
+    property public final boolean isTriggeredForDescendants;
+    property public final android.net.Uri uri;
+  }
+
   public final class Data {
     ctor public Data(androidx.work.Data);
     method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
diff --git a/work/work-runtime/api/restricted_current.txt b/work/work-runtime/api/restricted_current.txt
index c53f9c9..bae10b8 100644
--- a/work/work-runtime/api/restricted_current.txt
+++ b/work/work-runtime/api/restricted_current.txt
@@ -42,12 +42,19 @@
   }
 
   public final class Constraints {
+    ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
     ctor public Constraints(androidx.work.Constraints other);
+    method public long getContentTriggerMaxDelayMillis();
+    method public long getContentTriggerUpdateDelayMillis();
+    method public java.util.Set<androidx.work.Constraints.ContentUriTrigger> getContentUriTriggers();
     method public androidx.work.NetworkType getRequiredNetworkType();
     method public boolean requiresBatteryNotLow();
     method public boolean requiresCharging();
     method @RequiresApi(23) public boolean requiresDeviceIdle();
     method public boolean requiresStorageNotLow();
+    property public final long contentTriggerMaxDelayMillis;
+    property public final long contentTriggerUpdateDelayMillis;
+    property public final java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers;
     property public final androidx.work.NetworkType requiredNetworkType;
     field public static final androidx.work.Constraints.Companion Companion;
     field public static final androidx.work.Constraints NONE;
@@ -71,6 +78,14 @@
   public static final class Constraints.Companion {
   }
 
+  public static final class Constraints.ContentUriTrigger {
+    ctor public Constraints.ContentUriTrigger(android.net.Uri uri, boolean isTriggeredForDescendants);
+    method public android.net.Uri getUri();
+    method public boolean isTriggeredForDescendants();
+    property public final boolean isTriggeredForDescendants;
+    property public final android.net.Uri uri;
+  }
+
   public final class Data {
     ctor public Data(androidx.work.Data);
     method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
diff --git a/work/work-runtime/src/main/java/androidx/work/Constraints.kt b/work/work-runtime/src/main/java/androidx/work/Constraints.kt
index 904eedd..ebe81ed 100644
--- a/work/work-runtime/src/main/java/androidx/work/Constraints.kt
+++ b/work/work-runtime/src/main/java/androidx/work/Constraints.kt
@@ -29,10 +29,32 @@
  * default, WorkRequests do not have any requirements and can run immediately.  By adding
  * requirements, you can make sure that work only runs in certain situations - for example, when you
  * have an unmetered network and are charging.
+ *
+ * @property requiredNetworkType The type of network required for the work to run.
+ * The default value is [NetworkType.NOT_REQUIRED].
+ * @param requiresCharging whether device should be charging for the [WorkRequest] to run. The
+ * default value is `false`.
+ * @param requiresDeviceIdle whether device should be idle for the [WorkRequest] to run. The
+ * default value is `false`.
+ * @param requiresBatteryNotLow whether device battery should be at an acceptable level for the
+ * [WorkRequest] to run. The default value is `false`.
+ * @param requiresStorageNotLow whether the device's available storage should be at an acceptable
+ * level for the [WorkRequest] to run. The default value is `false`.
+ * @property contentTriggerUpdateDelayMillis the delay in milliseconds that is allowed from the
+ * time a `content:` [Uri] change is detected to the time when the [WorkRequest] is scheduled.
+ * If there are more changes during this time, the delay will be reset to the start of the most
+ * recent change. This functionality is identical to the one found in `JobScheduler` and
+ * is described in [android.app.job.JobInfo.Builder.setTriggerContentUpdateDelay]
+ * @property contentTriggerMaxDelayMillis the maximum delay in milliseconds that is allowed
+ * from the first time a `content:` [Uri] change is detected to the time when the [WorkRequest]
+ * is scheduled. This functionality is identical to the one found in `JobScheduler` and is described
+ * in [android.app.job.JobInfo.Builder.setTriggerContentMaxDelay].
+ * @property contentUriTriggers set of [ContentUriTrigger]. [WorkRequest] will run when a local
+ * `content:` [Uri] of one of the triggers in the set is updated.
+ * This functionality is identical to the one found in `JobScheduler` and is described in
+ * [android.app.job.JobInfo.Builder.addTriggerContentUri].
  */
-class Constraints
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-constructor(
+class Constraints(
     @ColumnInfo(name = "required_network_type")
     val requiredNetworkType: NetworkType = NetworkType.NOT_REQUIRED,
     @ColumnInfo(name = "requires_charging")
@@ -42,22 +64,11 @@
     @ColumnInfo(name = "requires_battery_not_low")
     private val requiresBatteryNotLow: Boolean = false,
     @ColumnInfo(name = "requires_storage_not_low")
-    private val requiresStorageNotLow: Boolean,
-    /**
-     * Needed by Room.
-     * @hide
-     */
-    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    private val requiresStorageNotLow: Boolean = false,
     @ColumnInfo(name = "trigger_content_update_delay")
-    val triggerContentUpdateDelay: Long = -1,
-    /**
-     * Needed by Room.
-     * @hide
-     */
-    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    val contentTriggerUpdateDelayMillis: Long = -1,
     @ColumnInfo(name = "trigger_max_content_delay")
-    val triggerMaxContentDelay: Long = -1,
-    @get:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    val contentTriggerMaxDelayMillis: Long = -1,
     @ColumnInfo(name = "content_uri_triggers")
     val contentUriTriggers: Set<ContentUriTrigger> = setOf(),
 ) {
@@ -68,8 +79,8 @@
         requiresBatteryNotLow = other.requiresBatteryNotLow,
         requiresStorageNotLow = other.requiresStorageNotLow,
         contentUriTriggers = other.contentUriTriggers,
-        triggerContentUpdateDelay = other.triggerContentUpdateDelay,
-        triggerMaxContentDelay = other.triggerMaxContentDelay,
+        contentTriggerUpdateDelayMillis = other.contentTriggerUpdateDelayMillis,
+        contentTriggerMaxDelayMillis = other.contentTriggerMaxDelayMillis,
     )
 
     /**
@@ -78,6 +89,7 @@
     fun requiresCharging(): Boolean {
         return requiresCharging
     }
+
     /**
      * @return `true` if the work should only execute while the device is idle
      */
@@ -117,8 +129,8 @@
         if (requiresDeviceIdle != that.requiresDeviceIdle) return false
         if (requiresBatteryNotLow != that.requiresBatteryNotLow) return false
         if (requiresStorageNotLow != that.requiresStorageNotLow) return false
-        if (triggerContentUpdateDelay != that.triggerContentUpdateDelay) return false
-        if (triggerMaxContentDelay != that.triggerMaxContentDelay) return false
+        if (contentTriggerUpdateDelayMillis != that.contentTriggerUpdateDelayMillis) return false
+        if (contentTriggerMaxDelayMillis != that.contentTriggerMaxDelayMillis) return false
         return if (requiredNetworkType != that.requiredNetworkType) false
         else contentUriTriggers == that.contentUriTriggers
     }
@@ -129,9 +141,10 @@
         result = 31 * result + if (requiresDeviceIdle) 1 else 0
         result = 31 * result + if (requiresBatteryNotLow) 1 else 0
         result = 31 * result + if (requiresStorageNotLow) 1 else 0
-        result = 31 * result + (triggerContentUpdateDelay xor (triggerContentUpdateDelay
-            ushr 32)).toInt()
-        result = 31 * result + (triggerMaxContentDelay xor (triggerMaxContentDelay ushr 32)).toInt()
+        result = 31 * result +
+            (contentTriggerUpdateDelayMillis xor (contentTriggerUpdateDelayMillis ushr 32)).toInt()
+        result = 31 * result +
+            (contentTriggerMaxDelayMillis xor (contentTriggerMaxDelayMillis ushr 32)).toInt()
         result = 31 * result + contentUriTriggers.hashCode()
         return result
     }
@@ -165,8 +178,8 @@
             requiresBatteryNotLow = constraints.requiresBatteryNotLow()
             requiresStorageNotLow = constraints.requiresStorageNotLow()
             if (Build.VERSION.SDK_INT >= 24) {
-                triggerContentUpdateDelay = constraints.triggerContentUpdateDelay
-                triggerContentMaxDelay = constraints.triggerMaxContentDelay
+                triggerContentUpdateDelay = constraints.contentTriggerUpdateDelayMillis
+                triggerContentMaxDelay = constraints.contentTriggerMaxDelayMillis
                 contentUriTriggers = constraints.contentUriTriggers.toMutableSet()
             }
         }
@@ -340,8 +353,8 @@
                 requiredNetworkType = requiredNetworkType,
                 requiresBatteryNotLow = requiresBatteryNotLow,
                 requiresStorageNotLow = requiresStorageNotLow,
-                triggerMaxContentDelay = triggerMaxContentDelay,
-                triggerContentUpdateDelay = triggerContentUpdateDelay,
+                contentTriggerMaxDelayMillis = triggerMaxContentDelay,
+                contentTriggerUpdateDelayMillis = triggerContentUpdateDelay,
                 contentUriTriggers = contentUriTriggers,
             )
         }
@@ -354,10 +367,9 @@
      * `JobInfo.Builder#addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri)`.
      *
      * @property uri The local `content:` Uri to observe
-     * @property triggerForDescendants `true` if trigger also applies to descendants of the [Uri]
+     * @property isTriggeredForDescendants `true` if trigger also applies to descendants of the [Uri]
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    class ContentUriTrigger(val uri: Uri, val triggerForDescendants: Boolean) {
+    class ContentUriTrigger(val uri: Uri, val isTriggeredForDescendants: Boolean) {
         override fun equals(other: Any?): Boolean {
             if (this === other) return true
             if (javaClass != other?.javaClass) return false
@@ -365,14 +377,14 @@
             other as ContentUriTrigger
 
             if (uri != other.uri) return false
-            if (triggerForDescendants != other.triggerForDescendants) return false
+            if (isTriggeredForDescendants != other.isTriggeredForDescendants) return false
 
             return true
         }
 
         override fun hashCode(): Int {
             var result = uri.hashCode()
-            result = 31 * result + triggerForDescendants.hashCode()
+            result = 31 * result + isTriggeredForDescendants.hashCode()
             return result
         }
     }
@@ -382,6 +394,6 @@
          * Represents a Constraints object with no requirements.
          */
         @JvmField
-        val NONE = Builder().build()
+        val NONE = Constraints()
     }
 }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java
index 7f193f71..5f0019c 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java
@@ -112,8 +112,8 @@
             for (Constraints.ContentUriTrigger trigger : constraints.getContentUriTriggers()) {
                 builder.addTriggerContentUri(convertContentUriTrigger(trigger));
             }
-            builder.setTriggerContentUpdateDelay(constraints.getTriggerContentUpdateDelay());
-            builder.setTriggerContentMaxDelay(constraints.getTriggerMaxContentDelay());
+            builder.setTriggerContentUpdateDelay(constraints.getContentTriggerUpdateDelayMillis());
+            builder.setTriggerContentMaxDelay(constraints.getContentTriggerMaxDelayMillis());
         }
 
         // We don't want to persist these jobs because we reschedule these jobs on BOOT_COMPLETED.
@@ -136,7 +136,7 @@
     @RequiresApi(24)
     private static JobInfo.TriggerContentUri convertContentUriTrigger(
             Constraints.ContentUriTrigger trigger) {
-        int flag = trigger.getTriggerForDescendants()
+        int flag = trigger.isTriggeredForDescendants()
                 ? JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS : 0;
         return new JobInfo.TriggerContentUri(trigger.getUri(), flag);
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkTypeConverters.kt b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkTypeConverters.kt
index c254b5ce..9e3be24 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkTypeConverters.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkTypeConverters.kt
@@ -243,7 +243,7 @@
                 objectOutputStream.writeInt(triggers.size)
                 for (trigger in triggers) {
                     objectOutputStream.writeUTF(trigger.uri.toString())
-                    objectOutputStream.writeBoolean(trigger.triggerForDescendants)
+                    objectOutputStream.writeBoolean(trigger.isTriggeredForDescendants)
                 }
             }
         }