Merge "Revert "Modify @Discouraged to use class retention""
diff --git a/.gitignore b/.gitignore
index 686e727..cba2583 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 *.iml
 .gradle
 /.idea/libraries
+/.idea/libraries-with-intellij-classes.xml
 /.idea/modules.xml
 /.idea/workspace.xml
 /.idea/runConfigurations
diff --git a/OWNERS b/OWNERS
index 27e3c6a..29a6ff1 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,4 +2,6 @@
 jeffrygaston@google.com
 asfalcone@google.com
 alanv@google.com
-aurimas@google.com
\ No newline at end of file
+aurimas@google.com
+emberrose@google.com
+sjgilbert@google.com
diff --git a/androidx-studio-integration.sh b/androidx-studio-integration.sh
index 6a982c6..68f47ec 100755
--- a/androidx-studio-integration.sh
+++ b/androidx-studio-integration.sh
@@ -19,4 +19,9 @@
 export LINT_VERSION=`grep -oP "(?<=baseVersion = ).*" tools/buildSrc/base/version.properties`
 export LINT_REPO="$(pwd)/out/repo"
 
-tools/gradlew -p tools/metalava --no-daemon --stacktrace -PlintRepo=$LINT_REPO -PlintVersion=$LINT_VERSION
+tools/gradlew -p tools/metalava \
+  --no-daemon \
+  --stacktrace \
+   --dependency-verification=off \
+  -PlintRepo=$LINT_REPO \
+  -PlintVersion=$LINT_VERSION
diff --git a/build.gradle.kts b/build.gradle.kts
index 836cc85..bb2b4b5 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -31,7 +31,7 @@
 }
 
 plugins {
-    kotlin("jvm") version "1.5.21"
+    kotlin("jvm") version "1.5.31"
     id("application")
     id("java")
     id("maven-publish")
@@ -67,9 +67,9 @@
     logger.warn("Building using custom $customLintVersion version of Android Lint")
     customLintVersion
 } else {
-    "30.1.0-alpha01"
+    "30.1.0-alpha13"
 }
-val kotlinVersion: String = "1.5.21"
+val kotlinVersion: String = "1.5.31"
 
 dependencies {
     implementation("com.android.tools.external.org-jetbrains:uast:$studioVersion")
@@ -86,9 +86,10 @@
     implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion")
     implementation("org.ow2.asm:asm:8.0")
     implementation("org.ow2.asm:asm-tree:8.0")
+    implementation("com.google.guava:guava:30.1.1-jre")
     testImplementation("com.android.tools.lint:lint-tests:$studioVersion")
-    testImplementation("junit:junit:4.11")
-    testImplementation("com.google.truth:truth:1.0")
+    testImplementation("junit:junit:4.13.2")
+    testImplementation("com.google.truth:truth:1.1.3")
     testImplementation("org.jetbrains.kotlin:kotlin-test:$kotlinVersion")
 }
 
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index cd06485..9cfea24 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -15,7 +15,7 @@
  */
 
 plugins {
-    kotlin("jvm") version "1.5.21"
+    kotlin("jvm") version "1.5.31"
 }
 
 repositories {
diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts
new file mode 100644
index 0000000..30315ef
--- /dev/null
+++ b/buildSrc/settings.gradle.kts
@@ -0,0 +1,7 @@
+pluginManagement {
+    repositories {
+        // Prefer mavenCentral as that has signed artifacts
+        mavenCentral()
+        gradlePluginPortal()
+    }
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 04cb68f..853d69f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,5 +4,6 @@
 org.gradle.caching=true
 org.gradle.parallel=true
 org.gradle.vfs.watch=true
+org.gradle.dependency.verification.console=verbose
 kotlin.incremental=true
 kotlin.incremental.usePreciseJavaTracking=true
diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys
new file mode 100644
index 0000000..c04cdde
--- /dev/null
+++ b/gradle/verification-keyring.keys
@@ -0,0 +1,5054 @@
+pub    14A84C976D265B25
+uid    Rafi Kamal <rafikamal93@gmail.com>
+
+sub    0190A8A50D88C2C9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+sPa3uBnylgYyUnzuNZB3kLz3zAM04/jc8Vk=
+=/GAm
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    858FC4C4F43856A3
+uid    J. Daniel Kulp <dan@kulp.com>
+uid    J. Daniel Kulp <dkulp@talend.com>
+uid    J. Daniel Kulp <dan.kulp@sopera.com>
+uid    J. Daniel Kulp <dkulp@progress.com>
+uid    J. Daniel Kulp <dkulp@apache.org>
+
+sub    594E23256A36A392
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=rsN2
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    85911F425EC61B51
+uid    Open Source Development <mail@marcphilipp.de>
+
+sub    8B2A34A7D4A9B8B3
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFrKW9IBEACkqUvM7hU1WqOOeb1gZ7pUsRliHuoUvYIrd+hdp+qhPmJ0NG0W
+YhZK5UtJBmqvtHKRkbwYxUuya9zlBmCfQFf0GpFKJ65JSrPSkZADI3aZ4aUkxIUw
+nIRoUHucmr10Xftpebr/zaJk5oR8RdaL5FapapmcZmAaHR9CDWB8XtI318u314jq
+M5rKatnAZMERoPugOvvuAOz4bfZKwdfCmZKfYUM/TMSrSinXrGExSW6z4RhtqmpC
+E5M/7OoVfvDynVJKqNazqgigpmMNhOyzAhQsiKh1K0akyxTZbjeZKsdYfhCXvq0q
+k9+KM/cTllQ54MPnFWiObLkHeK0Waw8bI/vAJ4h4x/XM9iGYpkXv7F2/FVsHQdPe
+YJcwD/CkD8KHyiPaRKMeApiUtZsdAHU0L4X/lNmcooea/7ipskruUgwcm+RdLhRZ
+P949t1e7nqDZfpEHy90NiFxmlRAPSNqBLwefxY/hwBgog2jabDALJVcLCMosFWPj
+MQhFlGSIODiVcW8folGIjzkyNZbNMWkwnl2QnWp/h2TAwYQJOMqcv2MG9o5pyzpx
+97Iz1ngq1FlM/gJnGnNUydP2tAjT2L2U3MP1uX/EdRChdgPqdolqYhdFfwCr0Fpf
+W527bUZpReHCEiQ29ABSnQ711mO+d9+qM6edRyHUoBWz89IHt8sCunuvNwARAQAB
+tC1PcGVuIFNvdXJjZSBEZXZlbG9wbWVudCA8bWFpbEBtYXJjcGhpbGlwcC5kZT6J
+Ak4EEwEIADgWIQT/biwAGUjF8vOLDMOFkR9CXsYbUQUCWspb0gIbAwULCQgHAgYV
+CAkKCwIEFgIDAQIeAQIXgAAKCRCFkR9CXsYbUQyRD/9xm3BqdpWcRCE5UyB6nbwV
+8TgzMmbOhpFhhcjzobly/pKAbcofKsjhreENJkfBVUo+zAFx21ToC5tbH20wRtIE
+vQVCP6sAIzhYWU1ohafqVFP4+PztNBuYTnS6vGvSwzp0IXLIIoxSxo0IOED9uUS9
+DTxh1n9NnDLDe2pfjrXBblQtLSW3W5ISDoUvcoyO7Hk1OByW6MNsSoLvXIUNeVhB
+ju9TfYxFACJSWBhUxJfgip9Y2GrNBJaYGLZrTAoW1Lh1H1DfLV3wHDClQ1+H+oyx
+IOZULEGYY3MgZTd6Ner2yNAUCB7gVa50NiCZXCS74m+XzMrTEsdWjSMUaOe+dL0I
+9MCrgi4ycUHWIfTKx9gGlIOo3hSDMN+8Nj33XPjLT8kcfoFeUX8jTOvC1HFfTuQJ
+x2t/dKHizdrS3F6A/JQa7v8GNTrZFnEXkwgRTf3ccLoo3gPwzNJeCm2xNjvne1VH
+fvxzwNmq8M05oicEigvEed2VMStMhvT7dSiMAf66rEJHjjaHAoNqbLDEATYrWUP2
+I52txHSSxSJohxVP6Ec6dERnqqYi0mVyzBPo7mmFFBisq74w8RvZXyzvXE3BTiDL
+we1E/Z/AXbtJye9DickQ/G6RFtVLbUHQfzyRS/65JPtlH8rqJr58YWlylGImVLwE
+OsKNQrwLZ0UkfaWV7wqr3rkCDQRaylvSARAAnQG636wliEOLkXN662OZS6Qz2+cF
+ltCWboq9oX9FnA1PHnTY2cAtwS214RfWZxkjg6Stau+d1Wb8TsF/SUN3eKRSyrkA
+xlX0v552vj3xmmfNsslQX47e6aEWZ0du0M8jw7/f7Qxp0InkBfpQwjSg4ECoH4cA
+6dOFJIdxBv8dgS4K90HNuIHa+QYfVSVMjGwOjD9St6Pwkbg1sLedITRo59Bbv0J1
+4nE9LdWbCiwNrkDr24jTewdgrDaCpN6msUwcH1E0nYxuKAetHEi2OpgBhaY3RQ6Q
+PQB6NywvmD0xRllMqu4hSp70pHFtm8LvJdWOsJ5we3KijHuZzEbBVTTl+2DhNMI0
+KMoh+P/OmyNOfWD8DL4NO3pVv+mPDZn82/eZ3XY1/oSQrpyJaCBjRKasVTtfiA/F
+gYqTml6qZMjy6iywg84rLezELgcxHHvjhAKd4CfxyuCCgnGT0iRLFZKw44ZmOUqP
+DkyvGRddIyHag1K7UaM/2UMn6iPMy7XWcaFiH5Huhz43SiOdsWGuwNk4dDxHdxmz
+Sjps0H5dkfCciOFhEc54AFcGEXCWHXuxVqIq/hwqTmVl1RY+PTcQUIOfx36WW1ix
+JQf8TpVxUbooK8vr1jOFF6khorDXoZDJNhI2VKomWp8Y38EPGyiUPZNcnmSiezx+
+MoQwAbeqjFMKG7UAEQEAAYkCNgQYAQgAIBYhBP9uLAAZSMXy84sMw4WRH0JexhtR
+BQJaylvSAhsMAAoJEIWRH0JexhtR0LEP/RvYGlaokoosAYI5vNORAiYEc1Ow2McP
+I1ZafHhcVxZhlwF48dAC2bYcasDX/PbEdcD6pwo8ZU8eI8Ht0VpRQxeV/sP01m2Y
+EpAuyZ6jI7IQQCGcwQdN4qzQJxMAASl9JlplH2NniXV1/994FOtesT59ePMyexm5
+7lzhYXP1PGcdt8dH37r6z3XQu0lHRG/KBn7YhyA3zwJcno324KdBRJiynlc7uqQq
++ZptU9fR1+Nx0uoWZoFMsrQUmY34aAOPJu7jGMTG+VseMH6vDdNhhZs9JOlD/e/V
+aF7NyadjOUD4j/ud7c0z2EwqjDKMFTHGbIdawT/7jartT+9yGUO+EmScBMiMuJUT
+dCP4YDh3ExRdqefEBff3uE/rAP73ndNYdIVq9U0gY0uSNCD9JPfj4aCN52y9a2pS
+7Dg7KB/Z8SH1R9IWP+t0HvVtAILdsLExNFTedJGHRh7uaC7pwRz01iivmtAKYICz
+ruqlJie/IdEFFK/sus6fZek29odTrQxx42HGHO5GCNyEdK9jKVAeuZ10vcaNbuBp
+iP7sf8/BsiEU4wHE8gjFeUPRiSjnERgXQwfJosLgf/K/SShQn2dCkYZRNF+SWJ6Z
+2tQxcW5rpUjtclV/bRVkUX21EYfwA6SMB811mI7AVy8WPXCe8La72ukmaxEGbpJ8
+mdzS2PJko7mm
+=l0XA
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A2115AE15F6B8B72
+uid    Stefan Bodewig <bodewig@apache.org>
+uid    Stefan Bodewig <stefan@samaflost.de>
+uid    Stefan Bodewig <stefan.bodewig@freenet.de>
+
+sub    6366592024774157
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBDsSIk4RBADSCj6rUjV64tYCGT1DYKYR7GthyWpNdGHSYLbETBcDatAe1dzQ
+5NsCgfrlybfyeY+y1lxr3T9bqf6zJWDw/718wff96qmmv1qzexSYtmIrj+h53V82
+EXwWOFuYMJisuxdT940iQzosm3GOv4MJdEg3oI2SgfEyRQQ6vO4Ob5rHDwCg5taZ
+nrHOrXx2dIGHxpxRZ0SUl30D/jmtttFjYOQ3LBMriikz5mh2sK3ZnoSRF4o5O0zW
+Ve6e2SFXOEjVjImKsH6KCbdQNelrAdgiyOoXClyQKsQ27pncbdWo6bO0E3POJZVm
+XaeW7iudHVr63rU5PViXObIQrdQl0D59j5brKj4vdlTyUw8kaHPvbKPDEOwvZq4Y
+LJQ5BACA1YilTeXRJqwFsNlpcxCHwlULD4QUVP496prQWf1B7Z6g0KvLGrQsO0Vn
+Jcn+fEqukysTJixSXCPebosltd4RalJIupVYkp4w6MJ7biaDAlLuNhDcI/AiXTmV
+dXUedVXIaM8I3Ne23gucwbAyc0Hvb+3cSAKRhl/azFQhuHBvlrQjU3RlZmFuIEJv
+ZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz6IaAQTEQIAIAIXgAIZAQUCSgkegwUL
+CQgHAwQVCgkIBRYCAwEAAh4BABIHZUdQRwABAQkQohFa4V9ri3IWMwCghs0wCe4g
+GMPBq6jtBXK46e4aHKIAoNn+9NX6NlhF04qaHyDBhXK2HMmuiGIEExECABoFCwcK
+AwQDFQMCAxYCAQIXgAIZAQUCOxIiTwASCRCiEVrhX2uLcgdlR1BHAAEBjzgAn3a+
+nFeNb3mAZQR4lRcXy3F+8eThAJ4iuLt4No6TUB9xNETrm3Y/0TvkU4haBBMRAgAa
+BQsHCgMEAxUDAgMWAgECF4ACGQEFAjsSIk8ACgkQohFa4V9ri3KPOACfdr6cV41v
+eYBlBHiVFxfLcX7x5OEAniK4u3g2jpNQH3E0ROubdj/RO+RTiGIEExECABoFCwcK
+AwQDFQMCAxYCAQIXgAIZAQUCOxIiTwASB2VHUEcAAQEJEKIRWuFfa4tyjzgAn3a+
+nFeNb3mAZQR4lRcXy3F+8eThAJ4iuLt4No6TUB9xNETrm3Y/0TvkU4hXBBMRAgAX
+BQI7EiJOBQsHCgMEAxUDAgMWAgECF4AACgkQohFa4V9ri3IsngCfbIpJDWj6UgXY
+7rBH8To12BgB+RIAn3jw72WJzplAtShVTmuMlRFS+FUNiF8EExECABcFAjsSIk4F
+CwcKAwQDFQMCAxYCAQIXgAASCRCiEVrhX2uLcgdlR1BHAAEBLJ4An2yKSQ1o+lIF
+2O6wR/E6NdgYAfkSAJ948O9lic6ZQLUoVU5rjJURUvhVDYhGBBARAgAGBQI8PtWP
+AAoJEIEEZE9RiYUEnZIAnjOkQx1BfxN9+E7Yiz4MOxqZjSUpAKDQi0Alv/VR61fm
+R7KHZ11J2g+HSIg/AwUQPnWqGv1viMYh0KcbEQJEBQCg5pVlbkJ1n2hivc/Aj+Lx
+Ek34l8kAoKZ39ciVg4Klr1BzgLznmkzw0XDpiEYEExECAAYFAj512sEACgkQ7tHq
+OSJh0HNFuACfb7quMJZHOk5ppmTxf4GVS5bh3E4AniLa5788ktdcZCBE5Or+G+yu
+IGooiJkEEwECAAYFAj513wwACgkQPo+38viDQdknZAPlHNiMnR+LUavo2yOYiJT+
+W9+8+qNs2grYDZ+WSYujaWT2NJrUCYXQRM6gKDyFlkcJvHI9lF2yYMkVetllZVN1
+TJkeEdtbHncNHcdq+ZUQR0NkFKTF9d1K7UI2rfWxt1y6a13TcUjpJXzbtw/OXX9E
+ZSI6QQt4rSFlvci9J3mIRgQQEQIABgUCPnekEAAKCRAVP6DNdaZ2ki/rAJ9Q0x5m
+4SE3hMNGUoMgS0MNmYXDOQCdGa0QW2fZW4B1wSjiUIi6VgY+F7GIRgQTEQIABgUC
+Po3OLAAKCRDKaTl0gQOjfpFKAJ9TY+mKmq0INLC9iqxbEETjNwOn0gCgspeNEqX1
+SUjt932Lj3IvXR6fkAiIRgQQEQIABgUCPqxrPAAKCRCrLDHp1imPAWR5AJ46Qmuc
+7mvaFYOFfgAI88s5tm9csgCdHRUcCCQQfVb+3sHjN0Nh0EFmt3mIRgQQEQIABgUC
+PsoulgAKCRDb0kX8s7KhLBfwAKDV6uwqf9AMBJlr4aE45rWOnlWAeQCgjBYQVHWF
+jV1cmpT06vE4bMDVJ6+IRgQQEQIABgUCQZLyYwAKCRDkE2EzDKpotCz0AKCKjnMl
+yJ5gummKC9JgsF+5tRWtdQCdEpknowAKkfp+mjPa+RzZ2Hr21tKIRgQQEQIABgUC
+QsUygQAKCRCb8iNFL+KLzxoJAJ93VwhrAOqmRhTzp/ckSNw3zme0VwCeLSbxZHqz
+5uSHd934QitJGyu7e5CInAQTAQIABgUCQt6sbwAKCRAxpj2W7BQLgRr2A/9Y437T
+EhY69Y/uYqSD/5fS6Rb6ZuMTjbqoq0b8HS82tMqkSWbPy21H6hqOpuDbQtrOgRS4
+D1leMs9+x1YD68WTGBXqoh23Fg8xqY+bvK0QE6aAyjBhdR+0a16ozl/EuVx4eLB1
+SXKcbZ+a0yq8+d3Y4J7NIVHHdbqe8CIiOgtmkIhGBBIRAgAGBQJC3q1jAAoJEIuW
+KUP8JD88Q+wAoKip8nm/341UvL6L+BXj8Xi47uJrAJ9UghmohfYBH/qiGmVJ43E+
+yQyfeohGBBMRAgAGBQJC3rrlAAoJEDLJ5M42QstL5kkAnRxguozhFaPessqLKU6u
+2y/hBHoqAKDTCiGcuahS112W0jb7I+5g0YNnPIicBBMBAgAGBQJC3sfTAAoJEDfj
+9F/uZeMhwBQD/icOVBudOhJIM5mQWPUKgYvxOOxWDOs7evdLfHfy5BBMUAT8AYFj
+ia0eA1xiaIloLaE3Vj6aUQa7/zRGO/Xzll8mwUR6tTpj/21EknVKj0AB7kCa8akP
+3Kxdp7mB4H6T56kgxK5/1Yx5NFQJtCz258ZktXlryOqy2/5u1yvM1pj2iEYEEBEC
+AAYFAkLfRQIACgkQQeoJoFeTSY8XxQCdFd+XEWqyDkCx37gaIQAG4dHpwiUAoOZ/
+K5OHyTJCNFaBUDtpCh7hL8TPiJwEEwECAAYFAkLfbHgACgkQms08wKmfdd1EGQP+
+I2LRjoDdp8Mb1kv8rgms4+AdQVYL8OAAQGZ7gBjrZqBSxPS5eXP4y7U+zYTS3bp6
+NJy5Uwy+qleDuInb7fIrOydfTJIRdbr/r3pcSl7dMWfWJU6YwSU8rFqSfe3+OvpI
+N6mj2OoPk/kIlHgawOwbeIoiKxZ0N/zVlel/zrLsDl6IRgQTEQIABgUCQt9segAK
+CRBQjq7FMC2laFiFAJoC+pUGxNfmzhz6xM6jToE0x3MchQCgjClOEAqr3fpLPL/c
+Z+/wreCzk06IRgQTEQIABgUCQt9sfAAKCRDdumS6LDEtL3PwAJ9h6hw4rgnbTjHB
+teAR1QlDK8crZQCgrPYAXUjZvwRu7u9NRks0VXVAy3CIRgQQEQIABgUCQt+SdwAK
+CRABBWa85BNjkvdKAKCISLn/W9i8msqgB2XSFFZTnuJ5QgCfafTwFB8xklDjf1o1
+b8KcgryM8E+IRgQQEQIABgUCQuA10AAKCRBzzi77hAj3Vd01AKCgEHV5uiEh+WKc
+A+W8jfukUe67QwCgnjIy1spkxqrTEgGfFX1zm67320aIRgQTEQIABgUCQuDJOAAK
+CRBc/Tf6zHjIk1sSAJ9FyPpAodUdC1hVd0JgpRuuP3vACgCeKapXXly/PWyIONQr
+0r9pOyQbBqOIRgQTEQIABgUCQuDsywAKCRDJtabs4td03xShAJ0V+p5/wzLXGGfq
+Yt31ZMstoh7BNACdFcaH8B/iFUbQrC1lwkQDjricKgmIRgQTEQIABgUCQuDtPAAK
+CRBbloAQ4E+aiX4nAJ4vFmMo2KyOA/gDFXkEIpH7lJT02gCgjA8X/sHY2YY1HS3c
+RnN7zCk2FDSIRgQTEQIABgUCQuDtXwAKCRA39o/1AVr8ip6sAJ9p8omLizwthXYn
+E19AoeCZFfN4ggCg0Ec7O6QMJ3Ei+Zgl9qYi2cI/jmCIRgQTEQIABgUCQuJibwAK
+CRBtmI0XhzFcMfwfAKCrw/b0LAxfs8qFGZjdPfYA+w5owQCeN139a/NUEW1NwkVa
+QfqIXgvwRCmIRgQTEQIABgUCQuNVvgAKCRATLknU5B7cfnoMAJwM99Ys7lwOR4oU
+K8g/yZzingqR+QCgkhNE6V0hHFepSIwvWhMnGJ64cl+IRgQTEQIABgUCQuNk2gAK
+CRB1yqKj85s3UIi0AKCwmGoHF5lNpKtFU2TdqPpyIAmuAQCgjE9dhO8imdYGvj9Y
+xs3SOlXRMYSIRgQTEQIABgUCQuPtZwAKCRAyhk5BnIUiK0KUAJ9akfT5X83q+65x
+ZntuwybYFyYzegCfd8Xmqqi+WiDj89yC8oJOg0QXy5aIRgQQEQIABgUCQuRvEgAK
+CRCM43a4HNSGH+BlAJsGkiqQIS4ht3q2oKHPc/NwgaJluACeOW4EUeXiXX80e0/1
+8RgKCXydsK+IRgQQEQIABgUCQuSSvgAKCRAEkTRC6hujjZ/5AKCO07oQ50NGKu4K
+LqAq/AzVrZ5HBwCfRdQQubkBl7MvkTSsR8gzYUGIyLmIRgQTEQIABgUCQuUQtwAK
+CRBSeS+vmXivhhRnAKCDu8mkOlRee42+BzlEeAbtRiFFBgCggQoeyuzCHpfNWfnJ
+BGR+N0H8DQ6IRgQTEQIABgUCQuURpAAKCRBrc6EGKmI/ckDhAJ99vw2BCyw5BdpV
+HR1LA8J5TadA9QCfXkQCPKRVmxSLa1laoQzTxI04oj2IRgQQEQIABgUCQuXCHQAK
+CRBhGWouMz5OhL2nAJ9QSA7zfhdj9yVbOTD9UsF97swtlACbB3PSeV44dhYUGudi
+ATPnd3gzFQ+IRgQTEQIABgUCQuaZYgAKCRBo64x2+OopZ3sBAJsGnDKK1DvuR30o
+hPrL3kibW+Za3wCcCeQ1MFy1W0x/B11hMb7EuRo6WU6IRgQTEQIABgUCQudhUAAK
+CRBulHWUwVJDGohEAJ99CpRdOA5riHIdhAFTCuUYSqZa3gCdExdUaF3juWhLbsya
+ISJbAOWQ2MmIRgQQEQIABgUCQupj9AAKCRCyvrxAFSkkr+gxAJ9zsz0qkCkJZbt4
+TbY+Uug3Ww8r7gCgl3ATxOwMzY+Z6GT0r64cjHoWhG+IRgQQEQIABgUCQ4efngAK
+CRBmNbbA3ohd06v2AKCHZ+fbpbQNIvlZkBO+9CTBl4k2IwCdHr7QCVQry4VIUhWG
+X5Fkydj5cXCIRgQQEQIABgUCRZ2eTQAKCRAhgklWzkGcj/RKAJ4oLDf0g3L0hIW6
+eUCiNiBIicd+iQCfa9Tyrgk2ODXeo15yVk32SY32ZtaIRgQQEQIABgUCRjjiwwAK
+CRAVRbP+4iLeT6q8AJ9+mkGmhjzYwS8NXtzj/pyPDnjgJACgkA8J1kD8tGogImbS
+IVsOvCGxJvqIRgQQEQIABgUCRjjnnwAKCRBj0K2ukRID5CsAAKCVEH9V0Sai9vJZ
+0wOaxN3LDiSFrgCfS4rBl4od8FHdwLazsy+qqYyjP2OISgQQEQIACgUCRjj3hAMF
+AzwACgkQc92MFgFTAjVJogCeL+3FTTVR5snJx9qbGQsgv23ZaT0An2Hy1CcXVklc
+YBF7LbnbAgbe1HpfiEYEExECAAYFAkY5GrEACgkQ4eHysJkO1KoWSgCfYq2gwbLc
+3lzzLbLd8fmV3S0Ju3IAn1gw4GkDmvAqDOf/u1grZMmrD+gYiEYEExECAAYFAkY8
+UEcACgkQTAQoGDEaPeXj+ACgrhEFOn4z8v3DxIqoRh9tydmBK+4An0vLwUxFOLEW
+zqJkxLiDT8W/ejmZiEUEEBECAAYFAkY8kyoACgkQmHDv8/EvYHIkCgCYgXQZTJ8V
+mHwSX3pXOxnMhp7mbACeIPXwcPvmfP709nfgQ8/GpT2z9ISIRgQTEQIABgUCRj2g
+kgAKCRAuuUaCiIF0AgOBAJ0bJmFzA9WkG5FmfaP4ieG9+SCbXACgw+2wcOA/B94L
+KRtjhJT6j6zSiDmIRgQQEQIABgUCRj3WeAAKCRD1wmAWTO7XXwpbAJ4mr2IxFtx0
+ppkefxx0l0TJ6cFkrQCdEFbc+aMxRKhK9SCAWi3mq1UqEWiIRgQQEQIABgUCRj31
+AAAKCRCgctTQQ1jFhByKAJ9SIielTuD3StxPQpBkAkYP6Ld88ACgg1oPX9ryJA7Y
+uhMD7byXQsETzD+IRgQQEQIABgUCRj4FxQAKCRACpaYFC35s+k/GAJ9/VDyw2vNz
+k1xjcu/QZCa3gGI2zgCfeG8klJ78bAGknzxBlK3XtmoNqASIRgQQEQIABgUCRj4V
+vwAKCRA+Km/CXymIJIvcAJ9QSE4mCQldVnpbYwLTCk+xHDqhcQCggT9P3/rHIzIv
+v1tJ+A1ZJPvXOcqIRgQQEQIABgUCRkC2QwAKCRBtC8c6QFgYN496AJsF7qubP3+R
+gNXvDmm/Ce6BWy9uIQCeJN8tbs1bzPVJEFZ/qUwfdyUYCzyIRgQQEQIABgUCRkxE
+UwAKCRAfISPDa9hyoHbaAKDWenUlgVg+oIHd6Rm2zcr6mftGTACdFZ3oea2NGiVl
+2tl+SpAMkqZ3nO+IRgQQEQIABgUCRkx9AQAKCRAPRQomYhC/wMliAJ9bQL2sMBOg
+tT7QEotgKJbC0Un3wwCfYe9DcIOG/xZOb5q/fqURMuqGOd+IRgQQEQIABgUCRlJv
+WQAKCRAywdbvDxQ7wYZnAKDSXZPU786k4QJez+9gTbrj3A1NpgCgutSksph6/y4c
+B9zneVnosTSHVPSIRgQQEQIABgUCRlJvYAAKCRDLrr45pGxModlvAJ0VKWhYmHe6
+5MuTztpK3i5h5mspOgCgis3t6lnF672f17qGpU4vPznNzdOIRgQQEQIABgUCRl7V
+qgAKCRCahtfM0arqYP5zAKDeTgFGtGLqmOtj9SCAeOGIdZIPVgCeINCfUxUHrbQi
+TZxUvuFHVXRkvpuIRgQQEQIABgUCRqVMLAAKCRA5vlGhCEyRE6pDAJ0eEh2SVVHf
+jVrNUUE7poYCtI4/ZACfRa1IiKpotMRDnv6KvrYXFFgFB1aIRgQQEQIABgUCRq3M
+VAAKCRAzzWczr17EUh1GAJ9IZ+3oohn4JMQ8gavyWnyg6k1ocwCfU0JdlMk5b6vQ
+bmmXLiGW7xRcLgCJARwEEAECAAYFAkfAfZgACgkQGWWFUMMRBhFnhwf/dectbpQB
+0N3iTTGXaVQCP2AHshNRt6MLC+cWpTIoAT0/fxugEc19zpyWJBQ7PghNYM+GKKdu
+M2ckeCWn28rSjhH+0UXIYiYi9ua7ULyXI7YEk+AXbIw2sGBmHHT4iQAbdHiLL0kU
+gMaB12MtBI/hNfe5FQVRcQCEfMYD/9c/i2cLcKKy86y6hzpmPJkZK38dTNmgp/7C
+x0mV9puIrdCkPyVI7DwoRkXnglQLy5pga4EazuKHgVw74CpvnZQDHj/7Xd4R0CiC
+dUXYdtqIj4baMR6TIDAPRs/cNbKD718YG2fC0MyPQ6seSW8DyqgfEAy9ccgaHGOp
+kE4V6GHwM0QHpIhGBBARAgAGBQJJyofZAAoJEMnHkk5RBH1mPpYAnA61GWGrjkN5
+2tg0fnhAglIXDdclAJ9Aj19mXrOYpZKbWcmpdEL5rAqbDIhGBBARAgAGBQJJz9S1
+AAoJECTBo3hqAXsXvlcAnRPJN0IwYhkYKigz/GvfD6q/JkuAAKDRbw71Y5/SrBJW
+DKeaHa9CCBSLIohGBBARAgAGBQJJ0jaPAAoJEK6wGhU7fHWxkeIAoKWxeKecl8cx
+Bh7AU+rLXrOv/9/gAKC6We745sAMcyq64YLDgEvCu+owgohGBBARAgAGBQJKYKvx
+AAoJEIuttKwFuYn5qaoAoJNy4k0KA5AJmh9Hml/HnOB2fI3PAJ9NNr3q4Vxi9xum
+vEwHxiA1WvFdrIhGBBARAgAGBQJKZCSqAAoJEDzzkhzG1ETtLE4An1cH3260Cx+H
+DhNS4RytgLVCSPokAKCdOpeQibuNdXAY/s1LYBipelTB+4hGBBIRAgAGBQJOSOUa
+AAoJEEnH49G0aTGM2q8AoLUytGBOGavD18Fow0+S4t19zcQcAJ4tUWSfPiXaFUo6
+blWHmsRgMNE3MIkCHAQQAQIABgUCTwRWhAAKCRDdnNU4LfQLN3evD/0UNX4rkPv3
+7QGtgs4xl2vbN+ZmLDIL2twpK9Pj8k0JVkRuxkGmG6qPXnH/bMJ7RW00bw5UHqqL
+SGT1JDebpNA4PuaKqHW5n0U02+6Sm8Yr4pHoLzNrmJvdCI/22hTJoEiiRc1sJ4a1
+YDJ4jtIRxfQ10damUYaw6D9dnVFZYfUL5c57tDLQP3VLjkxJogc+x8HdrJKpY1at
+2eL2W1UMpySF9O+d0elAl0tRt10N1xYqcxtxVgT6bq/KZrwvYWjnzpX+QInyOURv
+jA4CzH2KfmXJHCKJoVoGczzA1BOarP1e5tcrQmdi2F9fI6NlPXH/66QoPzAKdMJs
+nMFgExsEocgwz6SNrUkwHZ+2Z7CLG79Jrkb/sCpW8JGiq+ZWPrgTVqqLecssu49t
+l2lOCBZpjmRkejQ5PIoQIeMK0ImLspaLr7XVMXSBm4bU1XPYHuDQrGDBCf5rA6At
+3Ioe7+fHKFyrLkS8d0RGJKp49B6LyWVjMqpMaPQVUajPcOffPe5X3S6lhIVuQc2W
+pg9+n56kqXE5bnzHg85Dp23/h+xyEXNlu8+GFMUIvGkQ5R4HgXE27K+vTieFtK87
+5dPWmbJY+2pVBjMcIFNfU282vbtZLbiOhg64pEHP+pCmJg803HlJbcsZPJF/28J6
+bIhPl/q33HhPrgLHdCs0o1xQcp7A72/PBYkCHAQTAQIABgUCT3RmNgAKCRDflC/g
+uqPk+aAXD/4gSmWpZ3xjO5HDW2v3NIBl4owKoOnuvgjK/rNqDpncd9HCFIm2ol3N
+Ne21eHG2syIpblFWvkU8YrxjKIxzeAxIdO6rdp0VWPpVCoTCwQHOGHCuk+OxHGFH
+KCP2H5raz47UZBI6C0OcUfQ5a2YGzgoxqpsoNeCoPe3s07LRvr1D3QEMmNvsd4j2
+Z4uJvFd2Gwii7baYA8gnzl6ypaaqZioyNs+DcdZikmiO2d1rR3muaKZKBQG5qClt
+p2RHccWki/JmrW2rlsh4rw9OwDrXyEe5TagNUAoRMTvHBvl+YNaP5NJFpWvYpXds
+PXWmGs0ONrNlKXrlMTHjMOQt1mZlFyA6Jp2O1rTTrcmGKcDme5B6bNFfaL6GfeLY
+r3JVnNoVkLbm3OgIjGcYQf/dRej0xOHMfvFKIPwxOTNcXXBgzbblzpQXukyRLuep
+lBwcd2mcLk+5KidOKlrULzlU7MeMDrxPsrmFqG7dE4DuLo9jxyjhm8gCMyQQqp8X
+3CC2CKyojUp9SpShkokDTkPnVK46hL3MUga2AI0oLEf7IImvwvqvnnP52a4c/H9a
+pMbt4vJHpNzJVPTGe20aXiPoh7CH6MU5i9Er7qVIev0EyUnIXhK2LWax90tmsiiy
+/6gahYIC7RaAIxMAPzy36G5g9Yu5nNEpvLRfRiGQtEgSEi8RHbvTfIkCHAQQAQoA
+BgUCWEe6IQAKCRBjf6WERgZUlh42D/9roNDWOjTIK/lEg9tNfqVNZIKL/Or3MwVS
+OaKiWZLyaffefZQj7mrvfkioX2z5Oem2VSvu3ueFOOwjq94Ls1tiqBl9ZfHqB7CJ
+E49EkjYwqPXUwQUnJd7hd8nGcfj5pcHiNWQda8aO7WgskEumPFrz8XKtpKsZ5Vyc
+r3Z4v1ROl0KhgDmxnJvuc5/nj71Q9yQdhANcmZ15RHQJJIBOqmeUghVuQuzsVMvZ
+LQm4IWtVSxea+2CdpOA+X4szICRsvhQXuDiuo0cIjuvkr1i8dnt77+CxcSHNwaX9
+/kMUxz3J+OY8t+YSZUoRvZRpHQ+gTUuyNeOVXfvpxrVqhdzH3EcXChd6RVEfOieP
+/V+GMmz5XYdHMqGM/YwXmfEgAMoRUMokh1Zp1lbV3emfGhu8tRIjw5gh4phkjfdB
+p4nCQSKI4F5OnkfZId9EBpWIyQxvQvhK2/GbNAu/pMYwZdiQt+3fur1bh+yOTRkC
+AHIUghE/pbYGHF4lti+aZIN46NiiYeu/8SxeKVqTlXd9xFspbTjuxr/oOxQmCgci
+EzvdNXz27aN0M5NCuzR9M/dRLpTKQog2aveBvkkeef1+eL5qYUOuBlN52FNTFHDK
+mCYNF8jaQRTUFh5EsY2E3vgkIORgfSizzybv+FMROa24oL3LU6ffVDN2w3+O/Yz0
+rGmVGin7g4kCHAQQAQgABgUCWGDxjwAKCRDLn9TBXzoLde6sD/4gqLevIbHZkK9J
+MvGYzBShBoMp3MFLmtQZ6jGK4rAT6AEoYsayqnjWspBZwK8B5CkaCPRVHdD1zzng
+EjOvmIEpKSBS9MeAe0c0M9aBJS0pIgbnLa4AkrhZ2pBf7Ut0jL0ZW1bUzotXzhdc
+ORBa0fa7B182LTKvIGMXfV3RXmN5M5w5xYo66zN/ABdOieO5gcHyLp82utuuucUK
+9qytJX+Iv42kvOrdm2yHzwvKxO0GQqHE/EVxtt+CnsilwDlKJXkw4dAzGbcjgdLb
+fRLKB5xeUuuafCrzHAoZZAEAUPAzg72/YtlOAHC23IVNPyegvHMs4N9dtBc4lQOF
+h0pv24ab1G7slLTaDYlYgqIuV7Uk7KAKiQEypYF44IUqaqSFmHdv2baGwDpU084F
+m0hQu5ugX0CtkSrfqtSTr9y51boUgneRb3cfVfrCvZbCZtFXMfFVx5d3y72J4NWW
+oJjG7k+iADhlkhkdKl48YDYo7HWcAYxayskDuLL1etLJ6fjmLnxpzj8HJIy+vL/s
+Wfqb1DnBhTwj+UJuuw4ycQmZqi4tlpw0+3+iqRh30sA4tDOgR3uP4S2wvzSmMqyx
+vepWBwdp1d+BWM5Qmf9Xu/Yf8X4ulgKzEp3rProlly78E1D6giG7EL+q0lM5LdIU
+we3oeveZ418AlzswwO25OR451UtPXYkBHAQRAQIABgUCWXH4+gAKCRAXdF71VJep
+B6U+CADe6UdA3isKr5LvGGK4oy2STlg95FwprYkdBr0gnMUFPcCVIHlgUK41UeTN
+fjfkoh0hurHxX8P3UrjUIv4lTrGZAKdH/tRUFWNr3udOqkKg+69NZge/WjqNyU0o
+GIfLBFUbcLamVR0pPGkqleL/jJY3UDUg93Rr7gWVencpGIx61w7R9CLd5m7KtGNs
+mEqKRXY4XW+PjFbKHgrAB/bI+G/AirBHP2Vg22nCO1w/WCf/Pe840GWAMsp0pRGm
+GkX8kd+c9XE8E7oyTBv2lzSSEVoMkU3Iz7FAEKbvLQx9EZH8ICV6QD51wBzM+Y83
+b0SRAUieUfoqqVdh20JTuq2pHjNWiQEcBBIBAgAGBQJZcgr9AAoJEBd0XvVUl6kH
++7EH/3FNNjgEUar5zmCDrk9sSRfB7ayTsQgZIChY3aL+UUxQ3gua8xTF7TUrEx21
+p0/t8CuUjU1qUysCMq89veBrk2s7VHsnFsACvjgXclsbfkHIMiWOT53vFJLt0x1p
+d7999uNAnO+WgdOvPIuIdePMOW4gznMW3LfTkgoc/bn5fGBafivvCYNlCpOPg74T
+ceMNq3u8JIiFouubnabfUpAP8wdz8GDDbKbqMDkratbtIODRco64Rgf2ekFZ3EBg
+f54V39EoZ2g3tBW8f53ikSihRA8h2tlloFiUTTyaP0Zro0wLvDCaAmfuK1YjeIr2
+rsYwp0vFK1EqNLMe1qEiZreKRpq0JFN0ZWZhbiBCb2Rld2lnIDxzdGVmYW5Ac2Ft
+YWZsb3N0LmRlPohgBBMRAgAgAhsDAh4BAheABQJKCR6KBQsJCAcDBBUKCQgFFgID
+AQAACgkQohFa4V9ri3KGAgCguCjU3AcIzhCHzDoBbBd7k0E7y+UAn0NvetIxorPS
+cnvS8v3yNQgTFUMYiF4EExECAB4FAkKcaeUCGwMGCwkIBwMCAxUCAwMWAgECHgEC
+F4AACgkQohFa4V9ri3LJLQCfV5FgLLtMydvd3RmvmG2p/ma9VfQAoN2/T3rXbOnm
+6kGaIh0aKXJG2zi6iEYEEBECAAYFAjw+1Y8ACgkQgQRkT1GJhQSdkgCeM6RDHUF/
+E334TtiLPgw7GpmNJSkAoNCLQCW/9VHrV+ZHsodnXUnaD4dIiD8DBRA+daoa/W+I
+xiHQpxsRAkQFAKDmlWVuQnWfaGK9z8CP4vESTfiXyQCgpnf1yJWDgqWvUHOAvOea
+TPDRcOmIRgQTEQIABgUCPnXawQAKCRDu0eo5ImHQc0W4AJ9vuq4wlkc6TmmmZPF/
+gZVLluHcTgCeItrnvzyS11xkIETk6v4b7K4gaiiImQQTAQIABgUCPnXfDAAKCRA+
+j7fy+INB2SdkA+Uc2IydH4tRq+jbI5iIlP5b37z6o2zaCtgNn5ZJi6NpZPY0mtQJ
+hdBEzqAoPIWWRwm8cj2UXbJgyRV62WVlU3VMmR4R21sedw0dx2r5lRBHQ2QUpMX1
+3UrtQjat9bG3XLprXdNxSOklfNu3D85df0RlIjpBC3itIWW9yL0neYhGBBARAgAG
+BQI+d6QQAAoJEBU/oM11pnaSL+sAn1DTHmbhITeEw0ZSgyBLQw2ZhcM5AJ0ZrRBb
+Z9lbgHXBKOJQiLpWBj4XsYhGBBMRAgAGBQI+jc4sAAoJEMppOXSBA6N+kUoAn1Nj
+6YqarQg0sL2KrFsQROM3A6fSAKCyl40SpfVJSO33fYuPci9dHp+QCIhGBBARAgAG
+BQI+rGs8AAoJEKssMenWKY8BZHkAnjpCa5zua9oVg4V+AAjzyzm2b1yyAJ0dFRwI
+JBB9Vv7eweM3Q2HQQWa3eYhGBBARAgAGBQI+yi6WAAoJENvSRfyzsqEsF/AAoNXq
+7Cp/0AwEmWvhoTjmtY6eVYB5AKCMFhBUdYWNXVyalPTq8ThswNUnr4hGBBARAgAG
+BQJCuAqrAAoJEIEEZE9RiYUE/RUAoI8fRvtL5PKVXW4G5hxidYhv9EnPAJ4m9FMw
++dY2NXP4JU69XMlMfiiXmYhGBBARAgAGBQJCxTKGAAoJEJvyI0Uv4ovPeKoAoJdF
+lZ0aMFVuPcgEWXeS+HfEXaCyAJwPcfv2ZtUNE0zGkYCsVDWGpAXOV4icBBMBAgAG
+BQJC3qxxAAoJEDGmPZbsFAuB5s4EAIAUWkQoRM7dkduMyc+iAAI2voRkJDHMZMhe
+tdLJZCzrxVwfnjBQ4DjKTdwal8famADFiNod6NMlG8Mq8as8aUoeAJkXLj7AfOjX
+ulb0nVoqTaxRaVPruycNV0y6f+LxbEP3LPb31xdHqILE98/YcgwSpuzFYlpchOjt
+2tZKM7fliEYEExECAAYFAkLesLIACgkQ/W+IxiHQpxt9FACgwsbD2ZLCiHL4+7Wx
+0BMJvj1efg8AoOz6K1AoCL0yFpyA/M0VgwRuAAl2iEYEExECAAYFAkLeuu0ACgkQ
+MsnkzjZCy0v3dgCcDOwUCEIKiwNKgO+UdhIxxV0CmVgAoKO4mgDR8SEXPzcNfY/A
+sTW1iUSeiJwEEwECAAYFAkLex9kACgkQN+P0X+5l4yFFrAQAz3B+f2wEiwXNBFBs
+A76WXzd/ySL74DgCePoNdDjFGYKVTGpqEvUGPHF5CET5CiarUh5sMmvRJ7fhcHSD
+cntvOv+L1CYTASqcMl9ZWhu/VSCPL7WPMSuVkGGbyGcIj7M+etYouTSfvy/MnlGu
+dVpNNX45bmvit1VnzrIpge2lVKiIRgQQEQIABgUCQt9FDAAKCRBB6gmgV5NJjzHQ
+AJ9IfkjKkiEuFxUhznsghAQ8bsBWnACgoT0kWSB3iUepLIDoWhhGtDIS5FSInAQT
+AQIABgUCQt9seQAKCRCazTzAqZ913QcNA/wMMP7UVBTw88974q5/Zsk47thyt6Pg
+kXUj8ZuzYcffFeA5mxG/pYnjUz+i/EktiulWpADZgX8bHCC7Ct/iU+T7iykV1puC
+6IkrR3b8pkC2cuyMjN1hyhjTUgoZPfGQ/AgMSs0VKbFfpsoJR49wU0dhnp0MEcUV
+xhVOx2j/BsB7pohGBBMRAgAGBQJC32x7AAoJEFCOrsUwLaVojHcAmwXQeOubg3bU
+TB2uaFL08cpAvYp2AKCOW6zYbK4LNp+Bv0kdWEEOuF6WSYhGBBMRAgAGBQJC32x9
+AAoJEN26ZLosMS0vsxYAoLqtBTpmNJLqBWfCzC61qoHB/C2/AKC/aYwYl/aGdhVo
+02pXlYgUC7JyY4hGBBMRAgAGBQJC4Mk7AAoJEFz9N/rMeMiT1OUAn11szYejAjmg
+PqEZKcAOEjZ0p8GtAKDg71a0WJHMuoLVOAICxuKCrL4kOIhGBBMRAgAGBQJC4OzM
+AAoJEMm1puzi13TfXWkAn0vfJR7sZR4OozN3dYtZq1yV/uu5AJ456cD2eHIqAcBJ
+4Qr9ldBcMMFbS4hGBBMRAgAGBQJC4O1AAAoJEFuWgBDgT5qJs1UAnjCcB9wD+u1S
+zf4e72c2fxqv/ZDnAJ97pb6T3IeN3uFladgd2cKQBmQ4x4hGBBMRAgAGBQJC4mJv
+AAoJEG2YjReHMVwx7NAAoKeT5KjQCebiQsPCX6yse8gHtvqMAKCpE4E3kx4QZdCb
+4ZqfZVK36e9Nn4hGBBMRAgAGBQJC41XAAAoJEBMuSdTkHtx+VHQAoJMCV+E8XAc9
+ecGj7khE6inA1CexAKCHa8dL1VFlG3kj2Kw0No1/VuIJCYhGBBMRAgAGBQJC42Tb
+AAoJEHXKoqPzmzdQr1cAoIQuLvKbG0vF3Bh919Xd3F3reZXbAKCOBpSVCoVePHmZ
+edGyDLhLpxL3K4hGBBMRAgAGBQJC4+1qAAoJEDKGTkGchSIrC7IAnA6WMvb759VD
+QFIpG8VK9L59K7coAJ4nGw6FvIJ3ejeurBpV5jkUWL4Wb4hGBBARAgAGBQJC5G8U
+AAoJEIzjdrgc1IYfn+wAn0lUcxXAHAcPw83cNCryEcS6afy3AJ9VBJeig1jY/vjg
+r7yTqUs7yc4foYhGBBARAgAGBQJC5JLHAAoJEASRNELqG6ONv6oAnRn4CgYNh7Xb
+bBEA5gAprKX1/17RAJ4p62iWXo1n5Gb80psUkY/p9jLAi4hGBBMRAgAGBQJC5RC3
+AAoJEFJ5L6+ZeK+G/Q4AnRKD9QScH8gCiqMfMqgGK8IxgO2tAJ9VjcgMpEdtss19
+YFIMRFYJOkde2IhGBBMRAgAGBQJC5RGlAAoJEGtzoQYqYj9yoYEAoMSBN7DO3pOO
+YKQj1GtiMXjpr0fjAJ4k+HhuZPKZx/BEafrSHRr0zPWYpohGBBARAgAGBQJC5cIg
+AAoJEGEZai4zPk6EN3sAnjSXftwtlxLF8+3czv9o4+BUalrnAJ9yJoTKfO4cN8hA
+P++1etlvabT414hGBBMRAgAGBQJC5pliAAoJEGjrjHb46ilneUQAn3DgRYCBFQzF
+/RR3XOjKBgNB50CBAJ4k8dJuTrYSPXU2WM0Y3XN3DNEe5IhGBBMRAgAGBQJC52FX
+AAoJEG6UdZTBUkMaQ58AoKBAz7nR1OS0kNoN3yBU4YEpGJIiAKCRP2B20NpzSb2z
+YgcCqS2TSZzRT4hGBBARAgAGBQJC6mP4AAoJELK+vEAVKSSvBCwAnAzwiq1dCT9M
+GJCLoXKr8cebn/O8AKDlq1lXwX6vuNVGFPVIn4VpWxpAOIhGBBARAgAGBQJDh5+e
+AAoJEGY1tsDeiF3Tm68AoKMyefgamdmGNYVLuI3QsheDGbk/AJ9ih2MoXnNJshE7
+Hv10njUaDT9XFYhGBBARAgAGBQJGOOLIAAoJEBVFs/7iIt5POc8AoJohQp2LJJqu
+G7//MRWfrvL2r+zMAJwNShvUvZpzVHUUcH1cTh9N/89XUohGBBARAgAGBQJGOOei
+AAoJEGPQra6REgPkWVUAmgOFzR2KNS8+Y4oguRfp8bmDvcO6AJ4+w6uNb5ghzn5P
+2p5UzMfJ+baim4hKBBARAgAKBQJGOPeHAwUDPAAKCRBz3YwWAVMCNX3ZAJ4j7TbI
+uRKqZ0mUwFV9UT2OhP+kEACeMmXLCi3fw9LwW2h2WIJ82+qfpUiIRgQTEQIABgUC
+RjkauQAKCRDh4fKwmQ7UqvVYAJ9BjHLDyGmR56xKlKF3qVq1+jAmgwCfQR+0qbVW
+aSIaVS1DCg8yUr2txOeIRgQTEQIABgUCRjxQRwAKCRBMBCgYMRo95VO1AKCewEwA
+scfj9VfTxswF6BL6zNj8rACfW/3kG7zPI2dSjWJzGYPQYPAa0smIRgQQEQIABgUC
+RjyTKgAKCRCYcO/z8S9gctnJAKCc7DZ7JzXgaB4ImiwB2dyGMFUC8QCgitOFKEw1
+y4+V1dNN3kZYL4P/M/uIRgQTEQIABgUCRj2gkgAKCRAuuUaCiIF0AjxRAKCu9kiQ
+fvVmSrVZb9HK8Mazhut+hwCfY5guSOz96KH5dJ2585cm5wPyT5mIRgQQEQIABgUC
+Rj3WeAAKCRD1wmAWTO7XX04yAJ4/ZvOfsexCgIQRuoREg1/D9bniKgCfTcKh9dLF
+kPjlD3yIw/NCc1L0/ruIRgQQEQIABgUCRj31BQAKCRCgctTQQ1jFhJmBAJ0TPZlI
+ksq1EnAYtTTSb/tHpXxNUACfd/m3jaTHdJljRXGI7UBsVHnL0nWIRgQQEQIABgUC
+Rj4FxQAKCRACpaYFC35s+iQnAJ0eGzB7NIQtXLEgyuphyW0nBppVrQCcDj6tm1MC
+KXA7f4zV1R0u30jrUeCIRgQQEQIABgUCRkC2TAAKCRBtC8c6QFgYNx9XAJ9tLptL
+bRXUSWe5AECh+yaLTKNvOgCfd7O2sNAiuH78GRcgmjsgXQ3L6BWIRgQQEQIABgUC
+RkxEUwAKCRAfISPDa9hyoE+oAKDWPLql5498S69gkQp8kE0bsVXA/ACffLn94G1l
+1F5+P3QV4iJLd2vcPeyIRgQQEQIABgUCRkx9AQAKCRAPRQomYhC/wB8tAJ94fMkH
+q0l0DhuM8RwkqLSwwVx4LACcCi+SN1SEXZomukrZyvhtmGblFuGIRgQQEQIABgUC
+RlJvWQAKCRAywdbvDxQ7wV0UAJ9IXObPPeVmYH6pyVSrur5hWB3eFgCdHI2LeJgt
+RWuTvjpey/NZy/xSidGIRgQQEQIABgUCRlJvYAAKCRDLrr45pGxMoTQuAJ9hl9e0
+H0SvuIpegN+E264Mh0qapACeIY0LemIsEKCAw+knm9CnYqym28mIRgQQEQIABgUC
+Rl7VqgAKCRCahtfM0arqYLylAJ95XaJv5iaj8pD6NiyvUHFhUUI6awCg7fXa8uC/
+xDjqG5wYir1o3aKwScSIRgQQEQIABgUCRqVMLgAKCRA5vlGhCEyRE+XjAJ95t+iW
+ktlh0aTjwm5TB3ayG2SJzACgwYB005KhfKcj/r9v2OzFCXyqbBmIRgQQEQIABgUC
+Rq3MVwAKCRAzzWczr17EUgGWAKDQJRDWHrWUIsGMT378q+ySuHVACACfSBd6rU0o
+S56kMHqFCjt9VmtKkXyJARwEEAECAAYFAkfAfZgACgkQGWWFUMMRBhHxkQgAsBgX
+GKmTsV+kNsSdStMjbftC6AqOm+tf2fsJ0fEkufA4GvWDb979EyCgkcfzKo/yJA8Y
+x9lcJUszowT8ShRABVPQzQjVCwFXFMhfI+pAjMK/rOJstjIRcOVAM1UHiGp2GjPP
+HKMau6pufvnN9vyaVMyiP2USU2FUh1xQ5UvbEeQHLqD9ima5lv+m3gdcE5TJaSYU
+rzMEzGFfDls644/bNImT2tm3vB0o2PeIL7/73frJdnOpYW5Q6rRFfrVG1bx7dIl+
+jAYUF3vbyyeyIPQgUtNeivrZoF8EnnKIYoVQEzwtDbsVwlqx+jtrxKIFsk4786zJ
+DWVG8tLzmQz5dkNdlohGBBARAgAGBQJJyofZAAoJEMnHkk5RBH1mW3wAoIAwBzzr
+naqApU90fRclvOirrKQ3AKCRNug9jt34YXITA0IeT7Q8CaQ+u4hGBBARAgAGBQJK
+YKvxAAoJEIuttKwFuYn5uLsAn3DnfTyT6GExTjkPjAD/j6K/4RMIAJ9PQOUfVSse
+tdLBUWMHmjZOLPrsBYhGBBARAgAGBQJKZCSqAAoJEDzzkhzG1ETtQBAAoM90QrEl
+POztep/2thle7Sk9sucXAJ9Rb2IKhuUBhD6cskJA549iqCSFXYhGBBIRAgAGBQJO
+SOUaAAoJEEnH49G0aTGM+ecAninRH5sNGY+ZcJ0GOHH/SouXbp1RAKCi/Wr14/pP
+LFqCGzy4MOZSABI0hIkCHAQQAQIABgUCTwRWhAAKCRDdnNU4LfQLN/KyD/40WruE
+bQs8xxUnnGQWOXSt1Q98vQb8ryGCiRbMulID5Xs+NOQozcx4Nao8GSxgcSsuxw+6
+SxXm1v+0M+ntbBGPi4KKJdB43GAPwbT89t3XRUMKCP6pYBYKms3hB8FCDwwiAaTW
+RerkSL8N24HlsdRALDrkCuD88K/URQc2mYNEe7nS1X+iws02zKD1Zp+LkCQI2G95
+bwjqaerk9tGtKatGe7b9z4mpACLn3iwhOWhOaFM1jEobssrXbbJr+J/EQ95PszLZ
+HMuas/kw7RE+2AJRIAU0Tzp1iHkGhNH4MudwOH2wPD0ZM3D0vrRzqvty5aPTscrn
+cfKUwrXn0pj+KPwxOHWfgx+VDTLeun2BYYqkzpE3Aer8DCvH/cc3rVVM+aMhrjGx
+2b8lvGb781MeDMOnfijdAjhW18A+coZzvaQIpwzELUFugjwoGIixZbr9kNEzh3nE
+DkuXsmIpxRMtSVcqS4l9GgCg3vA0toDQzCCY608D5O/5HZ0d+Vl2Uc3bLmnmS/lL
+1p8X4mUQPfsaHghQMsTWQLNqcrqnLUxTK9hRL0auRCN3zELHmBhvfVqutV7Rk4Rm
+bfdEUO0LeTaXVKskaqC0a+zv5W0Iv99srV9BDCjLq2qotdvKodUi5bl4gSeqhalN
+t7gMUegCoeKbsf/oqlSddTCq8nlfn+Mc6n6ZfokCHAQTAQIABgUCT3RmNgAKCRDf
+lC/guqPk+VlID/9lYtwCb0rdp6QZU5UPEuR8J4nlr3pUTruxK60aWuOSifE1vKr5
+ScimmKsTUz6faD5A8g1n0Et8RqBmAii5N6IwwzHJqxiw5O/Gb71VvwlXuH+Vh6TO
+OGaT7bVzUrxmZu73XgXfH+2rbt3HeLMfTS/7PwTV/2sLKHQG1fg0/ejp91a3i9JV
+2FK3V56WYBJmUKumTs1wtQQQqwdY3L/O3LhfnRPAFY2Kn/85VN0Ngnawmi209DN+
+0Q1gQeDUF5MbKjvyShuU9Tg43m5gq8eCiqxpFZToNhUr7W4rJc+YoAkvG+NK1bPV
+MNLMWhXCkFVjPxLCU5kagjD1ePz843amEYHbH06IOsyr3Pwp/SXnFZclVZiIim1/
+KqBDRr77RbhbQmN2HESKvyObDe3MHVSd4eCrbRvTSo16AO0+3w35suyG2uglMK4G
+Tx5BkV35rfFtYCgVB4pDF+KmMpeyAdQ/3cULvumGNlFW4Z1Pqw6ssbKZhrz082Vv
+TqohOKDtAianxJcSdsRHXIJN4kjbM4UivDBpr6Y7G7idrnQsKQgp1JqquO1X/XN1
+eDsaLmJ6k74sbac/SCSY1yiHwZSb9taSovUxrVyR0g83hXuiCcbNdgORjyfezinL
+XCKMMnIyYtNlnQHwhhHreDTX5AsMA1ThvsB5x0bWqp6Pm5Bl1V7Y5ebvt4kCHAQQ
+AQoABgUCWEe6IQAKCRBjf6WERgZUlsTyD/wOtkH3+cS4EMPAlL3BzveBDviUpgUu
+CjcaUSP0P3OfF3+C56Rsz+D81ly65kXZAaS9+3++VAXdTedWycXsd33dc1q+Ai75
+QnfeaiBExRkcL5Z8P+1pRR8C2WlfChqcjRGB+LPDv1yNt05VTfdfQ5DqnVYtDF+R
+PjIV395qFDAnhiDqAywr5DGg9MSHppeHPbDtmJSGH/dPflersfqevQFBkN01hHfS
+4X9rOoD+lYqmLMnbSEnpZHlJaeh7AsmftYM1U4wQvIbSoJ1Cv/K/QFmYqqgiNu0e
+bznIog+S8yjGFZ2lByRzKxOVPu4ujcIW0qNb7fJQwCikkZ3Mvij9J2i2TBYpd5Wy
+5hrB6P/vp+rd0e6rVuYndqzRhNB4NzwZlYGi2bRLwaQSXDTIpdrO2U9of379FOM7
+gUFIQg/LLXD4HFHDJ3K9XEc+F1eYn9fG0S2rbUHNLmydfc99TT/p4+gxUGi+X7WF
+2ydlx1nY3w8s/ET+HDsywl8Wz9f5B1wKyzbD0q006rM6dgZwvlzNKFrTf7IaJfs7
+ofHBfETktSkUk1QXlSOpp8ocJVylcEDSIQsXXstghN9gFsuq0qdtZ6OFI6/fHGBR
+O48PEST3LQq51a/1tt1Z6ZwsoYsASM8krAfTCxknfwxCob0qopmqMtuZQqFgHd/V
+ZAsdO+IDUvXFwYkBHAQRAQIABgUCWXH4+gAKCRAXdF71VJepB3rXB/9K/MINYV5h
+fyeI/ZF25F90lcO/ZvJwrrIdbhPlZdHyA+sfKhDb9RowM1xLAwU/FtMPrZg4pDeh
+onkqg/7KUChq/HlHTN8a7BqI9MK1Bmqw4Lu+XzfnYlp7dh7SZDJG0v87sqBjY4BT
+HuIH0fJ2zj2AvlkDGWVbd1CqIM2CftkdGjLIPyXHPF1j4dEKirqKXFa8y+vFGpzK
+iSyqlgOZc9+Mc1+D+vNl8AVCDBqyWDzru17BH88nwZwsVZZrTbandE+OYllB2J2z
+M2uAKNVDbLjzKH9GVPs2Q4VT0EbHA/aAHq2I8wQzHQM0/knB4b8w6hdX9R+u4wOl
+JAYbqLO31GBOiQEcBBIBAgAGBQJZcgr9AAoJEBd0XvVUl6kHhfoIALyTNGb7maMm
+Joe7t8nAm3kX1/6d3rhVXv6pb/k2Hut0lLRN0M+oMDWExNE9Y8eaEiadaW2yT/sQ
+SR8VsLIqnmIggB/ju5+ydXOjCuDdLh7nVM9Gj4DkJPb/KBna2kCBrqvCK7cPQlJ4
+O+CHhI5Lj1Tm5f7J90lOm3fcKOoPlU/uzvvZsPqh6h1+rrlJBb3wpQ6Qb14+qK+I
+5GCNPNbbJ+QY9eldQ1q8cdEzFS8i8+eyj2X+zxiEAQ/gkAV7JxLLKu+uKfoHq+BR
+kgqPQVweGVXeuNb6Ng8UXtIsbsH/2A7I3dOH+je32uuu5jxaY34TJJvSE/PxUFFr
+2otYxK53CMm0KlN0ZWZhbiBCb2Rld2lnIDxzdGVmYW4uYm9kZXdpZ0BmcmVlbmV0
+LmRlPohgBBMRAgAgAhsDAh4BAheABQJKCR6KBQsJCAcDBBUKCQgFFgIDAQAACgkQ
+ohFa4V9ri3LpKgCfZfhzR05NCnR2T6h+88My01YFshcAoN2tICdI/+Jpcii5OD2d
+wARGdcWCiFwEExECABwFAj5ogVwCGwMECwcDAgMVAgMDFgIBAh4BAheAAAoJEKIR
+WuFfa4tyTygAn14RTq+IDDCEMBBr1G+if1+GrLsyAJ43th/U9a/40lYtTWyBLUH2
+6ZskF4hkBBMRAgAcBQI+aIFcAhsDBAsHAwIDFQIDAxYCAQIeAQIXgAASCRCiEVrh
+X2uLcgdlR1BHAAEBTygAn14RTq+IDDCEMBBr1G+if1+GrLsyAJ43th/U9a/40lYt
+TWyBLUH26ZskF4hGBBARAgAGBQI8PtWPAAoJEIEEZE9RiYUEnZIAnjOkQx1BfxN9
++E7Yiz4MOxqZjSUpAKDQi0Alv/VR61fmR7KHZ11J2g+HSIg/AwUQPnWqOP1viMYh
+0KcbEQJaywCgqeRHrdtYYIUMHlgm19kn6dCrdMAAoPVvMb+QhNCkgexPa8JjXIGa
+VZsFiEYEExECAAYFAj512scACgkQ7tHqOSJh0HOZXACfRTqAC+LhzLqh1668bBFT
+ybxCdvwAoIGjkethM4lKnKqXZv9Wctz+E9toiJkEEwECAAYFAj513w8ACgkQPo+3
+8viDQdmGkgPnUYJfHlDrQ2jYJWuPDve9n4pV9OvyIllKyLdfULjsLWXw4Jm+fMQJ
+gWr2GEov1ZYIyS2+rGDZpbz/vxaBVbgqM8TPdiXzxwU8AFq4k+Em4fKXR58ByLSJ
+jvLLza61spNHJennEUFp3tTpEsr4bNuuaoRYhtiKzTqNuoC+0x+ImQQTAQIABgUC
+PnXfDwAKCRA+j7fy+INB2Q/tA+Y9lc+LubrBGIuh+xOUcJsGtH56FahJKoKYdCM3
+UMZG1qYYTpfxBswi20P40un65PHyP8TSwZR0+daSTLp/C3V/cBh6gCAJc28+h7Cw
+LqZmfcUx0Sjq8lzjcWaGxR+6Y626e8Y0Gdd0zwZIIn5EFL8BIyNGsQIXXb/XjHCD
+LIhGBBARAgAGBQI+d6QaAAoJEBU/oM11pnaS9XsAnjknu5Trn4XN5n017O3kr6hA
+rfPaAJ9FTPmIEB233Vad9mBOx7ejehj39IhGBBARAgAGBQI+d6QaAAoJEBU/oM11
+pnaS+9IAn0kFlXAzOhhu4r5fglMVuw5bTAd0AKCtYRX2ESU/+tsE8vuXWtsMCGeI
+5YhGBBMRAgAGBQI+jc41AAoJEMppOXSBA6N+xYgAn1HbGamcXTDYSFjn3U5ik2vQ
+a8nuAKC/uUM01gsdn+71EiAkmrjlH6H9MIhGBBMRAgAGBQI+jc41AAoJEMppOXSB
+A6N+jAIAoIcAeCIKt2QBPnAthnUk4DhlmM7FAKCA0Iz9ZutXGb2l+p8s7hhF3+Y9
+L4hGBBARAgAGBQI+yi67AAoJENvSRfyzsqEsSccAoKqG39X2y6xoQa56nviF5iCj
+/oTFAJwLKx9GyKEUbSM9f/IQ7AsZPhHT54hGBBARAgAGBQJBkvP5AAoJEOQTYTMM
+qmi0GIQAn1mpdHz/wV++rSU2Qn7R32slfNdpAKDJPqpnmcN4MUmk90yZEeHAdJmr
+hIhGBBARAgAGBQJCuAqrAAoJEIEEZE9RiYUE0MUAn3cWFVW03CDuMuA7TSUqTf/e
+WARWAKC/GjQnPZ0+g7NbDw68ZSY3k8WuuohGBBARAgAGBQJCxTKGAAoJEJvyI0Uv
+4ovP3YUAn1z8L1EnLdIYttWrT1zs0E89Lz4BAJ4sFzcSq2NO3OZsEQfh9F6CrUe3
+UoibBBMBAgAGBQJC3qxxAAoJEDGmPZbsFAuBGDUD93nHzcDWR6AuDxDvaDp1xR8o
+JZHojeZ9sWSRQffiNJKF07vvdjGbygqiWbQmtTM9qBnAxEiBpSpJemBhvGTKivPk
+b9H88KQe2jqowDO3IJorIVMT+eUFB+4pn5c+kFLD/IhG7ohZ2rBIc47L62FFuD19
+esxvMcVelrBFq67ZV4KIRgQTEQIABgUCQt667QAKCRAyyeTONkLLS8GuAKCV8K20
+jEUapVMtOr+eE+dEUwdf1gCgzhnTmhO48XEZZLhHPELMJve+mwCInAQTAQIABgUC
+Qt7H2QAKCRA34/Rf7mXjIY9vBADqrguzlNOJFkWvEkgdVXCCH2TP3OUuPZ9JQtbJ
+fbkg1nn1hCnMITapNJlEE3yyjB7kEpBkmUtyKv3VSwODspfis/ps6zJRIne/2R5x
+qtT38Hf/sYucoMZUceipFAoCLYOqkKJKwTpYM0401dUpuxp1y8Lq5N0SDtTW9fKM
+Ns9jiohGBBARAgAGBQJC30UMAAoJEEHqCaBXk0mPIUgAoOF/OCzco+n/3sGJ57m0
++aqGLOwjAJ9bC86B2hRvkaZlGm/ne3TzCgFGnoicBBMBAgAGBQJC32x5AAoJEJrN
+PMCpn3Xdek0EANLj3wh2FCukydsfSzqgjFDpkVjiBxbTtCep86flaLMrF3H0idck
+GCjMUf/JostBsjwCpL2VlCtvhwl5ZgIzm8luceHupq2iC5hvUN0IjKuIXMLbZP7D
+E+Lfcvw82nKt8JNPpjosXiMhysQZms2XfuNP6f/Ey8J5jaB2Z2JCYWJBiEYEExEC
+AAYFAkLfbHsACgkQUI6uxTAtpWgipACfTBzbyb7Vc0jr2FZDiXJFUSBCoEYAnR+y
+SWmedkcJWESStqRstD8T72mOiEYEExECAAYFAkLfbH0ACgkQ3bpkuiwxLS/5RACg
+m88lpYDxy0bYF9/ubFbvqCw6i9YAnjrQoOLRBtQ4QmIPR+T/9HReOeSciEYEEBEC
+AAYFAkLgNdMACgkQc84u+4QI91WwSgCfaGrzDQlS18mm7dKYxSQVksEWbf4Anjyn
+GaMdeOgEkamiRfDiL0J9vnoGiEYEExECAAYFAkLgyTwACgkQXP03+sx4yJNXxQCf
+foccUBWO51YIEM0mbsqpnKHtawoAn2xTiDgo3TjtbRJskADuw+QnATQLiEYEExEC
+AAYFAkLg7MwACgkQybWm7OLXdN8bPwCfeKtfQWKm8i+KuFJTIoMTvAN65QQAn2A9
+G1wtEN4Vzg6HfnTvtgus32rRiEYEExECAAYFAkLg7UAACgkQW5aAEOBPmonAkwCf
+eF3l1lE2WijQF0BmPMfqvkyA2UcAnRQzuc7PWyP0nydGoJvfEUHByVs7iEYEExEC
+AAYFAkLiYm8ACgkQbZiNF4cxXDEC6gCgqICh/djzt1i6uadJAOztZc/zxl0AnjR1
+OaM2JxR+wqK3loSTEKX1uOpBiEYEExECAAYFAkLjVcAACgkQEy5J1OQe3H7rRwCe
+JWLmLyPzpg3nr65j7AxqGRJeDfUAnRT2Oa85dAM02wgdYlj3FejPuNFziEYEExEC
+AAYFAkLjZNsACgkQdcqio/ObN1DA+gCeOaeMarEJDPbZjaN3y/Pf5PB/Cv0AoMGP
+jPSTGt/iHJ2aArfyd0ME/R52iEYEExECAAYFAkLj7WoACgkQMoZOQZyFIiv6jQCe
+Mior8Tg4msrRc+FfXfj5Uln03d4An3RTaHKU+Sv4SgEecXlW0RYlVa6eiEYEEBEC
+AAYFAkLkbxQACgkQjON2uBzUhh+lnQCfVbPGF5UWlzFbxK+xKmY2DbKXb5wAnjpo
+AxffSRO1PZlQUHgWlS+NaeCziEYEEBECAAYFAkLkkscACgkQBJE0Quobo40fbACg
+o9YCJXu5Hpoc/SVp3rHCYmTuEMYAoIt2q6rPL/JbbkikbRqausEnFstziEYEExEC
+AAYFAkLlELcACgkQUnkvr5l4r4ZC9gCbB5X0rL/DtpGptiNO12DdTQqzsMMAoOWp
+JFg3W7zAr7alVjqlx0t1vS4KiEYEExECAAYFAkLlEaUACgkQa3OhBipiP3LYawCg
+iuQqhVay7FE8e05Za69seQwF4CYAnAxBVNyvXu/1aeAuSi3iC6tywvFoiEYEEBEC
+AAYFAkLlwiAACgkQYRlqLjM+ToRP8wCeOVAIpaG+q9G7uJgVCyDZ0JbjjfIAoJgg
++NrBfhNeOBuu5mS1PSGDztQ+iEYEExECAAYFAkLmmWIACgkQaOuMdvjqKWfdbQCd
+HfDneYM+nWXT/oYOqohamLvk8iQAn1LLJhkLiCMOa9/biF24zKt+MjaHiEYEExEC
+AAYFAkLnYVcACgkQbpR1lMFSQxog0ACgp/m7d/NdNP0w605VyrJWCdogeG8An2E+
+FpFBQgyvJaD6klzDRNNYLc71iEYEEBECAAYFAkLqY/gACgkQsr68QBUpJK8HfwCf
+WgNlYNLBWmn/nejlx0m6NstT2CsAnRdhsusv6RbcKNoVUudxGG4Xm3nGiEYEEBEC
+AAYFAkOHn54ACgkQZjW2wN6IXdNgDgCfUVMGJZV/D1QEdnwrTkRmMb37KR4AnRLD
+WMsKtq4qKXQjYbmuLNdHa1EQiEYEEBECAAYFAkY44sgACgkQFUWz/uIi3k8H/ACg
+mKEdToiBaw1wAMXXKjj+8PTU880AnjTWDVjV2fZnj8iXaOK7MTx01gMRiEYEEBEC
+AAYFAkY456IACgkQY9CtrpESA+QXcACcCFtUvEcmTT5ezAsMsWPbRJAqtwoAnjFd
+qKAoBDkPr85/VI89GhfttMRdiEoEEBECAAoFAkY494cDBQM8AAoJEHPdjBYBUwI1
+PekAnR36SmoXYYegiEUSKxHCjHQnnYnbAJ9zmdCCloaaDIyqh2qr5x2jJscjHYhG
+BBMRAgAGBQJGORq5AAoJEOHh8rCZDtSqiDoAnR8FA/yGXEAd6gP0AoioyMHj6e0K
+AKCAdnxXUB/eSwN98EkeVwSPpiBLG4hGBBMRAgAGBQJGPFBHAAoJEEwEKBgxGj3l
++XYAn2Okz5W6SabKyirUGjF30lr9BP8VAKCBqsPWR50O8vcG0lDLkp1tuW+63YhG
+BBARAgAGBQJGPJMqAAoJEJhw7/PxL2By3XsAoKONmq8YyhYqvpafW9dX7k6r4pg5
+AJ9Sjki0Wqrm1AYXxAYGc8fZIesIf4hGBBMRAgAGBQJGPaCSAAoJEC65RoKIgXQC
+TFkAoIq89nYh6AmxcqwQFeYiloD+FGv0AJ41la0vkis1JUIDM3FNO8xw5VbNZIhG
+BBARAgAGBQJGPdZ4AAoJEPXCYBZM7tdfcxkAnAsMAnhrvQNVPQJs/P5ysQTKHXZ7
+AKCGrxUFi5FQ93oEuWBGqw/xHcMfVIhGBBARAgAGBQJGPfUFAAoJEKBy1NBDWMWE
+Sn4AnjHzaapJEaIYFhc/39hIRm5n0dl9AJ9lAXqmz+YQSqJKQ/cchdKbLdhSGYhG
+BBARAgAGBQJGPgXFAAoJEAKlpgULfmz6xg8An1EFGiCeI1C+7BUDqI5xlPps6WB5
+AJ9cUoE8g1ipE/QtCVYcOUhD53yxY4hGBBMRAgAGBQJGPwYxAAoJEAP2jL3eiISg
+jbsAoLzdvLd5d8mADMZDFLi9ywPLk4pBAKCt23xxWAwNSj5W+uPGLL6R0IEb6IhG
+BBARAgAGBQJGQLZMAAoJEG0LxzpAWBg3YX4An2XrLaazjvwgpUwVEj9KCHAq9FYB
+AJ4khHqEJHjpBjQioqGQfL2Z/NqI9ohGBBARAgAGBQJGTERTAAoJEB8hI8Nr2HKg
+6F0Anjm/ExEyBoePXnjwORS20+/Rx1gdAJ0aVz/9sdWcnDCVQXP/U7ixfAO21ohG
+BBARAgAGBQJGTH0BAAoJEA9FCiZiEL/A7x8Anjgvd31Atoy8y9wjvxowEkfbLZ1K
+AJ973Fhgy5i9/2oSWKGKX/tr/2nrwIhGBBARAgAGBQJGUm9ZAAoJEDLB1u8PFDvB
+EgMAn3Gjh6BSBWjqH83sDmcwG5Pd1nqMAKDLY5za4VhiEa8ECBCkeoRJl/iy44hG
+BBARAgAGBQJGUm9gAAoJEMuuvjmkbEyhglQAoL+JREGW7kkrFkmpQnoPaTNi6ji1
+AKDFOm+kNYqqsYgzw54D89t1QmpOQIhGBBARAgAGBQJGXtWqAAoJEJqG18zRqupg
+x3wAoMcKQRL6tnmUztp7C5X7+i46ScZAAJ948yxdrkvg4qMDezOdydmRxzpaXohG
+BBARAgAGBQJGpUwuAAoJEDm+UaEITJETPdoAoIVf/V5humFKY/Yph+AeSGDod/VT
+AKC2NmslQ2e6Gw8ZEr4Wih52zcxq0YhGBBARAgAGBQJGrcxXAAoJEDPNZzOvXsRS
+8j0AoLVDN8WkRLiuBvr7qWrNhg7Ylb1LAKC1mSGqxofl69FmIiCXOMeZ+A8mN4kB
+HAQQAQIABgUCR8B9mAAKCRAZZYVQwxEGESOgCADhwUA+q0JhWkR/Q1zt5yKrGlQs
+YtpQI64N8xmLPWRKReLgWIMAptJ+twYA+YuH7wCJBsgP7U8oi2x9azlmO4HMnDa2
+gXs4pJbE0pRImhP5JqkYauzepvLBlZGLzZ1zCpLE/JmaxB8tc40lF4/CBbLj5EE2
++jfyPWEplyV/zEwjjDXAkxSzfhdp70EYyguGm4n6M4KgbgkTdxR1/uG+HIkq0yHG
+sCJhViZWW6tKG00XcLOGrm2bzQlv2bXCVlEWC9QTqb/ZdbA+ONLSWdmegEVVnQeU
+x3jtvRg67yJ5LXA2CSq2lHAGoEEfZc4ziRHmn+5Pusk33Jq/rPV8QSCZXlMbiEYE
+EBECAAYFAknKh9kACgkQyceSTlEEfWbGtwCePr57kk5WrDbIcRgYgvl37P2JRF8A
+oJHpjz2MwXPO/asQ9sCsLE54aa6uiEYEEBECAAYFAkpgq/EACgkQi620rAW5ifk4
+8gCdHdnY/BsekZsnMZ6/koe2cFo0lCMAn3me/4UgZo0+bwc7hEIAOSJy3/gUiEYE
+EBECAAYFAkpkJKoACgkQPPOSHMbURO1KBACeMvU6BjYrBP+qPWLq4uypobqUAIIA
+ni5YbvPOcL/YBcgZFNMGykoir0nPiEYEEhECAAYFAk5I5RoACgkQScfj0bRpMYwv
+igCfQ4pfWihxYQNGkPyQP3z3qLO/wqcAnA/tKBHggMa0Gbr2oR+BcEUQjvhbiQIc
+BBABAgAGBQJPBFaEAAoJEN2c1Tgt9As3HNoP/RkNKJsN+uUcpR+WAL8PknLypWYl
+41/VPuEpLoIv0a3Euy44x7iygwM205VVE7pNrqXphrztrCpeAA+kSvYFQb21zu6b
+xceN6AC0wlENtf3R+6ApS3CsZAyFiuBZhWPRWo41GMY0A6Qdpo69H9s3QwlYmm1y
+7bXTrHY74gOI0yfNyAFdkwqTFve+tioPmzDWFO+z+een1iwTyeVpJZQhrcFcAcTd
+5RqGvPM3/lj+tQh+COt5hG+TBp94yVg+Mv0qioW6xECS+fvCYv1nxayqaa5wZqDm
++17HMJghvWVhtFCxoTqedSgoVegPWLXjXTj01oQ/WEYKexj2lfRYAIbzY66FpAMJ
+oOxnv6lsWNJoI9ykj5hPdRwHZ464Pp3EzmQzJwzQ6o/D/dSKwQnXdcOyuzI21tzr
+aEbn5XG3a4o8WyMbpnVsyV7UXPtbWDBEZE2SOizT1KLJAJ+Myy1UuLjGyZHTNz0u
+2wG5dJWBuKIIeex2itL6Zl4uw8cjzj8Bg3NeP7GDb/F8ZP5UWggNzyPHjUKaXXOB
+71CoSp+32fXmnqR7T/OYjs4uwx84L6USgN28R2lEne4nup2tnEFUE3po2zsBUhpK
+uLTHkRh3OcSZ+y0MvdS5+1VNuH8Dfif8xrpyJLXpYcYogigRXUO9mXPAi61bfCip
++M7E+GiYyvRoNQy7iQIcBBMBAgAGBQJPdGY2AAoJEN+UL+C6o+T5TigQAJz9aM5O
+VJ7u8SQ7+piydPvNqmsxkHmEzG0JqE5xMg0T/Cq3qTSnPxsVQv2nHTDY6re8mvFP
+6QenFu4/hcmaGZF77SEQvOoiUJ9regXfQX5I/FF752UEQIPJV0EkbP9mIYFCYF3N
+s9GTHmX/HLe3Tj6AOM8jwFRyC9zIYRNRf4TpVAl4FLJgpCPgWuUPc28fCRUwURUT
+3CdDA2/lCc3bjafEy0oMHEJaxx6iPFtmKKT7ZsPzSeD+cbYJIC/HwmnggTMymJ9W
+V9LGWI6Z0K29TZkjLyJazjvxowWBBVruRGtbTG7sUjj11THfn+UPHI+BB4r+kA4h
+PzCesim9/S84w2gb5sjZgg/KErQ0/pvF1ifzDtl5wiSKr4+IrDwAtvC2f/bxc7Em
+1zzJzHt1q7Kc1bWNNv3LsWKUxvXxax8PnOPBJ6EPCfGLHtBGdN3fHX0GD8MyDApf
+C7D4VSpBaCuyipGBsiPjO4epNHDSCySSpu0ePJhBslpEg3zrVmZ38yU77ySAA8CY
+S6gn28mAHIDNe6a0IeUeBcKEK8/68hSgdyjpBwbyQRXFzgVkJcaGZBIUESxUnV2U
+o6LJdn4HU5kRIytHEo/8W6Ra+4Uk6OzL7MVvyxFNjrIr6y3XFgBnPuQ1+9CEuXym
+L9JMsQIVXjlDth9Il9np7tuY8rN8BD66cflWiQIcBBABCgAGBQJYR7ohAAoJEGN/
+pYRGBlSW+eMP/2dILgqllMW3Ra7krLI/B9/Y/5DmILETkpl4ONmHISQ6LnVtlOgR
+pubvEAhiPyOJJGmn695YgUzyxwIOGI4MWlqOpySZJLB38gXkfD2breUBUhMJ0plb
+2ngdbuLAedOMaAiYwDLkEEM+lqygyQ4bVKojfsOKkMnEUUYTAu+gPswRYTDfTAm+
+IFfnHZcLXUQbEvNsE76F4Bc/bzgunmGCKuQRY88dQ8Q5VWt+kuRyhsOfVZRobSbx
+R5C7UZObPf4UmbFESo3e9SVzCo7WJfjbtmNCzfPIexx1QDev8Pl9tULLwLUPugLA
+2BwdOcRagMKBsmmaNlF5vVtURKJRga6NHymplFV9/UmFBac6aaJweQlLj8ZG0TTJ
+6GRHfHTFl/r6mqrQEhWZNmigoACBpWk6PZcOCMN3GnccnnSWtrITFODdgDPMS5lB
+m3pN83+7lf/KUS1BOJSC/jV1me7VIW+U4nBRL4sp3j9Ze1D1uVHqxUOdC+NcAM3s
+4r3ro8hahjgEfriYXfJSlBJvEm7dVfiMYEynjCgCg7/X6QTa/IW7JV3UNL+srOn1
+SMnRwuN0A3mvkZ82QPfyLrfaOmkVyj7iAgCMZTQ2E5x6Oo+npG71331j0DOX5JIZ
+hKwZ0BnBOwUYRnB8QJtmg2RqPE1AhAcXBY5RaBgVl+xn8aFCg0REw/bwiQEcBBEB
+AgAGBQJZcfj6AAoJEBd0XvVUl6kHoPIIALQHKd71aAZ0u1uRb0iMNn52h9x4R0ue
++upd6pcGK6jlifoimxp1hP7Xr0PHW79MI2V91MIYyc8uxbZPanZZ3tJB6JZ6CNJT
+FHFxUxZ2Kno8FzgrONGcKZnMhUoDl36OyNAHcHrqVIZfAImACD7cP8JO/KoFMWOu
+bfhAOrHJuSN/Ra7ge3lXalfn++8IldZvn11bKNoH1QxMw920KCbc8qYQmkQ4KPpc
+xIA/aNXxnT24SAlV0sytAWqxsgOZkaVdWKQPZY/tTos3AH/klkNPWESHEVOxGEhh
+N+hHT2g6GLB9lRja7Etr//bhEmfkLjWYfFtrDOazB8qmeIqzeDeqjxeJARwEEgEC
+AAYFAllyCv0ACgkQF3Re9VSXqQc17wgAxDpkqwr7KK972n4KnBc7zGFzi73mXcIj
+1mg/K80ytG5IJ1M0bBY2zHewVlg2o6A+N2z7fDWb2Yl0yZm6PcESutZa8Trt4B4R
+WIsWdFolfwWCc7LyOfNjsAU4SPYMc+UVdCS+Tkq3oEGSBGdoQmhpyRURiAbCXOq0
+rU+GbXKRn1QwCEg35QiZcFT8Ma8izS72fTaGrqJghhPeuDOl5yHLvsB8tV1EFdMi
+ItIy0Wzkodcx/eIdM2QESgBjF5YcWt1971V60XQ/xT8bl0Ieu+FZWqjg1bQCDOWR
+jkBGZ0PmyKpfZRM3alRljpuNtxPDIbwMbpg91PtLaEw2DlqzCy2MPrkBDQQ7EiJU
+EAQAzVKWS8QrkysydbTJu2/14wIbz2Coi93aAGelwCwXSxf50JpYdY3Lkcvd0FqT
+8bcEnz43MCSx8vlKubQtUpx9WMGIb4ixtShLJ4lAa6FJldhychz/dnxSNyz5N8W6
+sby4dTVxac0rloxjAOurGanhG7TMtgfDi0cEEoXRyAVoKyMAAwUD/j1pJm4Npq2m
+lJoE7MK3vAhgKwYHFflmJusmqvSAtRuFdT15pbMJrA5bAK+lA3SVOOhhWTCItlph
+SR2qxJCAcBTeOMqUi5ohFcCkSRNvwmDtH+80B3BehlEsEKNk8Z3moa2ch7Oxnb6X
+EXH5tGJ5Qvx9Qid6ZfBaXx7bc8yKyCb4iEYEGBECAAYFAjsSIlQACgkQohFa4V9r
+i3INMgCgnc22kj8TfjktU6u4SUUqud25ZZcAn0B2b0zPjKjGuiwdKSnkFbNcFS3g
+iE4EGBECAAYFAjsSIlQAEgkQohFa4V9ri3IHZUdQRwABAQ0yAKCdzbaSPxN+OS1T
+q7hJRSq53blllwCfQHZvTM+MqMa6LB0pKeQVs1wVLeA=
+=Lxw8
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A41F13C999945293
+uid    Thomas Neidhart <thomas.neidhart@gmail.com>
+uid    Thomas Neidhart (CODE SIGNING KEY) <tn@apache.org>
+
+sub    8183E80D264EE073
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+25lhPkZ/FaSYF1lb13TNIRT1q1My
+=pAbP
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    22E44AC0622B91C3
+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/85ukFABEBAAG5AQ0EWmo33gEIAMB9fJ0T
+VVhqKzqj/gmlVDCT0kvevaGSDB83rwHatG/D2h9dmipoEIWBvD42/PXkYuY42iIO
+8/itvVOxpPZOL+FNRvei/ZbVEno4VGaJKQ646NkeVWyVgXZ8+VkRdZ0n09a+goz/
+e1pogJfL8BVKbU0F6trWXYywnV4+vp2kwwMGNRTXmvNabdY6rAE0TfjCGE6O9T28
+OXy7iHXFX3oTkHjtltUHWlHrLe9JhCDCPoFiSndTPYyDcZD+cEWg27BX8XsuJRvl
+brzA57xD3w25ESHWJyj84z6K52M/Ys7S/PawZ7pflRkbAJ9smeWr9+qg+GLJboc9
+vX4kdTTyQp5jkEkAEQEAAYkBNgQYAQgAIBYhBMcLhE8ALyH20rnIdSLkSsBiK5HD
+BQJaajfeAhsMAAoJECLkSsBiK5HD5coH/ROhc7Z1pjr9mWR8rr07yNEHNuGf3T/Z
+148z+ovLkV7dRobayB64VhtMwZtE+8Kmf0Tltx5zN2GQkqoSPl08dWFRTr6N7If8
+N0OCtw/XZJBHa8eD2FF7SnNWi6IwNfhCdRtbT0LCmaHKaUineldvmM1riI3GNggG
+a4cMSYw/65blR757aWAgAVZEWi9n0LUMKDRhjIaS1zjtxqSrcQ0o1TYsW9FxuCjJ
++MzQSmtJQKiVRQ03fLJQ1z4j5u8YvmzCEqp2dEdqBuDuR6Wyf/TmgMUY9AeLT9U6
+VZTvAGH69TDqVvdmLsKhtQidSFbes+7ku5tM61P6ggfv5FJQgQk7WEQ=
+=k4Pb
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    CE8B1D1D2530EDC5
+uid    Eclipse Implementation of JAXB Project <jaxb-impl-dev@eclipse.org>
+
+sub    7ECBD740FF06AEB5
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFuX5CkBEADkTgn4nzuq0lWR+7kFGYLKvmPLjes4j2nmygIafUjVbNmD70gY
+DPpbSP02HxgicM6xSSqzZuBVxpbcffqjMPXf8LkVX4iWKZtyzLpf34yaojigU3qF
+pFClcREya4zRl2BsOq4NFZ+vwWCbLqg02yh780y6tWptXccrJMRln4oViG4TofEw
+leCqVUpcaz1P0CWDismy1djpbnmcNi9QD6qspFyWgmu8B9zaswidDFbkdxp+BjdP
+ft82Sdc8XY0bbh3qJfl6pL1Cmojfb1SWe3TFkvTfHg/KUSWJT/u041Y26gBh74F1
+DGOHWliqHaC1Knx8Fvom6i+M8im7MTJvF1X/kBHExvwltmerIKf8+Lt2YAkJz2TS
+IgXxbKv2mkNkCa0vyS8gtYhB0u0Ds+FJsxcJIj9ztTmB/KVpgsecrDp48XRiWGVG
+y2jYAp7s2y5Y6olKb0m9Zo8plSgrUplvpiVFWoSrtoCyXwPq1puNJMlqW0MqHG4i
+OkJ3/fhs8MPaGmRjptnq6s1mS0bZbkJvoclbR2+Hgg34gejePxuuM6TixFuvDerR
+Lp9Z/mA031rpzcYuXII9O//sfiDBBcDDrYlZXTxTohO0mTlpA+SqGOtE7d7BAPxl
+FHsqG1/EUADJB6ZDBgHtru8vTOQXu8aLQc4FTLZao7pKWb/QcxQzKhNnbwARAQAB
+tEJFY2xpcHNlIEltcGxlbWVudGF0aW9uIG9mIEpBWEIgUHJvamVjdCA8amF4Yi1p
+bXBsLWRldkBlY2xpcHNlLm9yZz6JAj0EEwEIACcFAluX5CkCGy8FCQlmAYAFCwkI
+BwMFFQoJCAsFFgIDAQACHgECF4AACgkQzosdHSUw7cXz1Q/8CNhsJSwGzbAC37zb
+8xZFJueMt6yO+0fQwy2Wkwc2OEGDH9ozrwfqsEHINFY8ianEgq4zftONB2wEhVd0
+kZsuMx7zG9+9/5jjMrv6AHv2oIbIZYIO2NcjNYEvyr6vkMRAwZrdbc6ueJAyMuOn
+56n4461toosb1FpV9vORDL2fNgEpOqWcj4wd0FzZhuPKOta92ryhALS2XK9IqNdl
+BKI2zlIQ1F0BPDsm7iuAwaMOLiVtW5PrsD+vXttyxJjw7RPsQ1NjJI8XvKUYlzPR
+tkBL+a04kmsbfdUglhfL10klM9fHWwEH/73vlHfpDWO9Y7FdFoXLPQAW05rZgIQL
+5VwiB79PTc1XJEi5rfJHvJK6SFezJrgsk5pi2YxAMk0tqPSwBGn9EgbsIZgr/74/
+fH34TYvCBq8NLW0yzAP0SiUPvuzqJjDCDRgiri6rAas0TTj6bCFsSiV8pIDELvv4
+8pwdD7rIs18RDiZ7aT6q1JYNRZkwX+trFoQQy7NJHJ1vs8g8MckHr3JogH4qZIJx
+iVe2f4sl7SGaCRZn4Tof6A+SsOcnxcjipVbl5C9tQkxKhiMCdI10sHZ/VGimCzAI
+6Us/SUo4RdqGNK4OL5TygJ/y65pN4Cpy5ini/i2PVW5tcq9mNAoQbTaY7q7P+633
+K9Zg9s0kLxWi+iSCyyIoHLS8qQ2JAhwEEAEIAAYFAluX5GMACgkQn6K3KZ9R5UMZ
+5A/9EddOF+9AUPR+CiDC1u+yf7ytGA/BF05O4SzgNuPW2KwWKQTqrHjpr9q8zjey
+8hX7KXT5kEKqidiD6g9BnbEPSPLEnFy/C4jAm6RJp32cUTMOMY62kG9cpylcg4WZ
+fntfrUYb82EOTDGTd6rI4RKooZXFo6MnvmVlwRJwIzR+mqWlerJuUh0oudD6AgSK
+qecDbS9O6F08qblsN5p5hm+TCWl2gFFysQNxpZnwKcL83RpC+m9NaQQHh8jNisvG
+mkLrDexI0IJ9ia4eTnaZdVPUXgBj56ydIUmp2yckwxFvLb7cM112zgBiW8JKy/CD
+UeC8dNz5Yc4LX66U2rGK+Uuu59zXbYWu3P0pPI+1z/nnNeBL3p7thF81+lKyylEY
+6o2xFaoXofcEmmpfmZJeT7Dfqub7Dr1z7WI9AGEwNxx/L2dF9X5R6jxoqz0VBBX1
+Use2ns7dYzwNutzOuVe54lGFZ5bbtATXNOtlQPi6HS109bS05O5/ku/ovkTwk3TG
+5/ikMUxa6NtPrkxaYBlIjXRcSDsfy5uDKRzSyW76n1ajws/Cn3cV6gJ0BirVUKTw
+0pMi4RsRaJ77VWI7+Uc5NQ4C/8nwIhR6hjVo8HenWiiAkEwu5OQmZfO1Fv+7eDUJ
+uk32iKoINXzMIXW1m8E0t+OGk+SAt2sZ0kYm73ucsSdtCJu5Ag0EW5fkNwEQALZ2
+VFUo2ccT1G/Bl/S2AK+FngBIN09fOXeq3sHQCdgFVmKtufj4pf/dXtgM5CQUwGqi
+3TGEVrokAMTQk9Lw3GLR/M4EIcKPPwyyuo42rNVKC/cuR3Rq3xtnMYBybEldmgyE
+8VxHKsR1zHJLax7FUeXuDPOVwriix6bfzOdOH7BNqPYPpI/dDbGECW1Bp0wDSHZd
+P5GOZuaHN6bV1DhgQTu4wmhdjWtRZdKm7gyoqcXbyXrqYK/Lq9NS4c6c8Eh6jNJR
+HzkjcUXgw6bZ0Lcb69sR3duWZrF2Xdnsr0ON4W8/QToqjPIVKekUY/p35qWrNPxy
+IoXHTmAehLqfa8UldeL4eB0AxuqN8fakix0H3xRxWaWXEE7uz8bAGCxGVR9U/iT2
+Eb5FszdmXWSn5HH0HgyglCOHBZGWyV9yO3Qt8eubBkMFvK3Gke//SfVYMxGx2UkR
+kh8PIA3h/HJAB3kX4nOMkCC1c7UBVFF9uraJ2ZukVomn+nsTXJmZdS0UQhXtWD1D
+0n2w/eQfpFL1pPBWE80Uz1zxzRNV1bNYURK0EngmuMQprHNpm+upHsfeC+d5+35q
+yYFWTQocctHCsT9yqOI0yGbxTs6xkIoAy8bXLXoh6vzHJrtbXMXp9mb60ZAFOslr
+mlQwGxFd1qQQgWWcXqfxTfZTevrhBxOrzDREpZWhABEBAAGJBEQEGAEIAA8FAluX
+5DcCGwIFCQlmAYACKQkQzosdHSUw7cXBXSAEGQEIAAYFAluX5DcACgkQfsvXQP8G
+rrXoCg//ZM+boRPjheRLXcFCoGpXvh+uBqTnEWbIR0eJeZ5YYt/61H5QdLSzlriG
+uyYebN/yrKC496dwYj5V2AnzhSGoXxXJzqUBN+y813LuxUz8lIpq7k3SkRjlDZpe
+vCpnNOgTgvqrZxr3mOQ/AlA5nKR5HCZG9Pvvxrk5ZQRiaxch/PJDbD0x/73W1W/M
+6eEnrn3DffroNEJBn84DtLhttnUW4fYvQqYf0hdTaLpqvCjhVtaPiT0S+GsemOcC
+3fLfhu4hAJcsFKQIJHCpkSBT5shVmfCsAFNb9UiQ5Hx0tHItJlND5Nvfz/kr35wl
+59uPx76NnHVE4wz7Bw26+8pz+F9z5wNM32KysmP9za01p3oyb3ENOrv7tILRZgtl
+J4X27EGB9Xb3yMw8NSWEo13FDxvyyu/lQWvAZoaenXgB0Ga37ZHnhmyriQimxY8f
+SCyqOEKaP1kBwqzAIvRlb5H1euIzt8PYJNb9WMr+UzUJSZe+TrZzSsRwLrru5Hrc
+0DVOoV+iM/x4/zDOAR6rNfr69/oQq7G0RBSOlhuDGPPpQow34UYBslp+SghNi/Us
+Jf10dW4btrhbEtZyMTUsbiGFrKEFvYk4yhzNmI91+bn3hLBG3ErUUM74EtFUZEJM
+m17suPxfxs4WOKmSfPZ+PwQkPI594SzfikmOad478jEQ25NH0NgzLw/+J3QdSzww
+LnISHfbx482F+bo+p92+0q4V0ew3bo/98e28dwZ7SgVEAEz6eHX5J1i1WWgcAtvh
+a9CaIThtLgIKvWZ6kR3DCGI4/06MbFYxhUkTGl/LcdwDZRkALFsZ8JwhLOAPTRTV
+k390z0DdLvV5DThrVb36S8O11ypRcQG1p+RI9YilnzfsQwgxpjOAtM4jrjom9Njs
+KtMXMrChTFM45UXiM1knmsLqNmMr6u4G5y+JTkiHl3du29CYjTNrnJIgt95Kvfam
+czPzqHJKA8KSGt9VUKeZD3xLrjsaGveBKpc4Gh79rRqiZ2c+7P8RLR/bojfB+0Rp
+yjL4Et9Y767ETHVr7auqFeJw0BBgGGJKwWERNDnpi2hMGadnYwUb+AcSH2fso1hR
+xxBkV7Vay5b/OnwC1Ypi7QC21KREFpH5hnh3FACRzaqz3SdB4w2HT1nmyDEI7g6W
+B1LXuLl1B5ijaHdgqzmSl0cMxVBrjTtCcEgwKZTPhgz2isanOfR3nDHz70tMnHbV
++NGqblykBEiyWIb+fpjODqGkp6zIiYsdyaXDiDK39FgS9MyZEciAHPU7oUZ59M1F
+YT4FK/oah+WRFlKUvDDiAHqIbW6dobn8gaOSYfr0Men9ei59bUCQFUSTqyLIvw9d
+/GaP16/cf3GJBUvInoel0dMtWMeMWSA04t0=
+=F+y6
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A6ADFC93EF34893E
+uid    Tom Denley (scarytom) <t.denley@cantab.net>
+
+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    0DA8A5EC02D11EAD
+uid    Paul Holser <pholser@alumni.rice.edu>
+
+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
+30rIaXBrb5wHR4GQ4FYsBGRuWkmIaferusllUmHCHFJI4ldvgbQlUGF1bCBIb2xz
+ZXIgPHBob2xzZXJAYWx1bW5pLnJpY2UuZWR1PohgBBMRAgAgBQJNyzHzAhsDBgsJ
+CAcDAgQVAggDBBYCAwECHgECF4AACgkQDail7ALRHq3DJACdGesiXWFVnEWCRLR8
+9xBCGaFsQLoAoKHC5Xa02yuYClszNb+YiWKWfIyRuQINBE3LMfMQCADWsPvQO8Jz
+L3VKFAo/aydnhwsmcXAoCu6UNRzGgFnQAbSoxtoTyOKIlMcjCBWuqwppLUkQ2/q1
+V1RLzEezC7fTO93ShtqP7ggZeUxV1zrTnZjhIsAY1sZXD30CHU6RDui/3aCZgBh+
+qmk61G3W3KXPsl/4Xp6vS6Z1UFmbx8n5CPNPDfoDARGPZuNVtzqiAzs6xPKu7mhk
+Y4n6glT4z3+aH8arcDKtx9TxzpsvalpxfDKUwTiXHLh8EHsGwyiA9deKmVnZdEft
+GaVmIB8se/dK3FUHVGstdVyN2eog7aC5VisrqbEf1Ywbguc4a9ydhN8a1Z7ESY0D
+mXwg5KCwr4ifAAMFCADTftyUMWLddZpkFVey3sh+RTpsqr2+GamFLh+4HHjCnswE
+DraTSQYOZlZxuKdlafJvKmKWL2KFhIeWncRjMI1NtQxaVuFz999ge6+tmwhPYPEw
+9vaIKeM+7kcwZ6BMzyJNOi1bjFiYlSwQMi+BBTPT9Q2w8dNfldTT1Khwvdg4/kzF
+wRuA7QWmOfLdfvqtz4RMB31OYMmLsc6bbiCsp05BcdAmvrmPudNz0zfNadPE4/d8
+v2NxWcZOcsZFWhHuR50OlrkWygWq1jxgxoW809W8jj6b6OjOM3BODZ0YbqdTZ0QL
+SqAMR4oxInAXXCA7cV7qZce/Gtq2A2up91j+u0QZiEkEGBECAAkFAk3LMfMCGwwA
+CgkQDail7ALRHq00qACeKCQcMI27s7CbzHTUT35ovvcmYNcAoKPtE6Hta7WJlBuN
+4l/KkzoJD593
+=PI9b
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BCF4173966770193
+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/SYZiyoyqZCuBcwHABEBAAG5AQ0EUqd5cgEIAL3PEOzt
+IFUibB6FYEkObVhsDbCnHw9yO5MAvAWB60Ohf1J4T9QK63jZ5/CiqcDrw+uab9I+
+Ruz/SgGyFS0UXAkwfTICUdhT5kUzZmGyoj2ul+iFDP9uUdEgSgyXXakrxBbBPzNa
+Mx8+GyIXRVFyRTH7+1gWgPQsdN1sGYOgZ+f8TMzAv6sxu0JVzjKXAAbXdiZTyJh9
+d6h1jS5Icilu8vRwn3Qc/ZzstBRk+eLbb69wS9YGoUlzYvDBz+5tiNwvHUriKc6z
+VT4Edngcr0mKWTdvD+AsvZffU0XK+vxbgMuRWi/51qb+VgK2gFeAseV6a+D1059u
+2+5Pn3h/Fv/vRAEAEQEAAYkBJQQYAQIADwUCUqd5cgIbDAUJEswDAAAKCRC89Bc5
+ZncBk0qgCACdP8kyUZVqfncA2RsQH38NFYhBz5MAEOIhCm7qwPC6XG08CUZfpPXd
+UbxZGUliE6vhfj7rZbvUKKHlcHDPobdTJqGof2jt2MfsjJ18JY0exSWuVTmNmqAC
+3gsiMfEGIqjQFWonfm0Od4AvduLuc0TPkyfr0gobakgYvhDjk7eQvgC1QfKlk6hH
+A/OAFW774qaQsyrANrFevRa7CBQEob6V6N8aV1vNxgl8a6fJzPTNBOOmP0mq7xk6
+nykQuqYTVFyqfXN0p1bbTxHBoW/fvdizi7zMSsuBkWUtfG1wyN70uoEQzSQwqgWC
+IaddzrPZPmaZ8CtzzyB7+JdSNItBB2Sp
+=wK3Q
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5796E91EE6619C69
+uid    Eclipse EE4J Project <ee4j-dev@eclipse.org>
+
+sub    153E7A3C2B4E5118
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+YoHw
+=1Yfs
+-----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    0374CF2E8DD1BDFD
+uid    Sonatype, Inc. (Sonatype release key) <dev@sonatype.com>
+
+sub    F2E4DE8FA750E060
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEmoKU8RBADEN0Q6AuEWEeddjARAzNXcjEx1WfTbLxW5abiiy7zLEht63mhF
+kBlbyxEIRnHCSrPLUqY5ROWdyey8MJw+bsQn005RZmSvq2rniXz3MpcyAcYPVPWx
+zgoqKUiu+pn3R7eldoDpMcQRsdNbK4TOFWNUomII70Lkj4u/DP9eko6xowCgvK/R
+oRhshwRoxJl1LauUFuTeVHUD/i5DryK5j/P9tv9BWSb/2Jji6gbg6Q3MThZ+jCTi
+leOHR6PSqajYphOFaA8xVWQAkvbqfSps9HnmdFJ37zxOn2ps9d1L8NLoX1GMu7dv
+UZkCY5hR4gwaAk5YpyKa93NpaS5nX6beKiCes7lDy7DezjQLZVbKI3Vsd5t70eTW
+tD7JA/4lGUSkole28jxo4ZKKkGMFnAXkV5mWeOTz14BibW7JqhkiIpckDfyq4NjK
+ts1EzMmnXmPkB/u5QHHe6fJP+Laoe//gP3Y5+xlnAsyI4iEfEjydJWiSNx48c/2l
+qCQ/wdOb28xoFavdCCBavqSKXKJREHXul1UGMICpu3rq9EOk47Q4U29uYXR5cGUs
+IEluYy4gKFNvbmF0eXBlIHJlbGVhc2Uga2V5KSA8ZGV2QHNvbmF0eXBlLmNvbT6I
+YAQTEQIAIAUCSagpTwIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEAN0zy6N
+0b39dtIAnibkyo2aMppDYMxMs0uQvs8Twb+XAJ43OOyntZVCmB9nD2mlCamzXwqg
+5IhGBBARAgAGBQJJqFtYAAoJEDDm+AQ0pyp/VrwAniL38WwXOBSLRSgp2Ytqs7Sq
+MgWpAJ9iLiUTWoqDmBhw0N7NXgARTM67nohGBBARAgAGBQJJrdziAAoJEJsf2p88
+BiIxMpgAoN6x/nM+QKDJyH4zgVAJ6DdvKkzYAJ0QvklYyclsvFgeN5J1QjFyFMJ3
+l4hGBBARAgAGBQJJrd0vAAoJEGEoqs75eNhPncgAnAzDok7Av5IBxgcHWKynG5mj
+J3ZyAKC/EcWsrnQJQdMzOz1uLzF4A4Dx47kCDQRJqClPEAgA0QeHyW6OIAnKi2f9
+oxjnsGli1YfeJrnEAD0KxhwzAfO9eB4rk5gCj2DJ2IQ2vQhnFrjcCdnhagn3oAct
+fc61cmGvyN298QeusekfuweASCuW/dVjDYdlJT1yZ+/7K+ILsFKtCprot87BJpaL
+ODlk6sIbsnYUAqEKdF3Brxk6zY/T8+7pqwHgbTeadVpHrZlKGe0XHiJJaU7vxxop
+RBsHk6AryhgDWT1gDgRF5LBkyUpal8Y6qDAcbD7G5GRdQ5vOWFpNa99eA+vlGzFn
+Mi+IofgRdJ92IinZDOpmMz92uZ8jH2voCLb5zlYo4jK3RZpfQdY4ayHW31sE+zYW
+us7UfwADBQf9HFVVZi47bQfyhHVunnOSOh/CBaTu3o1Jdm7uZkxnCppGDHuBcHz0
+OriMAvDjFewBZ5uBhp1F5Z5/VlJSXHwvPUwo6KQICV3XyW+p/+V++seL5kcic3Op
+hwB1qZPYEqhceEghHmN/r/wWV/8WxkZ7Sw1AnDwqXTJiIZhaEjRVXUIjN5WpINIs
+sz+DjFnTu76S3v9VSOjTmUU7qPII3Eg7dJEgE0wv3E1d9lIPPbUa0pba9735uMLq
+oQNrT87kXKSjKhQUD0u5bu3TmLdPboHzUBWYH/00zEodwkjWK1TxZ7sv4gC8oLXT
+pyHDhLGFdjFr8bp/FM2WQ9Ip1w8ax0UAtohJBBgRAgAJBQJJqClPAhsMAAoJEAN0
+zy6N0b39q5AAoIK0VSayWKgg9KNmRZUsmmjvsiq5AJ9yBhsAewK4wWQeRnWhlAD9
+/+S7pA==
+=SKKY
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0729A0AFF8999A87
+uid    Kotlin Release <kt-a@jetbrains.com>
+
+sub    3FF44D37464BBB7E
+sub    6A0975F8B1127B83
+sub    6005789E24E5AD1E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=cFun
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    083891AD4774845A
+uid    Eclipse Project for JAXB <jaxb-dev@eclipse.org>
+
+sub    8118B3BCDB1A5000
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+XCfM
+=930f
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6449005F96BC97A3
+uid    Michel Kraemer <michel@undercouch.de>
+
+sub    D3DBC823BE4819ED
+sub    0162FE0CF6E18BD4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+5JruNwkxqQ==
+=lyIT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1669C4BB543E0445
+uid    Emily Johnston <epmjohnston@google.com>
+
+sub    5F6BA89D4B0869B9
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=wp39
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    80C08B1C29100955
+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+7kCDQRNnwlgEAgA
+t5Th2AUoSfxvcTUtRPbmy+9RRfaS5UtDlPOiQLrONZCs96E6WxjH57LxFI3/oDms
+Eu2fXPvmuisXf683mQs8DPzHZOHoLF3qW+fcNAd+8MvRgeWnQBnOEfHmiDInF1qr
+DM3LQlbFq9oUY3pvxtutHU1/TySr93l01740ZV0Fdy6pSjqO3Vb62Rue2SVLl74H
+39D/gvx1iSXzFdEgwC4rDqHyPgsVex7rGd1Z5a1MiR9kibPR/twtBXlftBK/3SLU
+p/NP2EuJSOnCo/J21M24Hr6B1rriMU2FVy+Bb6HswfoVP/NKyzYmHZ4NHgcWu/sQ
+lJLx0oK8+jHLwSXylAwb/wADBQgAher6vLDji+gf8h1u9NC0ri3n+Wn86P1vtCsx
+He7+JDEzgrd2rutRsDyGN0wzeB8y7XcHinMa2lx/blvg0ghCSERL34JQNANgcX6D
+CSvARqxxt19hmIsAe1wyNbU6D4iFNjzAO4lPgjWmq6ZLNZXxTFUly2o1RNjZ5TvX
+nygPn6mt0Jx5AtvPGgoW27TnqRnb7jq/psCXyD/DxahU5FS4eu668qiExU8fA1DC
+zsocIXL1gKvjIhB+oLyDyghOqWBRlxlpfHor42d3ADosChckvR51pk5kG4WrkfsW
+SvDTv44hAWotMZwWlHXYDMOH2Wa3IlDydV9voiMA5LAE+URlZIhJBBgRAgAJBQJN
+nwlgAhsMAAoJEIDAixwpEAlV3nwAnRgDzG/RTk52by7bUG/LGMZLe0FkAKCAXo/o
+qOFQ+kgBhNLq/dO3OGQl2g==
+=Zffy
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5F69AD087600B22C
+uid    Eric Bruneton <ebruneton@free.fr>
+
+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    C92C5FEC70161C62
+uid    Herve Boutemy <hboutemy@apache.org>
+
+sub    64863FF4D1BF1809
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GWfv
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    9C4F7E9D98B1CC53
+uid    Benson Margulies <bimargulies@apache.org>
+
+sub    32E3DF6FC5E91334
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+4Q==
+=gGyT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    59A252FB1199D873
+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/2HKtITJYC65a1jKt3ABEBAAG5AQ0EVQEbtAEIANsILuU9
+cH/EIEL+OpwIacr/y3/6LG+ok8SKDHIlF6cSpusSsWM6L+RGcZgvCDR0S0EEid44
+yy8wFMvoYSlsXHLN4SqH/rpLIc4CD8DdCLWraKaRZrhtqzNWSsYxEgqo7n1xO6+c
+sU17VJArnpkGPHoA7ooZlaGrc0y/rlkTXH++LKqh8niO9Dap46pLFrdgvuyKbq1B
+6faAf2JMRyvqy2+fuwfVGTc7DEUUFtwGg7FniDF0zl+3rFG1ud9kH8UWz+GwCwFT
+6qhVglgOmtJgw1CSYNeDsQvDB4YTJNnMneMSdM6CkEcRhLp2+lz90+wR0K/a9QBE
+1NPubAaRB2uQR4UAEQEAAYkBHwQYAQIACQUCVQEbtAIbDAAKCRBZolL7EZnYc2uJ
+CADHHB/Bmc48Ye1xl6T6nbNEiMCdmpIba+JNFnEWcueq4xk0xoXXUSpBnjLaWPQr
+VZKHXdMxmmR3BjhtFvsLgeajypLUkVDlKMkdGQtsWXL0abr4cNoMDiXURxlbXgxZ
+8+hIs/rKSWKturrCD2V4MXLsQV4xArh1ezkJFEDA3tRGzjjgzg5MwmrmL7H5Pcd6
+vV1Ke60BmvFYvvjRwT4Uw1OD0XluuPOaaiTibhPECc5zLxBz9+eRSsRbxccNEzPY
+JS8Xl9+hIw7Y7Od184cOoexxdoI/K52kH7A5yfEj2kXCZm5tYylyKvgGpczWdZuo
+V3u1xg+t7/QlghTMoJAA0H5G
+=hS0U
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    379CE192D401AB61
+uid    Bintray (by JFrog) <bintray@bintray.com>
+
+sub    0CFE993CDBE1D0A2
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=7Wyn
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    6425559C47CC79C4
+sub    D547B4A01F74AC1E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE3XFIUBCADcj1zw8m1evCgEMqxgOfl6L8y1tsYWsX7tVPvHEkYlXHrdcpkB
+fGuWPrauvhBmB9sBkFfxzU98Ilz3Xk9pfISYiaMUk9Mk1ZxsCoYPVhxvOSvk5LgS
+sviDzjYdZfZtskUM0sRmjmoQL//fVQbfLxJ2zses21za2VHuS3puUbdcm8+UIl/q
+oyneDbzM7j2nYXXJPNXJOfvyVxi1+rsc7xcjMvAj5ievYlWwYlAIgYbAiz969NdL
+RkoA1Wg+cQg+59k7Wvi6xwTfzMsO4jfkV2p24xn4fpcch9J49UhADh6O7XEls1Xr
+80WjysMJWTOX1O2oTtV/BMjpI4gj08SgZRhzABEBAAG5AQ0ETdcUhQEIALq5+uXj
+S4IHZBmOWOBSf6R1EnU4pUqEza0uwgIX5Xr2uSaaCMPCm5xrbtf/Iv45VEuR8zGK
+b8/0dV74me6nXnOeqD27pkkliVE5nMPQnqKAUQmrA5aDR7Tzmey46Bmc+IFrvbWq
+iyA3yZwUpi1FKZR5VLEYhMGI0qOyoaa1NWjD3LDL7/AmQESe9QLCtT6QhNhmj/QW
+ByRpmuIhayNyPGlh5osFyiGgVcinlZE7x12uG76C1V7jo9eYrkjl/uHJHRqfB628
+oLubDFimKl1raYClRZ63jkbZBfC1fRYzxk6356mAxlB2OVDH3aYB97KKZkU8cX22
+IMawk4aBhCyhX8sAEQEAAYkBHwQYAQIACQUCTdcUhQIbDAAKCRBkJVWcR8x5xIbA
+B/9HU+RuaFxAIVwySrAvBwycrq5qb850RU9+KgrKo8CSCKTLdmphgBSE3pCMr6A/
+Q1QtOUndbm7SSq+XqODhij4FfUx0Kz669iPEVEZgZCausY7LH9aTmTJCRM+Ey2eM
+32Skz+ur0T812dN3iNd8HtC/iaJAoGFAnWRHetcH03QMEuogZp80NBg0CHV5Is8x
+0uh8JRHi8hWD1f6vVq9/GwbgRsDOppVa8Z2BgyHOsBDoec/fYC3i4iF8rHuuSGqa
+jswzG9SnFN1zLcGhLEUEOJzeDCANb1b2sJO2r9xEvfNcswj6ksY5lgItE1roCI61
+unkajH4ViHheqLZ/7wRm6eOF
+=kuUA
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B341DDB020FCB6AB
+uid    The Legion of the Bouncy Castle (Maven Repository Artifact Signer) <bcmavensync@bouncycastle.org>
+
+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//xpb0FYbmwHMwUrRhVGhlIExlZ2lv
+biBvZiB0aGUgQm91bmN5IENhc3RsZSAoTWF2ZW4gUmVwb3NpdG9yeSBBcnRpZmFj
+dCBTaWduZXIpIDxiY21hdmVuc3luY0Bib3VuY3ljYXN0bGUub3JnPohgBBMRAgAg
+BQJKMGw7AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQs0HdsCD8tqsVVQCf
+fP6hDSk3fnQ9Hls+Bc0syNyo/aAAn1WKdS/Sf2OQiVG6iPUE3F/o5gu5uQINBEow
+bDsQCADkwyW3z1uiaoTRNKrrcmc9pJ4QqwDHoDUppdpKDQsQjt8x5tJBwB1V0AUG
+jgdpH6M00a/kkZO8A5suurGefmZT/6qF1PDhYJ/XtHgRMQpzeIU3fGunHPZV7Dxl
+anDc9wSAJ7btk3TYnoGC0SqFP2/1/QSQCBEciRxoUKfGZ7XI84U347T+fUD7n0Cv
+yubBwcailKhmUYMR0R2oSXH+yFCOqrovHdtZhdL58bNICKn4QBf92HxL2Zm5LpUJ
+aMvHRK1rW26i6r0907Pn/hb/Ph0Xfpdtl3VRkeTDsNIBRdhd/B8c+asE6svHwv7e
+cuM2cXhJIF3XgB86GcFxNC28u5UzAAMFB/wML1mG0mocH9pexBKsm2agdtQe44Hc
+d3zjzpRtlH4E+eddCd23cubbNpJjemVYzaePEvjaS49WuF10u7h9aZYaGf92MWFR
+6FnuGytDDvfl4w+FZlCkWddAFFf3wSVnhVWymzNIGHJvCUff2IJAE6/8i5H+3KRY
+jGM9jtEfjURZxI6MnUskzbKuT9H4WJ1TJ6151zBQCm4NkecfffROX/V74ximYzOB
+1QalT2/FkkcP27MRsjHJN3aTLbLdH6f/oSRG3cBT14jQhjUGpSHTAC4a/8yrZpIN
+dc1gn+nOddJAGObLa28mWpef7AjX+6NEwdNMVQHJK4zJmQLQ/BQACdYxiEkEGBEC
+AAkFAkowbDsCGwwACgkQs0HdsCD8tqt9zQCcCZBsSD1ecuv+3SJRLv5XsVwvkqkA
+n2TctLkkj3uDcZlDYIeRDAnf5Zw/
+=tn4r
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1B2718089CE964B8
+uid    Robert Scholte <rfscholte@codehaus.org>
+
+sub    A182F48D9C2C0825
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+bkCLXLRrbbFNZmCYGMkpJaJp1fszyEpqZGNE2g==
+=oHeJ
+-----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    3A1959EEF8726006
+uid    Eclipse Project for JAF <jaf-dev@eclipse.org>
+
+sub    D908A43FB7EC07AC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+9Q==
+=PprS
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    41321490758AAD6F
+uid    Groovy Operator (Groovy Language Continuous Integration Server) <ci@groovy-lang.org>
+
+sub    01F3A913FB698736
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+ZIY=
+=83HN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    205C8673DC742C7C
+uid    Brian E Fox (CODE SIGNING KEY) <brianf@apache.org>
+
+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    586654072EAD6677
+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/e3puhmgNkzrZj26T85LkCDQRNVUpZEAgA
+6xveuDcah4gFC0l2BFR9QsJU0SC5IkwRJC/3GcqAQZ5Bf0i1V90wuu8tt/jJLIgn
+VKEFHyTzReTwzoLZcD5zXgBVSu09Qeax47ndNjSfZWNkPmaztM5j9yr4OF5MEvOX
+E2wrzmrSNlc4rb5KWK/1pEEiX/zdzWJLmQEzvp/MtZmqyK6pCwtS8S+gKZQjZZLO
+EnezizecIce2r6xCRxotqncUwfUg+jMUUlZKUlKwh4TrYDFHhet8azXLpjED0ASG
+7/pBYDbRPnmWhX1NPiB4MvLDETrx67aszzrsGXZx9Tr61bhFbRKyDY5ia//5017V
+gStGAqbkkCNZHGnQnNzjuwADBQgA6A58Mp77pUtCtVhfBRnziKkEaCn8nCpqM/PF
+rxih08fQJ3xt/DbfpBx31Hky7KM1uLgzZEnekuU0ZqwgK3aqWg80moKaJNxUZdd5
+oreFobsO7ptejt5omX6kxdGjPclOt1M8sc6E+A3sR5a2QC/9Bts42myc1zKK6+6d
+3UpfUlqgaPvXbGTsisM7jt4DtVz6mXLTyjAiWeO07dcbSjgZuRnHsSCJobzTmNtF
+TP1DgUecgTcOK2ajgGsuzLqkbaQnK/RiRIzqkFIWlz8rzlYNXh8TA90BLeGXSuVO
+EW7GBIc8fVns6o10OdsAqnzEQqcCZv/eHHXjt9T5WgV3epy514hJBBgRAgAJBQJN
+VUpZAhsMAAoJEFhmVAcurWZ3QEMAoLP6krvubxUbwXhlbIO2EiMTh3/MAKCyB20O
+CDJEYrz4EqbscOdx6H3uwA==
+=e+jv
+-----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    995EFBF4A3D20BEB
+uid    Ktlint (ktlint signing key) <ktlint-admin@pinterest.com>
+
+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    AC5EC74981F9CDA6
+uid    Cedric Beust <cedric@beust.com>
+
+sub    5D9FFE7B8E3DEA8B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBF0YzcYBCADmNIEEzvSsnJnxH0u89Hb5vCCkl+45dWHyCMsCLNty8yL214LV
+B35gnU+6BvRXN3DmTpreCV8/wgI2h1eq83dTO2AsnJTxTjvYpiwAtWhONxWxCU1Y
+WlH8Fsvao51CJWUwYY2HzFr9j7h7EOnm6gj2pnUDdjHRgou9/OxIk6q3M6hrwwh2
+IXw6PXFmkg4wRwlqW5FiC90I8gd3ItFCzqx0TR7DuhOFhtvOheWMlApPoMOUY+6u
+C5Ek6kVW5w5xshKafS7p2s0WOsXkOnH76avFtkBtcsPbHkwWTal4xivSMMsCpdPM
+cF6Fr2p5hF4khQ1r5pdmHeYNoXcC+hSnPM9tABEBAAG0H0NlZHJpYyBCZXVzdCA8
+Y2VkcmljQGJldXN0LmNvbT6JAVQEEwEIAD4WIQTcugM4HvbIkJas2YWsXsdJgfnN
+pgUCXRjNxgIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCsXsdJ
+gfnNpjMGCAC9ojPgU3nJjPdbr57iB1ulJuDaMq+5AsFycAvpbBlbHQYVj3ngldzX
+eehl5H2KYYQzUfr7lDoTwk2dz1i64opMBbsNJZFamivwOaAEk1hX4CwZDGbzk0Cf
+T0oE4dR4TsNEbsW8AiLxXa8ZVbK9cGYdcWHYyNKDJeb/afNeCCpZpkx6+qpXJG2B
+QbIO+8J2E03WcaO0ualRdyw7GM/APJrU0o9sA3wwv4dReuJSrV4JlaoNvHvOok43
+Z6IxuWYwPe5Gf+zMXrHDUFOIiNbYLnXMxi1QDIyXsnJ+KNXRRo0icfB8P81AeG1g
+qFuw0Y15YoFvN+sFWtks0wdzZqzxLLp1uQENBF0YzcYBCACmu7FGW89IMsiRtCfW
+h5aPwLzmWaczLXeUhcrlcl2GHKiy//zM+1PhFj092Tl/WCif0694nXsKrlx9PO0q
+6ca9LSyHZqwAV8AbLHyxkl6mQs+HH5CHEMrT/FpPLCfTUCSyNRyuRJWkbJjCeMkA
+mB+eVHHQLfaRRHVTBW4EfxCHAtwLfys/0PO82+aCHwCgUh7vTUara4krPNHV+7Kf
+SbqCACk3b0ebY53cAva+p+BZac+vJ58Cg9MunvURigd111PZOkiKlAx6xwcq1Z2H
+cJFTj+jtTGwaeXJErusPXhW1NxiUqCeKe4o9Iw+D2pYIqqahVGKnqPYDYY3dBMU3
+GHiDABEBAAGJATwEGAEIACYWIQTcugM4HvbIkJas2YWsXsdJgfnNpgUCXRjNxgIb
+DAUJA8JnAAAKCRCsXsdJgfnNphXkB/9/M1DqpV/FBRhPYMiycj0L+qKXDjJdMSle
+m8a7F59PEGkB0oStEUC0voAeO3hPLvgm0MVAsX9ULtWHlPG+uDYG8/CnFla8BaFA
+kTSlTQsmE0/0j0XTrR4uO5aJBRR+yDKGeR31JyWGecE7UfwQPMxSZENLVft0oZUU
+Rc8vLNBn7Acl/kbw1uKI2ASVmIA4cLYBuYuI14Q63EZQHlGQ2AviuaMR23qYRv4R
+q5sRu1RJw/fITZzwFmmVT0MJvkW3y0pE0VAA7aGfx5ycnEPmNlqS4Xfjk+i864g1
+NjcUKpxv5QIn/p3P8XLKVJoUXU2y4MiJreUxhQI8ClVBsDh/Q9pr
+=543s
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    5E2F2B3D474EFE6B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFijpzMBCACxAT3jijwXbI6b7LIF/k8oSGyM8ZNJpb6AQvPqKIqCzxNFXzow
+EBCasKMhIWgGy+293Tpt/DY4btJie4u+igMBS86iXrF8CUnOLPgTlAIyil/oREGJ
+1GFkHsf0Yj88zCo9H9GNiUZRNSHdf55gsgjzzFVdZ6x0MoN7Yopbvl71bcTSbe25
+AZM6K4gIf5TTo66smG9FgwDkMxc61ixRty44gkfWapzdob5d0cli0Ze0mu+2PHJ0
+Fdt2sUX/4M0Bpxk7eaGVecyb9sm6KkRaGziJ+XVByZ0UMdrEEJscLaX/UpfK+Wek
+aPQjDdyYLW90PJofKFPt4h2DBQyf9DSZ8NfJABEBAAE=
+=rKaG
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    873A8E86B4372146
+sub    1AFEC329B615D06C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEdddbQRBADRgstdUZq7ceq3NYcR5kpoU2tN2Zvg1vptE9FxpDbL73gdLWnI
+C7IAx+NNjdG7Ncdg+u10UZv6OSmhWAd8ubWcD9JxKtS4UXkNPHxhHFHqVPHuCwsQ
+q2AaCtuOk6q9OtthQX6LfOuGqwbv9uH/KLUDn91PrgKuHPVfVveiF30ZvwCggutX
+D0jTGRHzUJl7F1wViuckHJcD/2z76t0ObSuTnENi0IUjF3Toe4tv+qO+Ljs0knvK
+tu1b8A5Bs+kxNcbEqV+zdIph+6gCL9jy+dB9J+t6uZg6ACJexbIkDPsutNtbAVDV
+w5AtM7JR8930dRHfEt26ahFohFi+73V8RiA7LrmMjA8rX4zuo5Pr48xt/RR1Y/VE
+8ohCA/wOqul9eHHevxeEMDYoGVjGl2EiuIThg4eYuQDDSisBNb9a6dhE8ECQFFBx
+mGz32+I8gXSTKFAkkQUI4HmJmTX35nGJql6E7Bn5yM2OaOG04PV+xkhScJll5ZxZ
+BNEccFDL/aI4N33cwrLHyk+wFNZHBL1hnHpxpjFZYv5xfEBjmbkCDQRHXXXPEAgA
+yqEz3eBEKiZ7VbAj96HtIvGufKTdZ0ERJtrdPO4FUGVBcXpphtnPn+JOWomszUKk
+KLO4x24OaDCG/SENsPy+Ned4wjBB+4uV0YEc5Xn8gts3g4Z5p+YiVu+aWeYPPC5B
+PU61tVqc996i9ZYkZiYOs9F5Z+dKozk3KwVcijaCr0IQMjAtJ/N70zcciP23KhrN
+9Z3Nn54Xm7GezD0nxTUGP8gM79zKHnVhDBptrxIT/adCzU9/UX3UVAQcdq86FfzT
+EpqFG3TM75HBTQgHihIkkirzurE+ivh6aaF3UJwmDBe5Wu3gvxF6Rl0Ja/YBNkkC
+iOXngXSxwvUUR8KJO07RGwADBggAxOFV2DfMHsTBu++gKJ94L6VjETfVFEYPo7e4
+tO2Zn2Unzdxz2BoTJcQY0j6/M3Tl9hCwhOSVVL8Ao/wp1ykjgXnwV4vz0be4d/ZM
+L+KF15x+8730H7Th+aR+Ug6K6Khsp8XIypmLJcYgYLD02PlSnDxCq9Fbv0JDlbr6
+tbsJiVzoRjg+WNEIB3IIrJbTIiOFrRBhloinYoot216QJ1rI2nQpMEBlSuX6f4jY
+F6F7X4dAY4V4ohjFeJCb6SYkKbj4caqBA9OVrj3vh8v/vAUKDB8pqVhpaZicFpMd
+2pEEYVMEU4i1sLE3X73y9RRuaJOvPAx2HHT8MlWjsDmNdY2Mg4hJBBgRAgAJBQJH
+XXXPAhsMAAoJEIc6joa0NyFGZKwAnA7QdwrbR2IBqxd9SgqHF/4MAomBAJ9fA/O+
+UMDa7hOEJLf1tEYcv0ESGQ==
+=+kDs
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7C25280EAE63EBE5
+sub    926DFB2EDB329089
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQGiBEPonucRBACtbhYckAoyz1tuSXYX4XiqGa5390gIMcxe2hJ+Ncx9o3zX09Im
+f8PW27BnMrz7EIydgB2wphhjfK4vkNNtm5ZDWH/zJStsk1Fe7lNuuxs8XorX1+8D
+bhhFEuc2B85vNf2o9Y4V5GFwbD+tFNy4u24n7zg6/VgE2WDvYJ8JRqCEkwCggyLj
+ba0lsZ2XtSINh/W8ok+9f0sD/A8WhqBfDTEBuG9gnuCYXM0j7XBBPdPS+FXmmfea
+zyP+URKRprLCdt0ThZAMllIxZJrkbv7aeXVpM6KSZ/XvvaFQ/gha4o4iJFvpoKt1
+Er2j4Tz/STKztHGsMt6pqfrMNPWovu4tLuLZQmojtbIk+IwmcYxMy99owH8oV1WC
+U4HeA/9MlUxzmlmrQF7VLqFTGEEqQaEJqz95wNPj/t1DmI97hshPzXLD4zwKwa9m
+qZJPStRHM0a6xW2dztF12aXhrmYg1gIGNnsHtq+t8ZhfINZUurSWn0m65WT5notA
+15s6hwyDACHWWOgFQ9jmWuGDh0ZpiaBe7BxeTV+MsswY81sOn7kCDQRD6J8HEAgA
+sivVzAfz34QE+S4WTXCuknmYiSEEnyTwk9awb52vrYlhoQ2t2EhRClc/tR6QbhNM
+haMxPt1OYeutOvZN4q216IE2SwZzIDDTchYApP/brBdIDf4L/XGWFIqftCSn+vnb
+0LAzYNVuNXtNwRni2q/fZ3g1wniVMbJ2MrJNt2VhLrP9K/ipFz7JCJittMngmmDF
+7mEKhnrqBROLubFsUfNmz1qRC6PiEwyyCCdG+4m8fIiSyqna3CMkZr/UaVfxuGZH
+WM8HYGmiQjafqeLqo8aSbWerzDYtF2+v4hAAt9eDwdgYy8oNxXEvw7Q+G5lix+6S
+UMYV6NKLNUbBYffm9wjVuwADBQf8DbA7RpziZWLv7DHjR31AA5nnGEeud0dCRO8r
+wfQNnaQvuJq8siRmU3uPAL2NwDgMaa0cT1xt7p4/8/RU0N9otVqnzkLMUTuqq/wt
+QrQt0OWsEJRyxemWFwiL9ZpU4eTg49cfOQXjg2q3fbx9D1Xr6Bu/Pn7UDU8r9GbD
+StGJ7R3Z0kkhtCErWnGNXbuqlVd8uEsyeM2HYpM76BmH/8vMg43lOJyyh6Id20ZT
+n3HgWzRI5QaDJ1JYBhMuVChbTPUCcMox+qgiH4KtRIAjt+m3w0Axjsqo3EFPweWG
+pRfqMyiUcESt4X/Z9V2Nf41NH+nQ74v3RvpP7EWKf9FfEtFpr4hGBBgRAgAGBQJD
+6J8HAAoJEHwlKA6uY+vlN70An1dGrF5xPmh6P43U9+ZwJMtk18aJAJ90ff5E8Fsp
+JCh/PZsbHv+eJN32qA==
+=win2
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B16698A4ADF4D638
+uid    Checker Framework (Official Release) <checker-framework-dev@googlegroups.com>
+
+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
+dtEJjcmvRmJ2hwLmgwMP4zSNKsnLGzP0sh69ABEBAAG0TUNoZWNrZXIgRnJhbWV3
+b3JrIChPZmZpY2lhbCBSZWxlYXNlKSA8Y2hlY2tlci1mcmFtZXdvcmstZGV2QGdv
+b2dsZWdyb3Vwcy5jb20+iQE4BBMBAgAiBQJTNb/QAhsDBgsJCAcDAgYVCAIJCgsE
+FgIDAQIeAQIXgAAKCRCxZpikrfTWOJ4nB/sGNeq4d18M8Cbrfaj+YwQCkmO2ZELb
+VegqcJELSnvvs9EKO4X1c4Snnbk5r9apoCBSXhODYMfkZ6SUI4Op/8y4S4Km35PL
+8revBwkuen1xMr5cRwRVkdZemKtLaKenUyY+ERpZPdRCSEfW7AVsRqRmsHIIz7UJ
+1p2tAiWHMnyhjFOM3Iap/w7liGPsLmqbHReKUkeriRo40H92ASlPcZxmnbKCMtkB
+wP2FuE1waOvjKfihtU1ZGjsP4JxriIcGz7h80kdGfWyFbZMIeZvnTFfB3odp5qNT
+Zf5enUcYf3NO3IsUqege0gy1PWEF6c3RSPX97YzuW90OPKAHKt/QLON6uQENBFM1
+v9ABCADutkjG6oCMxBUBB5cTTeaWR3e5rKgxEiCxWBZCNZsZZA9LcBVjG5OJzB9l
+V4Yrk97paigTlFFDUKzu3oLX2xrIFb+G1m1B33mZH76Fg5Zm674tWC5Uf2ccxqQj
+XPHt2jnDd1yh5QcH1GnKOqXEwby6SjwP0wI5EzrSuAOQM79QksKc0iX9m1VW65+5
+ov68O/EpmQFdv67YjlOWvUvt387MC5NTzv8//3eFaAnC9rNlrnlTtUPfZHo5BOeZ
+d5WMBIgc1bgAPfENGucIPOL0RhWUFiyMPHNtDp9vnWXEy2XOtWY57CNS0py1FMkP
+38x0Pgcp0BfZeN2QjyhSJdduTBopABEBAAGJAR8EGAECAAkFAlM1v9ACGwwACgkQ
+sWaYpK301jiXpQf/bw3Nxv5qyBwdT/85dBXZecEM2klXPSQf3HtNNfKbaZS+9dWn
+9GQ71qpmZCTZGLtJR4J54mlwdJdxhlDyGv02c1YBUkT4+uRVkzJAWzZ4RiMFeSFT
+j3Eiksg2J/f50D6ZlpeXw4/MYr+pCmMQOIY40W0RrlF4iNnZ8hR7haWnH/wH/zHN
+FPwgw7s+WtY0uEmLmDPxxVS/dzzmc8C1Ef/hg7lSRZ5tdq5oxpyVYEdK1nCSiber
+wrAT1XyGpn5erxvjeE1kPXro/EXeIY7GDzsA34FSFBiIaU1Cfn89OOn5M/TFp1+0
+SYeoaiwF0+x23NBUxbCmAGyyW5t0Pq1PY03TPA==
+=URva
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    0E91C2DE43B72BB1
+uid    Peter Palaga <ppalaga@apache.org>
+uid    Peter Palaga <peter@palaga.org>
+uid    Peter Palaga <ppalaga@redhat.com>
+
+sub    83552A552A0D431C
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+MNW5Qc4ZDKq+ywOElvONMnX4oaQ1
+=Z4Zj
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    ECDFEA3CB4493B94
+uid    Guillaume Nodet <gnodet@apache.org>
+
+sub    3BD211F725778C36
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+8Rk4igUAoKASMCNpbFGpw52Wz3D4pRtDjoYj
+=mkVE
+-----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    461A804F2609FD89
+uid    Stanley Shyiko <stanley.shyiko@gmail.com>
+
+sub    8067ECAA8D58321C
+sub    750F9A735EECF640
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=wpe3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7A01B0F236E5430F
+uid    Inderjeet Singh <inder@alumni.stanford.edu>
+
+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    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    86FDC7E2A11262CB
+uid    Gary David Gregory (Code signing key) <ggregory@apache.org>
+
+sub    59BA7BFEAD3D7F94
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=GKsT
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7457CA33C3CE9E15
+uid    Colin Decker <cgdecker@google.com>
+
+sub    ABE9F3126BB741C1
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=Gj90
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    3FAAD2CD5ECBB314
+uid    Rob Tompkins <chtompki@apache.org>
+
+sub    3260CB2DEF74135B
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQINBFhqdSMBEACmveOOsQrTky8b5M+Cq6lbhqRB4+INnfigxr7+EMpswo4AxYuA
+Op/YG+G7NU5h6EK6Tj2dVfXga90GYFkehtFRZgOUJUGKPU/53upsbnsWS8qjJD8g
+MvWpHbuhK6WsXGxjqWykAk8D2o2jfJEsUGeJhbG/12BoT87pjsUcZu7DkKilx6/L
+WoM2/sirH2e4B1FLZvE7NCKpGttZv+vEI9oZmoKgm+ZHt4cSGOPrPtrAtf19irP1
+02/+kIPghmRd9ZwnK4xEazYe6mrY+8kQlrsSWFKTaWfvXQRJjyBJCuSwZCaWgMku
+vP4P7SWTqGX471bdDhVbG8naGhil8aJjgZJlsOUZKYXUCMU6KVKf0f7qzDlJuIPx
+4nrQ3lu2QvF9H9PCnj6pCx8tD+DJBq4nRi8kE2k3lAnpjZ5VpVuW+tSwsai50Son
+ymZe5QZj9T5Nvy8tMkF4LwxA+2alWfvdHWRISuEO6jNwOuxHMtbprbD9KxY9Smd6
+YcRKKsLmKR8J6a5V7pELFTVGSLhSL2H+Z2j14fkswGE5vkxAQpGCfxQh7rbvrhw2
+lpx9OmvljnWFM7U26nfUG5tCp+ieE6pT76hcPZ5MPaqWl18Rk5dVJQhNZ3Gd52In
+ai/y0v96pn8XZBRuNFULMb2PFG88hvU2M49Y8Rdi2VW/IfN3hIh2e4FT2wARAQAB
+tCJSb2IgVG9tcGtpbnMgPGNodG9tcGtpQGFwYWNoZS5vcmc+iQI4BBMBAgAiBQJY
+anUjAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRA/qtLNXsuzFN58D/9+
+oqX4IAFmHD2D1nhQ6GPDRXxhFYfyn5KJeGzWXKp/958kmAQJzjFGlmF+19Q7ukJI
+OnBz/X1n9cGc4tE6y+0AeH+k5hdlqL/wqa96uDUmQt7ZAMP5KvI2cslIxaRgwihi
+zRfV9VEp9Mzfqt/0517/h8m+BZuoqezI32ktVgoCrWWcMFoOnm3hpVDYG2WDbdlz
+TEDcapJO0yWVYAsWK+sC/HG3c6AQN1/7bPIxX/LIlm7AJyMmc9QFVASUyOhEvBr5
+PuG6TXH+XPVTY//cFEvtqiVpC/XS/oTx5WQt3x54Rrte8o3KSQkMQ3lelDkPOQ97
+yl407sCcaORnKrJ4U2VX2WhW3PX5IiTISvWI1f7cNkQz0lHHAixc3LEtmR1XYRo5
+Ohg3mlaFu9B2eAZu6xcLwNp5McyWu7HyI6ZLeyNlvVVeKR/OxMBDtbRiBY3VlONt
+3cOjnRkmlWcpkezwwLXY+iny1f1M1uNN84g7HeBTauyOTxhYNmjmxz+lBA7TG5aN
+s31uC+SRBOFli8E2n7cQUZ40mbamAX/3M9oxu7bcYzPajFNsns/DyP2iBr9PTJVt
+9OhmfmR+skVIIGA/J58yq7yYGQ89BZgBPL4wpRwddqPaPk3HwDzzoqKqHJdVHqXW
+QtUCu2URCR9yDQorXaMy8THp+sgCyWU67vS/Aq0wiYkCIgQQAQoADAUCWRuRuAWD
+B4YfgAAKCRDB7bucpAD9UG3wEACOYYHrBl68P8FgiWf+GuAbmZbwhQ1cIO+HYS4u
+nxxrdXWPVQMBKrYYISi3T2HwB65aYyvQcvbQmwtNHnrt9FTs0pWmFF+0rPPqS6Ud
+JbXU5nVuDuFNLehyqjaY7X2j6KRLSmQjpoubflBzRmEKHpNF0dGDT3MT07/AKvOG
+QggVdLcuVVF9lYmlw41Jmo5MuB60C+hxa2wuE4/F0t2gEHZsOVZonby7uaf4ZUhd
+IUzeZjOy5v4ZN/MRJCllvvBaioBKj8uIF62/r3rgIefu7p1Ikird1kLoKYyv5H98
+GrJAyfw7jb4iMBRkaclACd5mLnfrmbat9MEzuuDLm8IuEyYRFfctAJR/KTKogQwY
+6a1U3U7zYdM6HFvlWdwAlG9LP6Po/NNmLsLzERuhRMMdUP3aKtfktLlW0qtTxXAa
+sVQKzijw4629hXB27n3MIclrq8DYSdkupry6yQ1iN4BLrcRg0mkK8FRG5j6RoQS4
+u9KJg/Oc6YeRTPgiN2hJ7hwWK5I0vLsysgEdxJNPD4NuWUvpMADfvh8XbXk+i/S6
+/NahyM6e0CrWfMP8ZTWrRl3i9sbl9rlfZbnLzaZJ5mwAkEp9MZ+Jwo+mPQ+nb+wA
+zQmOwLhGoRtgc5yNKv7YaK3kEaBDi+kG1qlq/PpyeK5o3ynSbg8+1LTEqxOmQsBi
+ymAWtYkCHAQQAQgABgUCWRuaWgAKCRDkAy3E7wzzipxZEACgnqIYnMTo43DfmOqQ
+RumXEuN27sZv/0TUq7s0EUvAVcKAZaZC8DPDM36Sc2jmevRKxPVRy6VAjZdUD278
+Ha4VgFKnQ11GtAB1xsK/HE+0/OP0PDZhIMdwial2pwVq9DLtNMXqAbz1NMf1sFeh
+l54kWOkJDB10eWmY9V22wKVZ4f1tUeQEL5f5ZVaRToj5AsAP1hSwZt9P+tnMHCEZ
+qHo6pqMN+ydrabbuXqZvy1eBnuQ5mZDGLeuOO8Buc/kwOMeT+MGjNkyTEmYDqC9u
+vDYyWmbDFyh6lF0YC2UYMc5wJbczbyJcvSQN2T1QNNcSZOq0DtISb1DeBXnhQ6NT
+yKZqLuHFkOxtlJExFErrHLhF8Ug7lWCDATPViZaiqTRX1pRUciVEH8I5IIPzde8b
+l61lgZlaJRVTKVWYHBj1Zk0LqSAu1Qhl5tfyIjwgKw1TOZTfO6uYaEVn97lFzp26
+yZQUwBqcl0f/2mRAXfojzWAqSnLtfJ2v439Owwpbf76maLyRWzUhxgQMr0aEpj36
+LDRPLu4+g3sCwOazA0ma5ua4iU6Pbs3O7BsnIAme5DGZfLFIf8VuTw9oDur5i5Rl
+/yTsIBmFm1q6tbl+j42CV27SM6Nk4CHIW71Gx6mQtsMReam+dN+amEDZ+GR1NSI9
+TDQhToL0YTN46i3HdMITiZxHE4kCHAQQAQoABgUCWRupcwAKCRBvDNrnALaJnaXh
+D/wKyb7FZXjbwQMq/jmqiz7mhctK6z7PiEnpOhlj8Pohi7K0FRRJMouNd59A6+PA
+Ahbou9FiGz/u4dFXjMvJY/gzG2ROPwHxi6b9ssDATD3DaQgX3dCVKdqwBL6dwI75
+wwF1jkbEyyD3UiIwGYdu/p7RFYegvXfGI3k+/+90kpUaY0BiXL3UAmwguGbO9gAR
+kjOh62pBt2AgrUDH/yFPa9ziecPM5iJ6KEQEiPxoPHmWteeUHBjSTIir639uM10+
+dMf1RiPnDumcArRtLG+QwBycjiu8NpHcW2Er6nJszc+HnoEx7kDPypdy/NUw6qOk
+x9NuS66iok6AlR5hB2kH8KhsY6iLTPKYNKvWSAD1xs07lxVnbYEgkvIzaLC/8D5Q
+At1s6uteitc7lxCqa7w/DJuBPAZvuGA6Ynv/5YnUOb/UH3cN13/+rC0S69Ez00Wa
+K/IFJpuQCTHZu4s5jHWN5mUXH4dkaitMmgvH7BlqUwUXiVpFkXHP862JRQrYIPze
+uT71HpqEgajnFhD55QkqrCHSilM5yDkjxD/6wZ8q8YlN2dAwy+eJbxnsgJI5OG6n
+ulJvL02WWu124bocJRkd0v2oqbxByv04R23Lhzzv1obpLtAz5vbweEA9QmcJacV1
+dSqMdICbYiNDncYUNVuplMsKBJoLr4Q6S0jqZO6Ge8uyg4kCMwQQAQgAHRYhBOev
+l8MfCRCyWo4BHIsOEDz8/oC8BQJZHC+cAAoJEIsOEDz8/oC8dvQP/j4nI7hF4wcF
+TxHvF0z3xcXf98VgFB5YKBNoe2F2eR9+GQz/IUcvpU9GwdoCg97npZLtQdU1+iLl
+B6jKzBjAl23SoENHdJOHdbddxnzPL3RZPU/xZd5Mob5t7Sxnu0Vlp+YTo6yczM2d
+VVtRBZTfk00GX+U54QX7ULJPHnUkbrBYPE9/H8bPByQuAFPkTm6jo4fajqu8j0Ij
+VDbLWEmZCO1fXzzdNbP/qgVdpuIcU8vuCtINmlqy9K7NZl8MvhdcuxrCHPpeExS3
+jqv2o1CbH6dd0Q3PQFEPBUkdbDa5EnYkZT+rFxDPXP/z6Y7xU3sI7HjM/5nL4ZqI
+B2mTo5lFpE4I8a+KdT37SNkrsXq+laZ1HeOTYHgWCkuw0odeJyino+BaqqOJmGEi
+xdKor7tL4SH/GTFi4ANZUM9iqyfYpRLt6lrelatLfM3PM3t8cXkzNuD+N3CAWLqf
+FmA24rcTPD2YRQDHtj4oebxUsVaFFj+OxZK9YG6fnG0XhUKYbdwlNa398z4FBO9J
+M5hLkEuJ5lTobwjBiQaJzCz+NgSFOme+kS7iePcWIMCXjIrsAx0cN3i+XMcJ+XlH
+ENBl+sFEqMr8RS60I9fy8pDJxRS2c/ds3k1i/XRxZZztj40/vGdDvTMNoBSXk9Gx
+y+lBS5iCMgzmA6kj98+18IIQhblZyFUgiQIzBBABCgAdFiEEzVRkMV8LmMd+bo7N
+narcHJ/MgtAFAlkcTk4ACgkQnarcHJ/MgtCPeQ/9HaSwSVuKsj8dyrX95W3re1Nc
+JcoadzxhS7+FDDq8asrnyyks8BYchalWG/V23LvHB+2xF7G1/j1BXRdhH8F49ZZm
+7emU2Z95DeEcT8Vw4/qLDqfNYAHqxGiFMe21HAeyAQ0ScCehB5gy5W6G5qRDBqaq
+1lIWoTprTq4rrXhrdvj45IjV4xrWCdyMMhKd0VBJOHSA1vKvToL1ZYU3tZ2SrCaw
+Og+D14GkFh6uEO+ayGr6tjB4M2Scc4GoTmuKt2FtGNPVArA4S8u4PhvYBbRl23yv
+J9rp1vSBhoxx6v2weqrthDnvn72unzdC1dnB79Sy2Rq8MdbVXYm99xDx37E2NxFj
+VibOOYMyH21dhtzsLTULYQAbIHoJor1ULCe/YMcTtLwL270M2/8y39mD1albvEEu
+CgkkdIXXLAQDUd9sWcyBdJAoFjoQsnKb+vnkX6rxLdxqVCXE0yWUpzrltYCPEf36
+wrisibVoo6hK1ppMQAIP6Mt1NgjsW45yZZqUSSJTc8ZYEG2O2uCaSHGB57bHHdL8
+4jxD8CsmsJJLWOy7+dMGazyg4oesu97AlX71GiIUrL2gaYw1IJ2lTAqXhBuoWKrV
+lAaS2DeUbsMCA0UtNp6dPsyRlAKv4jaoFTQDkMpQAQGt77sC8EXHF9SncYrWyQlt
+umHuvinI3MEdWE/CjDSJAhwEEAECAAYFAlkkg88ACgkQmdmJgLgepigHhBAAyjp1
+8lCt/oOkO8Gqn20dvfGTAUprwFxdg8UGWWnC0FJYefP1IPgWoWaBqYii28Lf0itv
+hkzdw7Dvzz+NB8c8Nx17TKdpTbK+h+DhzXh//YDcsbMbeg/CS5uCO7Wib0gedv2Q
+VFRt/Km1eSV2QfvDk7FtA1QvcRpJykr6wsrZAgWe+3lVRdrtfqWzfddOTrNK2M/v
+I842+CzX55uJDwetDPNU6CmaEFhaoL3JYnP3L5omEls98j/zvpPeHSqaSUMLs3Mp
+9AT1zwEs+Sy8/uuv63dCaw3sK3bqiUKNwtPvVgF0oPIMO54XkAP3WLZAI5CowaGO
+frqdelpBLihxMItpBMa0RPAhkvV6WqFnMDABWdNsgJYdLQdYe6MufllC6PqBJS09
+gWF/KFT/lzBorS8U1hl3KQYSfUdBhW0az+s6BZDq6YBa1FL9WLTI26jqOBAtWkov
+bwbG0wMZIAIDKUtZ+qKIxMhLVYMuHyOF6IYE8WUQNXxyRpH6ziCJDBUMPk94jFUB
+iQ46fy5OScs4t84Hjf8JdfaAowXfMZ3FfG3wvFdMcubQx4+rP0XYpabYWMQ0ZPTz
+vN8EwfmZpIVovxcRe4L6whF8nfWIj/UfuWTnkJ4Hmyh6OzMTvYBVVHdq709AnWKC
+i5NpFw29rMKYqOPF5QtaWtJdOq58YjvgiC8HEEeJAiIEEwEKAAwFAlkk9RcFgweG
+H4AACgkQA+K/Hg+1K8axQw/+L7wEU+wbNicCmyTz3q+ZiLnLI5z+i+prLh2BS7Q8
+f9KyvIyDZEyaOy0yxXgsIOXXBhZBaKKrsddTRz2KxYM7p1nVv3ReAGMpuGiVEOpX
+5sBYWAJVVZM9NwBOmbSm72ZJDcZ952TkbAaSiSsJ+aRuqp5ALHW9gxkq0fMymxUz
+PhD/ZGjjiaAnie4wCmQtALRMdZwXTZbfvxSGmDLbzfKv1WEFXKTvYzdhfVndJtEd
+vnOmCiZgCp4NOsLIOnlOY5UU7cPz6sgW3TuqrCt/3geclGTpz6BGnT+aTsIprRpJ
+ynP3fHCbYjBAnGzI53NrgE6zYeWFM/wnHumNzIqxTRbgLpN5D/pFK1Jxqyz8lFg/
+3eU7B+fCabjUbc7f9wv6jYQuurZ3CXYwVUNR1Z8MEKpv+DSoOFSptLnpfsokZMRI
+3Vf+qoFZ2NfOnIKOJ1ZPuQ3Ey8owVitVSd/zSo5f8EEqYseCMCNlCum+Al5JSVv/
+ESBo4naSxbZ1GXbNpwzzVfe0qM/q4IePqgu81Jl0dKg+rqwyueXe8X0CWg1x2EF/
+2WKIxuBfOMqJuiDn8TrvZp8GbN7ko4N6nVtkGJgPLu6RTkA6eN/6yTOAUtqXAxSD
+yQnGFFyAyUUSUV2RUl+xJcN/1EowItTj+ZPQNOAJWKNMmcnxbzll87+XmeTUlke3
+7rSJAhwEEAEKAAYFAlkojlEACgkQnEn0IUcIVRikuhAAmjLGqIoXF2urIhImDFQY
+UiLNxM5Lx/GxU/BuonsPwxsubBoI5eesxsl441AsulHd61j+udOGZNZxX2r0yH5x
+N0J3PnIHu7MauzbihqEUTBgYrrrPnxADiV/VwGRJ67x/TCrQGNz+TLzqL9M19Jp9
+UZmnTI9NxyWPnpOGSmA5H7smHuoJhgJuE5CP9BqI96OsHjnzoQrIc3dK3/y5YuXV
+KBr+iZoQzNQF1V/uUH8/YZluFLVS6oZK8eEuc+vU44RKF4z3t4xf90zM+KANVSa8
+WaSjfWvCQ7xJ4JDjxCUOBWWBE0XqSduKecoyH17d8eScWGdA/BVPYCau1VWz/ZEJ
+JGwQHUAy+4DiJy9LkIOo9r9S6n/PHZoO600CS+W/ES4cvGYAtzIwZUtRAnLpwI1e
+Ov2qV3KoPHeAtnxq6aXXNKMSeUCYX8hLuqMFsrCroFkMZB83lRGKB8bX3Zd5bTJy
+1mp7iK7VqYTHTqj+YmD605sY67UEAm0TPeJVWwCvP9HY5LFGfPIptc6GLvwBO+JG
+zC0iZxxPlvUA6YL4lXqaDahSjcnvweorDe3Nx/cF3MeMCCx0CsxWAPZlccSYBI3u
+OnM8fjD8uLXOrXtDtRM47o7S7C4DXY9liUeEJ75nPsGbehHzDwGErD9+3t12LDX/
+314q2GFJYJiKVGuoVoTUi0SJAhwEEAECAAYFAlkokxsACgkQCp2vZxO4Y0kBdRAA
+kgE4GemCJW8tUeeiGNHGQTeIb+e+gIGHgIWq7JXgdo5rFlhPbjLgah3a3jzm8y6t
+MncemZP66GR6ytsQnRSobV3AcJ6mS9FncGaiS6tKEIiP5ez8qmNg0nX//mm8UNsO
+Wu+1kJwBhp9oc8nNUKrCgYTwcPVkulFjUnSL+q3/2xdbr9ivJ1KDIiGmg6dsi6mA
+6xqWiPTFEu+2NhnsfEQlp4w1K+29F+0bXgLsAeRCdlx8sb2f+K9TOccNZU4rcm1M
+Pdlw3TqWfpY+rpIHLK/QMBFoBmZajKxFic2O2YDOuN+5sW38hpC1/9ks5XhhHh2J
+3N6IqnmK/55O1P1N64Hl6PbUipsLpH6VammIeoVE5qQaemlv+npfxydMT6tF8Qui
+DRd1lvUG6xypHESGw3S5qaVZIta9T3m/VGKeGi1yo/MrxE6pPIYE20yX2tO6B4bX
+dbwImxxctggGb7dcD8KLniunTRQJwsbpfSpNpRryEzdjlcgp7zJDmM4+ZlLKwQik
+3efxccZXEbO5ICbBk7+CXqKRexM1F/SsUX/L0w+y47Ae/rcgJHbCBi5DCUH35O4y
+wcNMnwsmbLX95AuIVvB7rCI8EyBN/NUqosIopKMLb7O70ej7jU1/K6JboWmCgn0t
+qsiWwQJ7C18N1M4kdRQHD5KKC5eLqgFOy79F2eHdIdOJAhwEEAECAAYFAlkopJUA
+CgkQIXRkoovR3Oik0w//SkSfBZ75S1GyqEHOJQ2LdAFmzFdK8WO2FsaFXwZr84qv
+4mX1VV8kkYQB05L8x6CZjGLbSB8gJhV2HkfB4qid3S0jMRXAR/YhJ+yzwwmMwl+l
+9V+ixajeBveqzyeqKaTbIgCTXq0zZpzt8PrIkQiD/95vtrGfsLo1raCkWCN2WnI0
+8cQT5dG9jH8KXd8oKafGB0BNttFwIFEX2plgFdnYPdWEzz/j9BKpCK0/+1hYj6yF
+3bDH/7+4sID40K+dZOQqS9bGdmQt4Gy0T1Xv9JXa59ia6LRKCaO8aZGbDPzoHn7w
+Yvq1uJ7o9+FCoeLGH4Zvgr3DoM8sDP6pwHBPMyaZYiebRW2PZjcmQL7hzD7FfamR
+HblHOtIdbMEd9fgBm8Me82xr2eQtcQT48WicUeP7vaaETqB5yYVJnn6rntCvot0A
+7jhc0q6+4ClDOPLLeEYzwkB5CR3oF427a8v5x8CkNWkVxNbxrDBzPYkEAFNnzAaf
+2vIfR8iz1E762gq2//oHRC0SC8YAwJypUR6LKMPvkd6I+LuVNQ4XRHsm1viSX68T
+XRT2L9b7EaZ7CKjvslGAHXAKehElGwJfEZI0Hayzqmdp6rHQpFCx9qK70K+hL0aZ
+6Bv+HRg0eg4p05NsGqtzYrKSftYs52qc782GCR2IKw8eMIug0aZdaE5ZGlgs8jyJ
+AiIEEgEIAAwFAlktlTIFgwWk7AAACgkQ861clKZ/cH7Zhg//bYpbj5UgoF8gb0xV
+o0+LCF3gYTjfHBaGaXzkM3S6q6yCZvyQ+8mvsBRZxZ6xTbQrQEXOGc/y7Dyu0+5U
+Mjw71hA5f3YTYrLiBDKY2lhb3w8oL9bL3clOLNMMXiuRrAS87h/FWFnzrBM5kIT+
+ICX26EsY6Q6T9Hr1uw+G8821EdimkrsyV9kf6mbG8g5OeZHACfQCqR7Uw/CVInQV
+JOL2l+FrO2JQ2Bzc2r/krHh3tN5qoSymIAjM6aep9clOcmtuEWU3AloVG55oGyZt
+bUnVHsO1MLodJyIqFoX4H08PdymArngy9mxYOJuK4Vgp1hs+C5ybqQrFkWI3ePgG
+waiUecZyOfofJZ1NcQcblgo7zS+HgaSTjEBikK09FVCast5aBG/DKjTxrh/q2B9T
+3R1yhrnNhcSs3zeAjAYnaQkduyMHjRj1Ccl4B6T+h5+fNhd/5TLTgoHEqAjFq6Qp
+3NQNEWgo/sKLKcV1t8Td2jMaaJfDJagRSv1GC3augdytOZWQrczAyIWaqbAm6yaz
+y3mBVCocbRssxHUwkdaTjXmz1EJXKgw3BQKTV/8vAlMvrdpRyiOak6A31mE4Vpii
+iAcDf2uM5tRC3QPZznRPHLvP9GvexNQRYbg05ouKckutQ1Ua0/IoZfDrbonJsblU
+u9f7g1IyqvirZeURjCQnvVj0YK+JAjMEEAEIAB0WIQRFvr7slQq9Bc8O9cNQoE0M
+O2UX8gUCWzegsgAKCRBQoE0MO2UX8v1mD/4gEPtKRqCK6PNSuAxsUSSvLACbbnap
+fostVG/C0cThAmKCd7MYkCcyg7DBxOMFY/NBEIYxoksCA/TiH0Ld0N6o+smwH6NL
+P/VVrN6Nlw40Rrfh0W7KaV1x4/xhLUFY5W0yj/GQGhmKFZv1IcOXcTEYl2zAMZGD
+j7lKcaCE5nOFE8sLli7OM574+Lt0mNxcz0X+cjqPbGTykAUNYbe3miwQ6XhfGQZy
+jPxr3Np6XggULiWwoqQKA0zVLsKs3HhQGV+y21gaKelD6HXqJDHsLDXM8Fc1p2pK
+rwvtfXJ2N6VgncJ610g3xkuWMtTk2roEwK38l2FkW7tosujT+NrQiU1OJSmEUnRn
+v7QozYYqgLP1ZI6+z1V4rANv/fhemyLr298UpMiNICieo1ADSxVQIInSjPGdVqxc
+xhVfT6IzL5BKWfNCx8EvBkTlN/1taIgOpiCnMF/EAYwXhgr3B2NAEJkA4oxfBMTN
+qRLHO9WfUk8aqONXoj2+BzfMVzLbwNhgRiGYjBdrdAcjq6fwt0ANTXFGg8UMzhXs
+WqM6VVzJ/HKwmp9bgOwAfXXl4Ybbt1XnSco+yGNV+kTUIC4A2qfRCdZNRIZWbNlF
+4okrfQb+/IFyh/qdBMDqeTc2Z0SQthED7Q4hblPxnWR99r5SIBGlksvluVPi0zLl
+2WjM+eC5OTVJ7bkCDQRYanUjARAAs8BaEB9TCS591GBfr4qhPMsPwhEk5FNWi6CO
+bFwUgOMCABguQpiOJAr2/9cSRLCKrRCZDSUp2txoEfKL+TSCZsfjKqoXpgygzSUt
+CCrxZHrDZP5IXbdM1xe8CvTus2N1xOpYf7rAfP9+Jh2kdFpFOU3eJAoBIRSUCHjn
+zyjGhvN5a8Yl3rbUQSH5oZXV/tSyEcKKmDjfgtMKqXw7QHsnGGzkwq4wK1LGJolJ
+M4Qdt13U4r3v/gVJb0S/YqB2/qea4h5e2H05dL3KjimHTn0nG9nfJaoEGS7WaCs8
+knciKLljq4kUG+NCP1DI1blbRsn7oVmJCB9Kz8FcKQAXeZBsZAZCZa0hRj8df6Np
+DsduIrHsRjOFl4eelgfCvikDFLVRCR2kiFN37sCLXHSB6BtV3+kVyR1vVoMPzEmW
+CYQ3JVcH85xyNg+RxUvoUSymwBdRtSFWrl2QW12zoXD8iAD8LkxXVC4Zz4nruWRh
+XrUXw/frfea27qSjLeeC78eHBvEduy7yS/Ol/Sq4T5uFnbAy/ZSrPK4hFJk5YmY5
+m042Q/f7ayHMT0Ch7X8LYKEJxZt2njGuxzuJVKPCoBEIh6hW0EOFmkK7orptd0pV
+00YBhmbqnRLVhDHUxCMvt3NUkz0dApKK7gcZTwnvwjn/F059odxKMkVpzXjarnRK
+1at+DzsAEQEAAYkCHwQYAQIACQUCWGp1IwIbDAAKCRA/qtLNXsuzFCkrD/9jMizh
+4cl/GbGs84G5JPY3Tp1fX+Ar3f7kCu/HN/EeP7X4iVrSGyYEUeb9fGWzu+NgBcHG
+OB+Qvb8JkfCW1NpaPkA/Pr2WRYrtlS6Ea58q0w2sX0aO/lLAK0Je3T0MNhGs4Q2o
+LsmzFWGNCZKy7tQuDpJg2EnRd74x9dQAp0Kcxoaf5OBf2fnKW6WM0N1wE1WLE3IM
+CpOHTluh1zERw2RWVVXkrgDjl8l7isYE3E4Pdp1LZQEWnaCqMaGhUta/k0YvR3MU
+v9oBxDFF/4j16M7Rm4cXFz6a+aexXZI3jcK1B9ZABFBoapqcSyfyeteWPpY9Wq+b
+tKGczEnH/zrJoaLpD4Wq9Phmw+ZOhbGVNSocyIMN6jOJ05P0W8ZgE1atwOQGV5B4
+Tm2EdCYi0lB/8Brc/Ok/0LsiY6P8VKkveLWp2Fpg5P0Rndzaq9EjvOkALSnst0rh
+bCobugctQhGyqTZYOZBsQxUL9Ktc3t8FPGmVaoVfcp/mhfN3gg9ZCV/JVYuhX9vW
+S2Ao56SCqdZkotOEOBr7uQMqJvpdcr1WL+mqJGAzhXuOPc3/7mJMUv6or36haPtk
+MHa1Yjzaw2kkF5Dz0+xEQ4YsPyq+fgQ7Hhlkv3Vyfo3UrxVsJK+wRrZwFfBJsP7Q
+lF+5G+lrwILgoMWRtTc1vbp0S9Y/P6OkLcGdUg==
+=VUSH
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7A8860944FAD5F62
+sub    C189C86B813330C4
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+WxZ/desi/+eJ8DKd5ff/SE7/
+=G87i
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    1DA784CCB5C46DD5
+uid    Rafael Winterhalter <rafael.wth@gmail.com>
+
+sub    7999BEFBA1039E8B
+sub    A7E989B0634097AC
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+=qLMN
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    B0F3710FA64900E7
+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/YHtLABEBAAG5AQ0EV1tJ8gEIAJVavNan
+4WxxlwLwvnBj3/wcEWqN+kfMHENMSjmRWOYSmC332hhGLmTDi++BPWt2OOvHUusJ
+V8dZP5D9yUBRFsKozIpyXyS76C5VYGMY8WZ6kyqn/mLCiwmnkOJ24kXLaaHPsQjv
+6i5f2KliDVhAGUHmNMJgH8o/GL7zZ03Mb8ZlKFZobp0dn+/lxoOtQSzR+cBz8NvM
+BkOKD8r4PJA6BxCR1HVEHsq4xSnjr/UZOYvh+Kaxfnop7Rn9in5MoY2rCY+PV59X
+bx4grqNpjupyHEf1MHodJRj85JiClnLZk7dNJ/kr+zggwbsd12/GHkBt/pxuWhe0
+eFcAOJmvqC3c4pUAEQEAAYkBHwQYAQoACQUCV1tJ8gIbDAAKCRCw83EPpkkA54FA
+CACFZB2Tk96FQkr8+WHOz93CJs4UD88PosLaKmiXKP68arjH3y5jhNLBzqteZo0C
+rfw75DYWIZChdf5uLGKCWXBEytF4uoHOy9Lv/3emoSeenluFVcNjL7CIOQDRmqw1
+t/LjnsLbgvlwHix5f7I6Txu/J0HKJbq0XpoTqCzFK6sxEPHH3gZto+XfHk85haKd
+73SOM4edkmJx+jDXES1wb3K3SpYibt+uPVfLYXWxK7xAaztESTIqZ9RnYHzd/7z6
+DO4z//lfB7IVAqvM8ga7Qj58ObeqZxx2iVit5WUZ4cE30crNGyXH/HKlAp+B9EvE
+Nnwr++TI1CGYthPLFHFc831L
+=57TL
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    7C7D8456294423BA
+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
+MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurkCDQRL7GcQEAgA
+thrbFDDbIGq97dbX1ZEwNGpjILdeumxZzaCc5PgldHGA86TL2V9iPpONJtv7/Csr
+1c/rvH0IA/BFu+0Kde9UP+z9JycmfJpIsd2Qtxfhn9R4+Td0VtN9NNkpt1+JcThb
+zyQq4UU82uBKwSG/wzubOI4Fn+7ypIuNgDkqK0STIL3ucKF/RV77PsOBeLHkCGKI
+VhUUfY1D51BWZKKB1efaVK7PLdnsi64lAhbaexA43dwUUtVwQOvDzJVtkycV2IMw
+XwyHonlK+4vbcwIH2BAU46LIZy+VFaI+lNNmR9+xeWH49oJYnMWIXif4RzvO1ag2
+KKwlG2sacuVTtpWVqKayBwADBQf7BGl4POKtluAbX3a/KGnX1YyibPT2e4pdOxqb
+KTwuRc7ILIK/LVcejVuLd+eOF1QmjToI7Y3qjlzvtaxSemfkxbIQpdus0SyHEEAG
+H/qjNuTs8ZwEl9tPPrKaJHbJ9kQrlDPwkufA0NDAXTE76UhcHPY0DeykAKEw2rav
+EqI7Y0nXR2WSmRLFChmQ+aNTm/9UGI/IoRdS/dgo1eaLD/7RLFeL5tGDe+2nj+B6
+j+52nZEmaRCWWU7O9jYL1cQu5WTurtneCLtIqehLsjuVz9ihBysYuUcTOV/6W0AI
+clQoMEiFR9Kyv0owDk6LtX2DgibJuAvvLlnajsiGm5nyVh3G1IhJBBgRAgAJBQJL
+7GcQAhsMAAoJEHx9hFYpRCO6iXUAnRcLw17lBhe/WcKFRkzETSxaJcjIAJ4/P1NN
+On/eScLdx27sje7q3sBENw==
+=TzHJ
+-----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    164BD2247B936711
+uid    Marc Philipp (JUnit Development, 2014) <mail@marcphilipp.de>
+
+sub    EFE8086F9E93774E
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+Qw==
+=iceo
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    BAC30622339994C4
+uid    Chris Povirk <cpovirk@google.com>
+
+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
+02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG0IUNocmlzIFBvdmlyayA8
+Y3Bvdmlya0Bnb29nbGUuY29tPokBOAQTAQIAIgUCWUwTFgIbAwYLCQgHAwIGFQgC
+CQoLBBYCAwECHgECF4AACgkQusMGIjOZlMRhLgf/XwT7Pad1tB0h0AU/AKW8lOge
+5zuCz1Pb2GZ7b1VKeENMbYFT3nEzeZ1huylxv3IRimmzylYBditoCNRhwS3m1sGc
+gdztnoTEKqR1btCU3cCxjOzB8rTwxKVDNRJkZgCi1taOcg5OBlQGmuJCLg/ZHkFQ
+Cv8FgRAvsep2e1/xYoedaorMFVlVAxgYOXgzCVGUOPExbU+IZvdGoeGp7lD/+8Z9
+8V41B6D9LuZRf0UVxwzJCXxrPjRGRzAgjhAnQXq4UnD1ECi5x84z6JFIxxLm1RfS
+4czXxwT+k/RQjp/m01P2NZ249nzbQ8gDQA3llt2tjA1Z430VN/KPhZfDGWQIxrkB
+DQRZTBMWAQgA2YylXc0rxousuBBPKHn75163wLcPdPm2QR2WMc643fX+p0o2B7wf
+q4ofzNdFmyPml3xp2laQPhPMgy/MjDOLOwbDfg72F/UTZc+gOq9Cvf2nWyi9fc94
+O9Elj/skU230OymFVzfFZB82QLsl0w9rolGIUd3fKd9tD7CmV/i19oNWfUlcBanQ
+1IaAy1d+fmLX2EdBaOZE0Ao1At1WfxRzMjxd1UzttLiCIOlAy6RLKOyOACjjrqJE
+rb7x/wHAhF7UlG8XfsF2du9OD93OiLX8Ti6TBUkPpgTYuUPDN0aej0rE+VGy5jee
+eF5WCNusYnZcpEmQiTztwwaHjVUrDovi6wARAQABiQEfBBgBAgAJBQJZTBMWAhsM
+AAoJELrDBiIzmZTESIcIAJBWIY4eLQGhnvxknPovjxg0zHx9J1K/dgnzciHWfkNY
+ImCsNXlLf951iKeShUjQu6zLcx1+1GDo5Zpg645N/oxhx107+ZjfreOIwHJ/1SHc
+OqriwqpUtGdlsCqAPWh1GiPY2QRB+AQf8fglFWvGq7MAqhbAmHcyFj6RqNglEnJZ
+9zX8GbcGPW1wwaUZ4hB+BaF54yDeTGvEn1Nc+pWLpVU9o8ohTmLyXjpL5aDe68yz
+y8LdfM4i+FjpzCC4m/1SSNnAYNIj3nbAuqdEQzLSAVn44AHSomlgzecMR6RZk/fw
+bzSSiOc3rW1mNFOG70iLz9v4/BJb6dbcSlBl0upm05Q=
+=JITE
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C51E6CBC7FF46F0B
+uid    Ron Shapiro <ronshapiro@google.com>
+
+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/ABEBAAG0I1JvbiBTaGFwaXJvIDxy
+b25zaGFwaXJvQGdvb2dsZS5jb20+iQE4BBMBAgAiBQJW4EmwAhsDBgsJCAcDAgYV
+CAIJCgsEFgIDAQIeAQIXgAAKCRDFHmy8f/RvC2QHCAChHSed7wRyJS6cgRNk4Z2F
+oECztmirxmU+OolCsxFOoQp8akb9nAxhkssGu4UptvmNzRdFXp5OvTbNS9/sY1Q8
+USr7dJqU5imNYgUuz+8/I8RTieEs2I1pJkk1qT0oK2NcGjXUFkIQam5DvBoCOIs3
+Rm8Z8dy7Gfg3lSXNrBjOLTSd1cRe6kcgmVorrZEUaPg5VHEDtWVFE/h1GMoZo8bq
+uI5Jtwvw/T7hp7EDgczi4BXCUav/M2JsynSgG3EYnfv9g2JVLqnINrezVZ+06Z9Q
+Mfiyy0Yo59S/FQ4cNQ0JkBs0LtcOaXeG5gxHgm1sM7Uzn7eVfF9nFpXsmMY/XF4f
+uQENBFbgSbABCACxPdPzyrpxDrtgfkBhlfXtIyTJVvq7NwVejSPWWkcNFL8tMTfo
+6oTLMgswfD9Y6E2SlLJivabWj5TLiq02kP9BmD4unD+RGpqYcr4yvJYy4YULogMb
+e88L+/L1+whqkVBHALM7CvBTwQFxEbEoreuta46eAIu9XMkIPGDlw44YrLB1pp3h
+fEyd8iLaHI+CsQyi8aGPoReuHqW5IyJKX62d+Il/M3WTEQjSZYfqEx3v8bpWC0A2
+4JIEGvmOoJyplGYtEBlNNZOnlsP1N8jguvfvnoYmHGWEtHVqTxPx+dUYs5+0IqRX
+hX07ImvY5Bo8zMihxo7uulEUPKJHeBOnr9zfABEBAAGJAR8EGAECAAkFAlbgSbAC
+GwwACgkQxR5svH/0bwtXNAgAsuPW+B+mc2O9QKPSR0UaUGdlUlZPusT25a9QzqMr
+Qwv84VSnpHqxOzgRLpdFDqs1MizcJA4h8vuT0Yumarma/OT5WlVeY+g5Lmf9JXC9
+6H7L7UItQ8Hdav/Uc3nUlI42Nzopj1g5AwSBsgV6IccdQcUSAL5UZ5PWoGqX2wHc
+Lb+nI2MVtEw3D8eF1vN/ZzDdwjBFrZSNRoShmIuZ7FMO93LaUqvXZt6L/OcpBTqg
+f47r03D6IjsDxPuqNDgk2aOtFcD1H7+7qF7ZKy1SdAdOpnyolIGb2qqaWA4vSK4X
+B2qzs/DA9jq1Et8+K4k7C1RD8GPl3dOkMnpjMpx6qXA6Zg==
+=2mGd
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    A1B4460D8BA7B9AF
+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/Kz8FkMr1efof7Bx4mJuup6wQXonRMVBqpLABEBAAG5AQ0ETjBo4QEIAMQ45a+j
+mpILPuXeTXCGKSf/EuQSFGlZZoyqGhSaAMuOls776WkwtNto7NWUr6zPMJUsUpPp
+A+vxQCcNqScEYFa6JTmCUJqi6oEwNkEjfpXlqNMfIAtfkF866rgjne5v/ofBR1A2
+sXNvV0Pu/h7Tb7EsWPXbQ84EBl4z10qaVQkogzctSLiAMZhABUsaJNdhpcav59gx
+cejp1Qfub77dAvJ0OsNIUAECj1Jju3zWr+ZWTHyoEfeTa7xdR7uVeg2b6W14OvjV
+nwPC7AmpqQEa6Luas8uu4W//iihh0wzDr2WZRsOqEpz54KpodOkKmOz+DylZDqN1
+W+vtNpbcmfeUYJkAEQEAAYkBHwQYAQIACQUCTjBo4QIbDAAKCRChtEYNi6e5r9m9
+CACOaQ8y7QRsWIZjta0g4GPiWO2QK+LK1v+yumXNEZlr+PCbGTn+0+/JCK4n+o6x
+fmcAS63T/d7pjK/Wif5iYJa/tKGoNGVYRFuiW+3YIkZ/BffqnArOpcqMwBvNOaFt
+pVC5MKkidcTbO/b/UbTlpSOa7i1W0u14Rr9Kh/pctcaSLmDszb6ToI9aQtz7/jbi
+9oay1GVYNbzPXgjN0w1Ww8iWa8SnTHpjEhhx7F1h7Z/LeAU/PJInHuMHg6vBgZdQ
+8fgKTtfoh4++/ZzF9Q632sbSS00ah/X4R3rCEprXvHz4snRk/xwgParilLscjeFu
+lMLvlKL9dnBldrACPh+aj4Re
+=Qq2e
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    C7CB325467893CC4
+uid    Marc Philipp (JUnit Maven Deployment) <mail@marcphilipp.de>
+
+sub    BF07AD5B93D4BEBE
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBE+VqAwBCADvIJMQYWtHnfpfI9IB9WPd+Fd5xlFT7R9trJEfQGA6TDH0IsqH
+0CXVLJ4fa+PiWfkDELK6b1qsGg52+mbzZzkbH+XAsX81sMEF6j5H4pjE9KPB8xAv
+tyuII8tNDwUjGSssw2UIHZpXMJESo1d0TCjd0K5iJ7vqVPAXXmOmatHM65jSE8JQ
+FlsKa87HdQ4u0VfM4DqI3fKNh6Ohwbnv1JLYCgm/Z6fD5SdSUcuGhGe2Ob1yn+mg
+Eaewsi/xmYlQwt4i7Uhibla4zy9jFTFVlvySFxbImj3jVcLZOGPgUIwiwUUMPFga
+H+Fpc1aw2pFcWqqn7QuIAt9qtwfe+J6acKl5ABEBAAG0O01hcmMgUGhpbGlwcCAo
+SlVuaXQgTWF2ZW4gRGVwbG95bWVudCkgPG1haWxAbWFyY3BoaWxpcHAuZGU+iQE5
+BBMBAgAjBQJPlagMAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQx8sy
+VGeJPMTpFAf+Pc5K8RM65SCmYiyzsLY/S2RWn2IHmN1RQsTEKyEkMQ3zyvt2b6IV
+kte/ZBKfc+DROLR/qH0OXd53ENTREjxCd7HnV511vLy4OG1yWQERg+CQOGTVD6Up
+r61x7K+Vp9aPWjXyEr9k8jWbvLavCLksXNameqGZLFH6ZxdF61iKAxvlRl1N7qWD
+P73daVGhimFGk16y3jkfcjZ8VEipJs/bVnj+z/sThmsrXrCNn+nT4ez63s0uI3ch
+2qYvBGT9Pu8OUG3LPWK8evk5kRr/HsTMRa9CLnnmSE5B1eIxgvwp4ZYkgxs/JVyb
+ZC0xWu5n0zU3zff7dH2SrCxwyDeqmBqvDbkBDQRPlagMAQgApQTVPSZufl0VkELc
+6upqQvLvYcWN4O9tOdDXb8TEmfMArlX4h+6AbHURMoplMVN7shAiUVQA2QrK7pe/
+qDFvd32cYSaptsme8Cfo2zhpVF6WNQ5gY4GpgxxikNgwOoiFEYVyL9wUF2qWFv75
+9oiFJs/wpbVZKju8XMidoFQlvz4TXQjClzhhOFOGqJ3/P5koGLrwRl24PtVQUKTr
+MLPxc/n7PwLyGZ3zX7pbRb/ZcUqqe0fpyFQzpAOOBX6CrYXYJNweR9ymaqato2vN
+aGg84lx7f/56n7g/NnxTAW/UeN+WSz1Wx0h2eyOLkzlOMsDCQ01eK0WBgE9hE3Vq
++fzLUQARAQABiQEfBBgBAgAJBQJPlagMAhsMAAoJEMfLMlRniTzEt4wH/1lcB5OZ
+Kq/ATZtN5U0xlS9bUcSPVW+HoyqM5A80xfpxaHjKhj4ut0XEYLsco/0/F9ocno2b
+/pxVzdajaeNLUgskjvUMc9zUDQCH48XUj51IjTon+PvG9EZbLufu4jIodNNFzW9Q
+vTq13C9TtbFED542h9GmKZQYqbWAtjEh+66mgdysbyRERjLaC6rWCUXKGr72lN7Z
+jsDqguBsjHhJLTTHsYDdMitGubT8ojjz4Gj2ry+HtQQ7jheh4FV6adbU6xq8NZis
+yOVw1673zJ2quVdJ2W+dR/MEg7Q9NMrsgrqZwt2mTmbFpTS0izQLh7Q+DL64mizt
+QH04yffdzFyfppo=
+=h2wg
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    476634A4694E716A
+uid    Simon Mittermueller (none) <simon.mittermueller@gmail.com>
+
+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    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    E3822B59020A349D
+uid    Kotlin Libraries Release <kt-libraries@jetbrains.com>
+
+sub    9351716690874F25
+sub    3D5839A2262CBBFB
+sub    60EB70DDAAC2EC21
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+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
+dED2cvmydAtUu32DbR29bHQ=
+=vQ+m
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub    DDDAFA7674E54418
+uid    Cedric Beust <cedric@beust.com>
+
+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    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    6A65176A0FB1CD0B
+uid    Paul King <paulk@apache.org>
+uid    keybase.io/paulk_asert <paulk_asert@keybase.io>
+uid    Paul King <kingp@ociweb.com>
+uid    Paul King <paulk@asert.com.au>
+uid    Paul King <paul.king.asert@gmail.com>
+
+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 <paulk@apache.org>
+uid    keybase.io/paulk_asert <paulk_asert@keybase.io>
+uid    Paul King <kingp@ociweb.com>
+uid    Paul King <paulk@asert.com.au>
+uid    Paul King <paul.king.asert@gmail.com>
+
+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 <paulk@apache.org>
+uid    keybase.io/paulk_asert <paulk_asert@keybase.io>
+uid    Paul King <kingp@ociweb.com>
+uid    Paul King <paulk@asert.com.au>
+uid    Paul King <paul.king.asert@gmail.com>
+
+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    5208812E1E4A6DB0
+uid    Gradle Inc. <info@gradle.com>
+uid    Gradle Inc. <maven-publishing@gradle.com>
+
+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. <info@gradle.com>
+uid    Gradle Inc. <maven-publishing@gradle.com>
+
+sub    33AEBC1F01C98081
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: BCPG v1.68
+
+mQENBFxaxWYBCADI4/gRCJYfXwZYdUoEGlAlCfRgABy90rvebzcs8MKtolAbPVkG
+iqnjftXd28sZhEDx9YJrUfmzspdrYmU7hy1kgV1/WGIcWyTExTH3bqlnaIWnnTxA
+HD0x4NJ2AzmX5VO8LxhqGID+BErrv7uGZvVmJT6trqUIcKeNEq7mzdDJKqTBY4cw
+q+Dm8P0vs4IFTD8q5f1Vr78FmUth2srIBmsIH1wNV1nAUTmQppNBFlCmcvnWTYI1
+0UMcsFFrJ2pFT1yP2AEGUNl4Lgj4hmVHZwX38/lu9pQ7iWtHSLOwZsfuC34/goS+
+ldFt63JqDV7ZaqwAgk7Iq6jbr4pSVsB4VdglABEBAAG0HUdyYWRsZSBJbmMuIDxp
+bmZvQGdyYWRsZS5jb20+iQFOBBMBCAA4FiEEMU/oLlpMU3e8ou3sUgiBLh5KbbAF
+Al6+3fgCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQUgiBLh5KbbDr4ggA
+tmAjpH0VPImxcfV+by6itQkY6BQQ0VO9adO9Q/C7JIaiPQ8Rz+2f1SzAtLB/44SZ
+4mseP/Hb5CQEAysRPd3/3GP56GXzXgGURT9/4j/1RPyHIndBd9mmvd9L9+lKWMbZ
+Y7JzPC4Ew/2WPeB3GVsOgn+sMBVHZcVDATqZ5OdfSmuIil7DueWSPUNbFFJkLy7P
+6nkRkk4GMRXSlAjKOLNNQV41cUChqAqf8Yj1sD6cX75YZylsm9voV6JoR2u8lAfT
+zr1VPKdy9xLfDh9Fizth7r0t3OmrUvlEey2IkOoT5cUl/2/jPaz/ypVw4G8nbzW3
+0lyW43RWIIXZC8WAMRdWUbQpR3JhZGxlIEluYy4gPG1hdmVuLXB1Ymxpc2hpbmdA
+Z3JhZGxlLmNvbT6JAU4EEwEIADgCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AW
+IQQxT+guWkxTd7yi7exSCIEuHkptsAUCXFrGIQAKCRBSCIEuHkptsDgPB/9OUCfN
+Je6RYhkj7GR8Kl5EFv/f6YZCpX48qrzD1OYIBOwgn/Pe7fdTEvUbQ7OCgYeOGfC3
+02kwrvTSroLw36JMsKRg4SBD9ZPTqXpJ+kpuRay4ALB1uwMSpG2EQECCvKOEa/bH
+QQq7USjF6/Kn43Kge1wlASmUeTDjQdtZlf8u1UU27WFCUz69nFmozb2mvAss3lYC
+JOE4WrOAng9S6M/Z6jK1wODCV7/oPXj+aGUCfvj4cX7M6uV4vJX8ZNMmK5S1mELk
+a8BQHCPtFoNcaff5/nHzRVnOYQ1UAz/BqCIVFoBCFCiGAn3pRbcoRp8resuhJA1B
+QG27jVkxZ2Xy/asiuQENBFxaxWYBCADe16jph/XeYDGdbg2WhAZTpoxa1xMBti29
+uLMXQTRJx6mq2FwVui7gUY375hBTSPN/sS1zSGYf+DGbNFhJ0DvaVKbnyFbUiS+R
+jUlBSf5VP/00KwA/++dJ8FvkvkmQL6C1+DbqkgEl2YBA0Ar8hhTYLiAMqnxaIk/s
+O/szoi4Q6eNGaQy8fB3IWMwq9MmWdLKV2mxzoRxeUXnnNCfjE3RzMP9t7TWIfwHV
+JsVQskbV29eYdNAH6dNUGRj6ttFQgFWrP1mhy5N8l4tnocOVzF9umM9fY08lWqEM
+oBWae6G6R67modMyBQCnEDeogKnPGSnQ2IvASmZ8Qeb/zZpJkxcJABEBAAGJATYE
+GAEIACACGwwWIQQxT+guWkxTd7yi7exSCIEuHkptsAUCXFrGrwAKCRBSCIEuHkpt
+sEXdB/9m9GutEADMthk9kQi/Zd3RNt27qdYDGlGX9iILeoNJXM8m9piNzE92kNhI
+W2k2Yupuh69OpKP11E1EzGbdOdbwB2yKIhCOJxNb2QiZoxikdcD4vE2n0e5SgSq0
+H2pDt4v9Dy0pWOtyyi3muo+P28k/IgY4nRd3DR2FaBiXXl863kpPt8c1aTo5y2u1
+qDWfNNPtpkfmQcBNOigT/jrqzHjgeTRqtSPWppPl0H0bElerBcTBK7+AX7wLkXtl
+CgFZ7fWs32+gMhKJXVhsefwgjAfKBIRS7oOmZtmlWA6gC2HXpXkcn4xDOQo1wc/Z
+bMFjyklLBAm1WETBiqR+k5uwXmJ8
+=RGVX
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
new file mode 100644
index 0000000..45552b7
--- /dev/null
+++ b/gradle/verification-metadata.xml
@@ -0,0 +1,211 @@
+<?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="^com.android($|([.].*))" regex="true"/>
+         <trust file=".*-javadoc[.]jar" regex="true"/>
+         <trust file=".*-sources[.]jar" regex="true"/>
+      </trusted-artifacts>
+      <trusted-keys>
+         <trusted-key id="04543577d6a9cc626239c50c7ecbd740ff06aeb5">
+            <trusting group="com.sun.xml.fastinfoset"/>
+            <trusting group="com.sun.istack"/>
+            <trusting group="org.glassfish.jaxb"/>
+            <trusting group="com.sun.xml.bind"/>
+            <trusting group="com.sun.xml.bind.mvn"/>
+            <trusting group="org.jvnet.staxex"/>
+         </trusted-key>
+         <trusted-key id="0785b3eff60b1b1bea94e0bb7c25280eae63ebe5" group="org.apache.httpcomponents"/>
+         <trusted-key id="08f0aab4d0c1a4bdde340765b341ddb020fcb6ab" group="org.bouncycastle"/>
+         <trusted-key id="0cc641c3a62453ab390066c4a41f13c999945293" group="commons-logging"/>
+         <trusted-key id="160a7a9cf46221a56b06ad64461a804f2609fd89" group="com.github.shyiko.klob"/>
+         <trusted-key id="190d5a957ff22273e601f7a7c92c5fec70161c62" group="org.apache"/>
+         <trusted-key id="19beab2d799c020f17c69126b16698a4adf4d638" group="org.checkerframework"/>
+         <trusted-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" group="de.undercouch"/>
+         <trusted-key id="2bcbdd0f23ea1cafcc11d4860374cf2e8dd1bdfd">
+            <trusting group="org.codehaus"/>
+            <trusting group="net.java"/>
+         </trusted-key>
+         <trusted-key id="2db4f1ef0fa761ecc4ea935c86fdc7e2a11262cb">
+            <trusting group="commons-io"/>
+            <trusting group="commons-codec"/>
+            <trusting group="org.apache.commons"/>
+            <trusting group="xml-apis"/>
+         </trusted-key>
+         <trusted-key id="2e3a1affe42b5f53af19f780bcf4173966770193" group="org.jetbrains"/>
+         <trusted-key id="2e92113263fc31c74ccbaab20e91c2de43b72bb1" group="org.ec4j.core"/>
+         <trusted-key id="31fae244a81d64507b47182e1b2718089ce964b8" group="com.thoughtworks.qdox"/>
+         <trusted-key id="3d11126ea77e4e07fbabb38614a84c976d265b25" group="com.google.protobuf"/>
+         <trusted-key id="3d5839a2262cbbfb" group="org.jetbrains.kotlinx"/>
+         <trusted-key id="44fbdbbc1a00fe414f1c1873586654072ead6677" group="org.sonatype.oss"/>
+         <trusted-key id="476634a4694e716a" group="com.googlecode.java-diff-utils"/>
+         <trusted-key id="4db1a49729b053caf015cee9a6adfc93ef34893e" group="org.hamcrest"/>
+         <trusted-key id="4f7e32d440ef90a83011a8fc6425559c47cc79c4" group="com.sun.activation"/>
+         <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="55e770230e69cc6de143fb5b62c82e50836eb3ee" group="com.github.gundy"/>
+         <trusted-key id="694621a7227d8d5289699830abe9f3126bb741c1">
+            <trusting group="com.google.guava"/>
+            <trusting group="com.google.jimfs"/>
+         </trusted-key>
+         <trusted-key id="6a65176a0fb1cd0b" group="org.codehaus.groovy"/>
+         <trusted-key id="6bdaca2c0493cca133b372d09c4f7e9d98b1cc53" group="org.apache"/>
+         <trusted-key id="6dd3b8c64ef75253beb2c53ad908a43fb7ec07ac">
+            <trusting group="com.sun.activation"/>
+            <trusting group="jakarta.activation"/>
+         </trusted-key>
+         <trusted-key id="6f538074ccebf35f28af9b066a0975f8b1127b83" group="org.jetbrains.kotlin"/>
+         <trusted-key id="7615ad56144df2376f49d98b1669c4bb543e0445" group="com.google.errorprone"/>
+         <trusted-key id="7616eb882daf57a11477aaf559a252fb1199d873" group="com.google.code.findbugs"/>
+         <trusted-key id="7999befba1039e8b" group="net.bytebuddy"/>
+         <trusted-key id="7c7d8456294423ba" group="org.objenesis"/>
+         <trusted-key id="7faa0f2206de228f0db01ad741321490758aad6f" group="org.codehaus.groovy"/>
+         <trusted-key id="8254180bfc943b816e0b5e2e5e2f2b3d474efe6b" group="it.unimi.dsi"/>
+         <trusted-key id="8756c4f765c9ac3cb6b85d62379ce192d401ab61">
+            <trusting group="org.jetbrains.intellij.deps"/>
+            <trusting group="org.jetbrains.kotlinx"/>
+            <trusting group="com.github.javaparser"/>
+            <trusting group="info.picocli"/>
+         </trusted-key>
+         <trusted-key id="90ee19787a7bcf6fd37a1e9180c08b1c29100955" group="com.squareup"/>
+         <trusted-key id="9a259c7ee636c5ed" group="com.google.errorprone"/>
+         <trusted-key id="a1b4460d8ba7b9af" group="org.mockito"/>
+         <trusted-key id="a5bd02b93e7a40482eb1d66a5f69ad087600b22c" group="org.ow2.asm"/>
+         <trusted-key id="aa70c7c433d501636392ec02153e7a3c2b4e5118" group="org.eclipse.ee4j"/>
+         <trusted-key id="adbc987d1a7b91db6b0aaa81995efbf4a3d20beb">
+            <trusting group="com.pinterest.ktlint"/>
+            <trusting group="com.pinterest"/>
+         </trusted-key>
+         <trusted-key id="afcc4c7594d09e2182c60e0f7a01b0f236e5430f" group="com.google.code.gson"/>
+         <trusted-key id="b0f3710fa64900e7" group="com.google.auto.value"/>
+         <trusted-key id="b6e73d84ea4fcc47166087253faad2cd5ecbb314" group="org.apache.commons"/>
+         <trusted-key id="b801e2f8ef035068ec1139cc29579f18fa8fd93b" group="com.google.j2objc"/>
+         <trusted-key id="bac30622339994c4" group="com.google.truth"/>
+         <trusted-key id="bdb5fa4fe719d787fb3d3197f6d4a1d411e9d1ae" group="com.google.guava"/>
+         <trusted-key id="c51e6cbc7ff46f0b" group="com.google.auto"/>
+         <trusted-key id="c70b844f002f21f6d2b9c87522e44ac0622b91c3" group="com.beust"/>
+         <trusted-key id="c7cb325467893cc4" group="junit"/>
+         <trusted-key id="ce8075a251547bee249bc151a2115ae15f6b8b72">
+            <trusting group="org.apache.ant"/>
+            <trusting group="org.apache.commons"/>
+         </trusted-key>
+         <trusted-key id="d6f1bc78607808ec8e9f69437a8860944fad5f62" group="org.apache.commons"/>
+         <trusted-key id="da7a1bb85b19e4fb05073431205c8673dc742c7c" group="org.apache"/>
+         <trusted-key id="dcba03381ef6c89096acd985ac5ec74981f9cda6" group="org.testng"/>
+         <trusted-key id="dddafa7674e54418" group="org.testng"/>
+         <trusted-key id="e0130a3ed5a2079e" group="org.webjars"/>
+         <trusted-key id="ea23db1360d9029481e7f2efecdfea3cb4493b94" group="jline"/>
+         <trusted-key id="ee9e7dc9d92fc896" group="com.google.errorprone"/>
+         <trusted-key id="efe8086f9e93774e" group="junit"/>
+         <trusted-key id="f254b35617dc255d9344bcfa873a8e86b4372146" group="org.apache"/>
+         <trusted-key id="fa77dcfef2ee6eb2debedd2c012579464d01c06a" group="org.apache"/>
+         <trusted-key id="fa7929f83ad44c4590f6cc6815c71c0a4e0b8edd" group="net.java.dev.jna"/>
+         <trusted-key id="fc411cd3cb7dcb0abc9801058118b3bcdb1a5000" group="jakarta.xml.bind"/>
+         <trusted-key id="ff6e2c001948c5f2f38b0cc385911f425ec61b51">
+            <trusting group="junit"/>
+            <trusting group="org.junit"/>
+            <trusting group="org.junit.platform"/>
+            <trusting group="org.junit.jupiter"/>
+            <trusting group="org.opentest4j"/>
+         </trusted-key>
+      </trusted-keys>
+   </configuration>
+   <components>
+      <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>
+      <component group="de.undercouch" name="gradle-download-task" version="4.1.1">
+         <artifact name="gradle-download-task-4.1.1.pom">
+            <ignored-keys>
+               <ignored-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" reason="PGP verification failed"/>
+            </ignored-keys>
+            <sha256 value="85e6607260dbbdb5e85f1988840b0d9ac4be9119dde90a1baca8ea775646415a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <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>
+      <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>
+      <component group="org.jetbrains.intellij.deps" name="trove4j" version="1.0.20181211">
+         <artifact name="trove4j-1.0.20181211.jar">
+            <sha256 value="affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="trove4j-1.0.20181211.pom">
+            <sha256 value="310a6aa2d90534c32b8f46f1fc98cd0edae95dcdfca23e2847e5efa9ae0c019a" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="org.jetbrains.kotlin.jvm" name="org.jetbrains.kotlin.jvm.gradle.plugin" version="1.5.31">
+         <artifact name="org.jetbrains.kotlin.jvm.gradle.plugin-1.5.31.pom">
+            <sha256 value="4f0889060231666b899f7e607cc7719b1beb30cc6decea67d34abded13b69413" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="org.mockito" name="mockito-core" version="3.4.6">
+         <artifact name="mockito-core-3.4.6.jar">
+            <sha256 value="1977fb3356258862b8373702de8818fb549f409298b9d4fe8339973879a89ea1" origin="Generated by Gradle"/>
+         </artifact>
+         <artifact name="mockito-core-3.4.6.pom">
+            <sha256 value="f0a883f76a8b484009119fab1319d9a96e1d76ee672cb979c2af5944d54597d3" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="org.ow2" name="ow2" version="1.5">
+         <artifact name="ow2-1.5.pom">
+            <sha256 value="0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <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>
+      <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>
+      <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>
+      <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>
+      <component group="com.gradle" name="gradle-enterprise-gradle-plugin" version="3.6.3">
+         <artifact name="gradle-enterprise-gradle-plugin-3.6.3.pom">
+            <sha256 value="792024ac9c73fb240d1f0e1183adceca3527b97cc4e808fcea09e1b232d0acb7" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+   </components>
+</verification-metadata>
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 7045fcf..4bdef13 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -4,4 +4,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 4be43e7..0000000
--- a/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-include ':stub-annotations'
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..be5fbb7
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,9 @@
+pluginManagement {
+    repositories {
+        // Prefer mavenCentral as that has signed artifacts
+        mavenCentral()
+        gradlePluginPortal()
+    }
+}
+
+include(":stub-annotations")
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt b/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt
index 2eafd4a..edaac23 100644
--- a/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt
+++ b/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt
@@ -16,30 +16,38 @@
 
 package com.android.tools.lint.checks.infrastructure
 
+import com.android.SdkConstants.DOT_JAVA
+import com.android.SdkConstants.DOT_KT
 import java.util.regex.Pattern
 
 // Copy in metalava from lint to avoid compilation dependency directly on lint-tests
 
-/** A pair of package name and class name inferred from Java or Kotlin source code */
-class ClassName(source: String) {
+/**
+ * A pair of package name and class name inferred from Java or Kotlin
+ * source code. The [source] is the source code, and the [extension] is
+ * the file extension (including the leading dot) which states whether
+ * this is a Kotlin source file, a Java source file, a Groovy source
+ * file, etc.
+ */
+class ClassName(source: String, extension: String = DOT_JAVA) {
     val packageName: String?
     val className: String?
 
     init {
-        val withoutComments = stripComments(source)
+        val withoutComments = stripComments(source, extension)
         packageName = getPackage(withoutComments)
         className = getClassName(withoutComments)
     }
 
-    @Suppress("unused")
     fun packageNameWithDefault() = packageName ?: ""
 }
 
 /**
- * Strips line and block comments from the given Java or Kotlin source file
+ * Strips line and block comments from the given Java or Kotlin source
+ * file.
  */
 @Suppress("LocalVariableName")
-fun stripComments(source: String, stripLineComments: Boolean = true): String {
+fun stripComments(source: String, extension: String, stripLineComments: Boolean = true): String {
     val sb = StringBuilder(source.length)
     var state = 0
     val INIT = 0
@@ -47,10 +55,12 @@
     val LINE_COMMENT = 2
     val BLOCK_COMMENT = 3
     val BLOCK_COMMENT_ASTERISK = 4
-    val IN_STRING = 5
-    val IN_STRING_ESCAPE = 6
-    val IN_CHAR = 7
-    val AFTER_CHAR = 8
+    val BLOCK_COMMENT_SLASH = 5
+    val IN_STRING = 6
+    val IN_STRING_ESCAPE = 7
+    val IN_CHAR = 8
+    val AFTER_CHAR = 9
+    var blockCommentDepth = 0
     for (c in source) {
         when (state) {
             INIT -> {
@@ -69,7 +79,7 @@
             }
             INIT_SLASH -> {
                 when {
-                    c == '*' -> state = BLOCK_COMMENT
+                    c == '*' -> { blockCommentDepth++; state = BLOCK_COMMENT }
                     c == '/' && stripLineComments -> state = LINE_COMMENT
                     else -> {
                         state = INIT
@@ -86,15 +96,32 @@
             BLOCK_COMMENT -> {
                 when (c) {
                     '*' -> state = BLOCK_COMMENT_ASTERISK
+                    '/' -> state = BLOCK_COMMENT_SLASH
                 }
             }
+
             BLOCK_COMMENT_ASTERISK -> {
                 state = when (c) {
-                    '/' -> INIT
+                    '/' -> {
+                        blockCommentDepth--
+                        if (blockCommentDepth == 0) {
+                            INIT
+                        } else {
+                            BLOCK_COMMENT
+                        }
+                    }
                     '*' -> BLOCK_COMMENT_ASTERISK
                     else -> BLOCK_COMMENT
                 }
             }
+            BLOCK_COMMENT_SLASH -> {
+                if (c == '*' && extension == DOT_KT) {
+                    blockCommentDepth++
+                }
+                if (c != '/') {
+                    state = BLOCK_COMMENT
+                }
+            }
             IN_STRING -> {
                 when (c) {
                     '\\' -> state = IN_STRING_ESCAPE
@@ -127,14 +154,14 @@
 private val PACKAGE_PATTERN = Pattern.compile("""package\s+([\S&&[^;]]*)""")
 
 private val CLASS_PATTERN = Pattern.compile(
-    """(class|interface|enum|object)+?\s*([^\s:(]+)""",
+    """(\bclass\b|\binterface\b|\benum class\b|\benum\b|\bobject\b)+?\s*([^\s:(]+)""",
     Pattern.MULTILINE
 )
 
 fun getPackage(source: String): String? {
     val matcher = PACKAGE_PATTERN.matcher(source)
     return if (matcher.find()) {
-        matcher.group(1).trim()
+        matcher.group(1).trim { it <= ' ' }
     } else {
         null
     }
@@ -145,7 +172,7 @@
     var start = 0
     while (matcher.find(start)) {
         val cls = matcher.group(2)
-        val groupStart = matcher.start(2)
+        val groupStart = matcher.start(1)
 
         // Make sure this "class" reference isn't part of an annotation on the class
         // referencing a class literal -- Foo.class, or in Kotlin, Foo::class.java)
diff --git a/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt b/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
index ea7dcb3..2b76fd9 100644
--- a/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
+++ b/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
@@ -178,7 +178,7 @@
 
         val annotation = method.modifiers.findAnnotation("android.support.annotation.RequiresPermission")
         if (annotation != null) {
-            for (attribute in annotation.attributes()) {
+            for (attribute in annotation.attributes) {
                 var values: List<AnnotationAttributeValue>? = null
                 when (attribute.name) {
                     "value", "allOf", "anyOf" -> {
diff --git a/src/main/java/com/android/tools/metalava/AnnotationFilter.kt b/src/main/java/com/android/tools/metalava/AnnotationFilter.kt
index 5fc0d37..172c32a 100644
--- a/src/main/java/com/android/tools/metalava/AnnotationFilter.kt
+++ b/src/main/java/com/android/tools/metalava/AnnotationFilter.kt
@@ -45,7 +45,7 @@
     }
 
     override fun matches(annotation: AnnotationItem): Boolean {
-        if (annotation.qualifiedName() == null) {
+        if (annotation.qualifiedName == null) {
             return false
         }
         val wrapper = AnnotationFilterEntry.fromAnnotationItem(annotation)
diff --git a/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt b/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt
index f5bba25..0f4ab87 100644
--- a/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt
+++ b/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt
@@ -86,7 +86,7 @@
                         }
                     } else {
                         // TODO: Check for other incompatibilities than nullness?
-                        val qualifiedName = annotation.qualifiedName() ?: continue
+                        val qualifiedName = annotation.qualifiedName ?: continue
                         if (newModifiers.findAnnotation(qualifiedName) == null) {
                             addAnnotation = true
                         }
diff --git a/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt b/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt
index 94d21b8..5fe2896 100644
--- a/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt
+++ b/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt
@@ -43,7 +43,6 @@
 import com.android.tools.lint.annotations.Extractor.IDEA_NULLABLE
 import com.android.tools.lint.annotations.Extractor.SUPPORT_NOTNULL
 import com.android.tools.lint.annotations.Extractor.SUPPORT_NULLABLE
-import com.android.tools.lint.checks.AnnotationDetector
 import com.android.tools.lint.detector.api.getChildren
 import com.android.tools.metalava.model.AnnotationAttribute
 import com.android.tools.metalava.model.AnnotationAttributeValue
@@ -274,7 +273,7 @@
                     }
                 } else {
                     // TODO: Check for other incompatibilities than nullness?
-                    val qualifiedName = annotation.qualifiedName() ?: return
+                    val qualifiedName = annotation.qualifiedName ?: return
                     if (newModifiers.findAnnotation(qualifiedName) == null) {
                         addAnnotation = true
                     }
@@ -322,7 +321,7 @@
                 override fun compare(old: Item, new: Item) {
                     // Transfer any show/hide annotations from the external to the main codebase.
                     for (annotation in old.modifiers.annotations()) {
-                        val qualifiedName = annotation.qualifiedName() ?: continue
+                        val qualifiedName = annotation.qualifiedName ?: continue
                         if ((showAnnotations.matches(annotation) || hideAnnotations.matches(annotation) || hideMetaAnnotations.contains(qualifiedName)) &&
                             new.modifiers.findAnnotation(qualifiedName) == null
                         ) {
@@ -542,7 +541,7 @@
         var haveNullable = false
         var haveNotNull = false
         for (existing in item.modifiers.annotations()) {
-            val name = existing.qualifiedName() ?: continue
+            val name = existing.qualifiedName ?: continue
             if (isNonNull(name)) {
                 haveNotNull = true
             }
@@ -583,7 +582,8 @@
                 return PsiAnnotationItem.create(
                     codebase,
                     XmlBackedAnnotationItem(
-                        codebase, AnnotationDetector.INT_RANGE_ANNOTATION.newName(),
+                        codebase,
+                        "androidx.annotation.IntRange",
                         listOf(
                             // Add "L" suffix to ensure that we don't for example interpret "-1" as
                             // an integer -1 and then end up recording it as "ffffffff" instead of -1L
@@ -804,14 +804,10 @@
 // TODO: Replace with usage of DefaultAnnotationAttribute?
 class XmlBackedAnnotationItem(
     codebase: Codebase,
-    private val qualifiedName: String,
-    private val attributes: List<XmlBackedAnnotationAttribute> = emptyList()
+    override val originalName: String,
+    override val attributes: List<XmlBackedAnnotationAttribute> = emptyList()
 ) : DefaultAnnotationItem(codebase) {
-
-    override fun originalName(): String? = qualifiedName
-    override fun qualifiedName(): String? = AnnotationItem.mapName(codebase, qualifiedName)
-
-    override fun attributes() = attributes
+    override val qualifiedName: String? = AnnotationItem.mapName(codebase, originalName)
 
     override fun toSource(target: AnnotationTarget, showDefaultAttrs: Boolean): String {
         val qualifiedName = AnnotationItem.mapName(codebase, qualifiedName, null, target) ?: return ""
diff --git a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
index d82139d..98b1b5c 100644
--- a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
+++ b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
@@ -30,9 +30,6 @@
 import com.android.tools.metalava.model.VisibilityLevel
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.android.tools.metalava.model.visitors.ItemVisitor
-import java.util.ArrayList
-import java.util.HashMap
-import java.util.HashSet
 import java.util.Locale
 import java.util.function.Predicate
 
@@ -695,7 +692,7 @@
 
         if (annotation != null) {
             hasAnnotation = true
-            for (attribute in annotation.attributes()) {
+            for (attribute in annotation.attributes) {
                 var values: List<AnnotationAttributeValue>? = null
                 var any = false
                 when (attribute.name) {
@@ -804,7 +801,7 @@
                     val annotationName = (
                         item.modifiers.annotations().firstOrNull { annotation ->
                             options.showAnnotations.matches(annotation)
-                        }?.qualifiedName() ?: options.showAnnotations.firstQualifiedName()
+                        }?.qualifiedName ?: options.showAnnotations.firstQualifiedName()
                         ).removePrefix(ANDROID_ANNOTATION_PREFIX)
                     reporter.report(
                         Issues.UNHIDDEN_SYSTEM_API, item,
diff --git a/src/main/java/com/android/tools/metalava/ApiLint.kt b/src/main/java/com/android/tools/metalava/ApiLint.kt
index 28c37f6..5d26a49 100644
--- a/src/main/java/com/android/tools/metalava/ApiLint.kt
+++ b/src/main/java/com/android/tools/metalava/ApiLint.kt
@@ -52,6 +52,7 @@
 import com.android.tools.metalava.Issues.ALL_UPPER
 import com.android.tools.metalava.Issues.ANDROID_URI
 import com.android.tools.metalava.Issues.ARRAY_RETURN
+import com.android.tools.metalava.Issues.ASYNC_SUFFIX_FUTURE
 import com.android.tools.metalava.Issues.AUTO_BOXING
 import com.android.tools.metalava.Issues.BAD_FUTURE
 import com.android.tools.metalava.Issues.BANNED_THROW
@@ -244,6 +245,7 @@
         if (returnType != null) {
             checkType(returnType, method)
             checkNullableCollections(returnType, method)
+            checkMethodSuffixListenableFutureReturn(returnType, method)
         }
         for (parameter in method.parameters()) {
             checkType(parameter.type(), parameter)
@@ -353,32 +355,12 @@
     }
 
     private fun checkEnums(cls: ClassItem) {
-        /*
-            def verify_enums(clazz):
-                """Enums are bad, mmkay?"""
-                if "extends java.lang.Enum" in clazz.raw:
-                    error(clazz, None, "F5", "Enums are not allowed")
-         */
         if (cls.isEnum()) {
             report(ENUM, cls, "Enums are discouraged in Android APIs")
         }
     }
 
     private fun checkMethodNames(method: MethodItem) {
-        /*
-            def verify_method_names(clazz):
-                """Try catching malformed method names, like Foo() or getMTU()."""
-                if clazz.fullname.startswith("android.opengl"): return
-                if clazz.fullname.startswith("android.renderscript"): return
-                if clazz.fullname == "android.system.OsConstants": return
-
-                for m in clazz.methods:
-                    if re.search("[A-Z]{2,}", m.name) is not None:
-                        warn(clazz, m, "S1", "Method names with acronyms should be getMtu() instead of getMTU()")
-                    if re.match("[^a-z]", m.name):
-                        error(clazz, m, "S1", "Method name must start with lowercase char")
-         */
-
         // Existing violations
         val containing = method.containingClass().qualifiedName()
         if (containing.startsWith("android.opengl") ||
@@ -413,21 +395,6 @@
     }
 
     private fun checkClassNames(cls: ClassItem) {
-        /*
-            def verify_class_names(clazz):
-                """Try catching malformed class names like myMtp or MTPUser."""
-                if clazz.fullname.startswith("android.opengl"): return
-                if clazz.fullname.startswith("android.renderscript"): return
-                if re.match("android\.R\.[a-z]+", clazz.fullname): return
-
-                if re.search("[A-Z]{2,}", clazz.name) is not None:
-                    warn(clazz, None, "S1", "Class names with acronyms should be Mtp not MTP")
-                if re.match("[^A-Z]", clazz.name):
-                    error(clazz, None, "S1", "Class must start with uppercase char")
-                if clazz.name.endswith("Impl"):
-                    error(clazz, None, None, "Don't expose your implementation details")
-         */
-
         // Existing violations
         val qualifiedName = cls.qualifiedName()
         if (qualifiedName.startsWith("android.opengl") ||
@@ -465,25 +432,6 @@
     }
 
     private fun checkConstantNames(field: FieldItem) {
-        /*
-            def verify_constants(clazz):
-                """All static final constants must be FOO_NAME style."""
-                if re.match("android\.R\.[a-z]+", clazz.fullname): return
-                if clazz.fullname.startswith("android.os.Build"): return
-                if clazz.fullname == "android.system.OsConstants": return
-
-                req = ["java.lang.String","byte","short","int","long","float","double","boolean","char"]
-                for f in clazz.fields:
-                    if "static" in f.split and "final" in f.split:
-                        if re.match("[A-Z0-9_]+", f.name) is None:
-                            error(clazz, f, "C2", "Constant field names must be FOO_NAME")
-                        if f.typ != "java.lang.String":
-                            if f.name.startswith("MIN_") or f.name.startswith("MAX_"):
-                                warn(clazz, f, "C8", "If min/max could change in future, make them dynamic methods")
-                        if f.typ in req and f.value is None:
-                            error(clazz, f, None, "All constants must be defined at compile time")
-         */
-
         // Skip this check on Kotlin
         if (field.isKotlin()) {
             return
@@ -521,29 +469,6 @@
     }
 
     private fun checkCallbacks(cls: ClassItem) {
-        /*
-            def verify_callbacks(clazz):
-                """Verify Callback classes.
-                All callback classes must be abstract.
-                All methods must follow onFoo() naming style."""
-                if clazz.fullname == "android.speech.tts.SynthesisCallback": return
-
-                if clazz.name.endswith("Callbacks"):
-                    error(clazz, None, "L1", "Callback class names should be singular")
-                if clazz.name.endswith("Observer"):
-                    warn(clazz, None, "L1", "Class should be named FooCallback")
-
-                if clazz.name.endswith("Callback"):
-                    if "interface" in clazz.split:
-                        error(clazz, None, "CL3", "Callbacks must be abstract class to enable extension in future API levels")
-
-                    for m in clazz.methods:
-                        if not re.match("on[A-Z][a-z]*", m.name):
-                            error(clazz, m, "L1", "Callback method names must be onFoo() style")
-
-            )
-         */
-
         // Existing violations
         val qualified = cls.qualifiedName()
         if (qualified == "android.speech.tts.SynthesisCallback") {
@@ -610,28 +535,6 @@
     }
 
     private fun checkListeners(cls: ClassItem, methods: Sequence<MethodItem>) {
-        /*
-            def verify_listeners(clazz):
-                """Verify Listener classes.
-                All Listener classes must be interface.
-                All methods must follow onFoo() naming style.
-                If only a single method, it must match class name:
-                    interface OnFooListener { void onFoo() }"""
-
-                if clazz.name.endswith("Listener"):
-                    if " abstract class " in clazz.raw:
-                        error(clazz, None, "L1", "Listeners should be an interface, or otherwise renamed Callback")
-
-                    for m in clazz.methods:
-                        if not re.match("on[A-Z][a-z]*", m.name):
-                            error(clazz, m, "L1", "Listener method names must be onFoo() style")
-
-                    if len(clazz.methods) == 1 and clazz.name.startswith("On"):
-                        m = clazz.methods[0]
-                        if (m.name + "Listener").lower() != clazz.name.lower():
-                            error(clazz, m, "L1", "Single listener method name must match class name")
-         */
-
         val name = cls.simpleName()
         if (name.endsWith("Listener")) {
             if (cls.isClass()) {
@@ -657,38 +560,6 @@
     }
 
     private fun checkActions(field: FieldItem) {
-        /*
-            def verify_actions(clazz):
-                """Verify intent actions.
-                All action names must be named ACTION_FOO.
-                All action values must be scoped by package and match name:
-                    package android.foo {
-                        String ACTION_BAR = "android.foo.action.BAR";
-                    }"""
-                for f in clazz.fields:
-                    if f.value is None: continue
-                    if f.name.startswith("EXTRA_"): continue
-                    if f.name == "SERVICE_INTERFACE" or f.name == "PROVIDER_INTERFACE": continue
-                    if "INTERACTION" in f.name: continue
-
-                    if "static" in f.split and "final" in f.split and f.typ == "java.lang.String":
-                        if "_ACTION" in f.name or "ACTION_" in f.name or ".action." in f.value.lower():
-                            if not f.name.startswith("ACTION_"):
-                                error(clazz, f, "C3", "Intent action constant name must be ACTION_FOO")
-                            else:
-                                if clazz.fullname == "android.content.Intent":
-                                    prefix = "android.intent.action"
-                                elif clazz.fullname == "android.provider.Settings":
-                                    prefix = "android.settings"
-                                elif clazz.fullname == "android.app.admin.DevicePolicyManager" or clazz.fullname == "android.app.admin.DeviceAdminReceiver":
-                                    prefix = "android.app.action"
-                                else:
-                                    prefix = clazz.pkg.name + ".action"
-                                expected = prefix + "." + f.name[7:]
-                                if f.value != expected:
-                                    error(clazz, f, "C4", "Inconsistent action value; expected '%s'" % (expected))
-         */
-
         val name = field.name()
         if (name.startsWith("EXTRA_") || name == "SERVICE_INTERFACE" || name == "PROVIDER_INTERFACE") {
             return
@@ -727,38 +598,6 @@
     }
 
     private fun checkIntentExtras(field: FieldItem) {
-        /*
-            def verify_extras(clazz):
-                """Verify intent extras.
-                All extra names must be named EXTRA_FOO.
-                All extra values must be scoped by package and match name:
-                    package android.foo {
-                        String EXTRA_BAR = "android.foo.extra.BAR";
-                    }"""
-                if clazz.fullname == "android.app.Notification": return
-                if clazz.fullname == "android.appwidget.AppWidgetManager": return
-
-                for f in clazz.fields:
-                    if f.value is None: continue
-                    if f.name.startswith("ACTION_"): continue
-
-                    if "static" in f.split and "final" in f.split and f.typ == "java.lang.String":
-                        if "_EXTRA" in f.name or "EXTRA_" in f.name or ".extra" in f.value.lower():
-                            if not f.name.startswith("EXTRA_"):
-                                error(clazz, f, "C3", "Intent extra must be EXTRA_FOO")
-                            else:
-                                if clazz.pkg.name == "android.content" and clazz.name == "Intent":
-                                    prefix = "android.intent.extra"
-                                elif clazz.pkg.name == "android.app.admin":
-                                    prefix = "android.app.extra"
-                                else:
-                                    prefix = clazz.pkg.name + ".extra"
-                                expected = prefix + "." + f.name[6:]
-                                if f.value != expected:
-                                    error(clazz, f, "C4", "Inconsistent extra value; expected '%s'" % (expected))
-
-
-         */
         val className = field.containingClass().qualifiedName()
         if (className == "android.app.Notification" || className == "android.appwidget.AppWidgetManager") {
             return
@@ -796,18 +635,6 @@
     }
 
     private fun checkEquals(methods: Sequence<MethodItem>) {
-        /*
-            def verify_equals(clazz):
-                """Verify that equals() and hashCode() must be overridden together."""
-                eq = False
-                hc = False
-                for m in clazz.methods:
-                    if " static " in m.raw: continue
-                    if "boolean equals(java.lang.Object)" in m.raw: eq = True
-                    if "int hashCode()" in m.raw: hc = True
-                if eq != hc:
-                    error(clazz, None, "M8", "Must override both equals and hashCode; missing one")
-         */
         var equalsMethod: MethodItem? = null
         var hashCodeMethod: MethodItem? = null
 
@@ -844,26 +671,6 @@
         constructors: Sequence<MethodItem>,
         fields: Sequence<FieldItem>
     ) {
-        /*
-            def verify_parcelable(clazz):
-                """Verify that Parcelable objects aren't hiding required bits."""
-                if "implements android.os.Parcelable" in clazz.raw:
-                    creator = [ i for i in clazz.fields if i.name == "CREATOR" ]
-                    write = [ i for i in clazz.methods if i.name == "writeToParcel" ]
-                    describe = [ i for i in clazz.methods if i.name == "describeContents" ]
-
-                    if len(creator) == 0 or len(write) == 0 or len(describe) == 0:
-                        error(clazz, None, "FW3", "Parcelable requires CREATOR, writeToParcel, and describeContents; missing one")
-
-                    if ((" final class " not in clazz.raw) and
-                        (" final deprecated class " not in clazz.raw)):
-                        error(clazz, None, "FW8", "Parcelable classes must be final")
-
-                    for c in clazz.ctors:
-                        if c.args == ["android.os.Parcel"]:
-                            error(clazz, c, "FW3", "Parcelable inflation is exposed through CREATOR, not raw constructors")
-         */
-
         if (!cls.implements("android.os.Parcelable")) {
             return
         }
@@ -908,17 +715,6 @@
     }
 
     private fun checkProtected(member: MemberItem) {
-        /*
-        def verify_protected(clazz):
-            """Verify that no protected methods or fields are allowed."""
-            for m in clazz.methods:
-                if m.name == "finalize": continue
-                if "protected" in m.split:
-                    error(clazz, m, "M7", "Protected methods not allowed; must be public")
-            for f in clazz.fields:
-                if "protected" in f.split:
-                    error(clazz, f, "M7", "Protected fields not allowed; must be public")
-         */
         val modifiers = member.modifiers
         if (modifiers.isProtected()) {
             if (member.name() == "finalize" && member is MethodItem && member.parameters().isEmpty()) {
@@ -933,51 +729,6 @@
     }
 
     private fun checkFieldName(field: FieldItem) {
-        /*
-        def verify_fields(clazz):
-            """Verify that all exposed fields are final.
-            Exposed fields must follow myName style.
-            Catch internal mFoo objects being exposed."""
-
-            IGNORE_BARE_FIELDS = [
-                "android.app.ActivityManager.RecentTaskInfo",
-                "android.app.Notification",
-                "android.content.pm.ActivityInfo",
-                "android.content.pm.ApplicationInfo",
-                "android.content.pm.ComponentInfo",
-                "android.content.pm.ResolveInfo",
-                "android.content.pm.FeatureGroupInfo",
-                "android.content.pm.InstrumentationInfo",
-                "android.content.pm.PackageInfo",
-                "android.content.pm.PackageItemInfo",
-                "android.content.res.Configuration",
-                "android.graphics.BitmapFactory.Options",
-                "android.os.Message",
-                "android.system.StructPollfd",
-            ]
-
-            for f in clazz.fields:
-                if not "final" in f.split:
-                    if clazz.fullname in IGNORE_BARE_FIELDS:
-                        pass
-                    elif clazz.fullname.endswith("LayoutParams"):
-                        pass
-                    elif clazz.fullname.startswith("android.util.Mutable"):
-                        pass
-                    else:
-                        error(clazz, f, "F2", "Bare fields must be marked final, or add accessors if mutable")
-
-                if "static" not in f.split and "property" not in f.split:
-                    if not re.match("[a-z]([a-zA-Z]+)?", f.name):
-                        error(clazz, f, "S1", "Non-static fields must be named using myField style")
-
-                if re.match("[ms][A-Z]", f.name):
-                    error(clazz, f, "F1", "Internal objects must not be exposed")
-
-                if re.match("[A-Z_]+", f.name):
-                    if "static" not in f.split or "final" not in f.split:
-                        error(clazz, f, "C2", "Constants must be marked static final")
-         */
         val className = field.containingClass().qualifiedName()
         val modifiers = field.modifiers
         if (!modifiers.isFinal()) {
@@ -1029,40 +780,6 @@
     }
 
     private fun checkRegistrationMethods(cls: ClassItem, methods: Sequence<MethodItem>) {
-        /*
-            def verify_register(clazz):
-                """Verify parity of registration methods.
-                Callback objects use register/unregister methods.
-                Listener objects use add/remove methods."""
-                methods = [ m.name for m in clazz.methods ]
-                for m in clazz.methods:
-                    if "Callback" in m.raw:
-                        if m.name.startswith("register"):
-                            other = "unregister" + m.name[8:]
-                            if other not in methods:
-                                error(clazz, m, "L2", "Missing unregister method")
-                        if m.name.startswith("unregister"):
-                            other = "register" + m.name[10:]
-                            if other not in methods:
-                                error(clazz, m, "L2", "Missing register method")
-
-                        if m.name.startswith("add") or m.name.startswith("remove"):
-                            error(clazz, m, "L3", "Callback methods should be named register/unregister")
-
-                    if "Listener" in m.raw:
-                        if m.name.startswith("add"):
-                            other = "remove" + m.name[3:]
-                            if other not in methods:
-                                error(clazz, m, "L2", "Missing remove method")
-                        if m.name.startswith("remove") and not m.name.startswith("removeAll"):
-                            other = "add" + m.name[6:]
-                            if other not in methods:
-                                error(clazz, m, "L2", "Missing add method")
-
-                        if m.name.startswith("register") or m.name.startswith("unregister"):
-                            error(clazz, m, "L3", "Listener methods should be named add/remove")
-         */
-
         /** Make sure that there is a corresponding method */
         fun ensureMatched(cls: ClassItem, methods: Sequence<MethodItem>, method: MethodItem, name: String) {
             if (method.superMethods().isNotEmpty()) return // Do not report for override methods
@@ -1114,14 +831,6 @@
     }
 
     private fun checkSynchronized(method: MethodItem) {
-        /*
-            def verify_sync(clazz):
-                """Verify synchronized methods aren't exposed."""
-                for m in clazz.methods:
-                    if "synchronized" in m.split:
-                        error(clazz, m, "M5", "Internal locks must not be exposed")
-         */
-
         fun reportError(method: MethodItem, psi: PsiElement? = null) {
             val message = StringBuilder("Internal locks must not be exposed")
             if (psi != null) {
@@ -1171,18 +880,6 @@
     }
 
     private fun checkIntentBuilder(method: MethodItem) {
-        /*
-            def verify_intent_builder(clazz):
-                """Verify that Intent builders are createFooIntent() style."""
-                if clazz.name == "Intent": return
-
-                for m in clazz.methods:
-                    if m.typ == "android.content.Intent":
-                        if m.name.startswith("create") and m.name.endswith("Intent"):
-                            pass
-                        else:
-                            warn(clazz, m, "FW1", "Methods creating an Intent should be named createFooIntent()")
-         */
         if (method.returnType()?.toTypeString() == "android.content.Intent") {
             val name = method.name()
             if (name.startsWith("create") && name.endsWith("Intent")) {
@@ -1200,57 +897,6 @@
     }
 
     private fun checkHelperClasses(cls: ClassItem, methods: Sequence<MethodItem>, fields: Sequence<FieldItem>) {
-        /*
-            def verify_helper_classes(clazz):
-                """Verify that helper classes are named consistently with what they extend.
-                All developer extendable methods should be named onFoo()."""
-                test_methods = False
-                if "extends android.app.Service" in clazz.raw:
-                    test_methods = True
-                    if not clazz.name.endswith("Service"):
-                        error(clazz, None, "CL4", "Inconsistent class name; should be FooService")
-
-                    found = False
-                    for f in clazz.fields:
-                        if f.name == "SERVICE_INTERFACE":
-                            found = True
-                            if f.value != clazz.fullname:
-                                error(clazz, f, "C4", "Inconsistent interface constant; expected '%s'" % (clazz.fullname))
-
-                if "extends android.content.ContentProvider" in clazz.raw:
-                    test_methods = True
-                    if not clazz.name.endswith("Provider"):
-                        error(clazz, None, "CL4", "Inconsistent class name; should be FooProvider")
-
-                    found = False
-                    for f in clazz.fields:
-                        if f.name == "PROVIDER_INTERFACE":
-                            found = True
-                            if f.value != clazz.fullname:
-                                error(clazz, f, "C4", "Inconsistent interface constant; expected '%s'" % (clazz.fullname))
-
-                if "extends android.content.BroadcastReceiver" in clazz.raw:
-                    test_methods = True
-                    if not clazz.name.endswith("Receiver"):
-                        error(clazz, None, "CL4", "Inconsistent class name; should be FooReceiver")
-
-                if "extends android.app.Activity" in clazz.raw:
-                    test_methods = True
-                    if not clazz.name.endswith("Activity"):
-                        error(clazz, None, "CL4", "Inconsistent class name; should be FooActivity")
-
-                if test_methods:
-                    for m in clazz.methods:
-                        if "final" in m.split: continue
-// Note: This regex seems wrong:
-                        if not re.match("on[A-Z]", m.name):
-                            if "abstract" in m.split:
-                                warn(clazz, m, None, "Methods implemented by developers should be named onFoo()")
-                            else:
-                                warn(clazz, m, None, "If implemented by developer, should be named onFoo(); otherwise consider marking final")
-
-         */
-
         fun ensureFieldValue(fields: Sequence<FieldItem>, fieldName: String, fieldValue: String) {
             fields.firstOrNull { it.name() == fieldName }?.let { field ->
                 if (field.initialValue(true) != fieldValue) {
@@ -1320,35 +966,6 @@
         constructors: Sequence<ConstructorItem>,
         superClass: ClassItem?
     ) {
-        /*
-            def verify_builder(clazz):
-                """Verify builder classes.
-                Methods should return the builder to enable chaining."""
-                if " extends " in clazz.raw: return
-                if not clazz.name.endswith("Builder"): return
-
-                if clazz.name != "Builder":
-                    warn(clazz, None, None, "Builder should be defined as inner class")
-
-                has_build = False
-                for m in clazz.methods:
-                    if m.name == "build":
-                        has_build = True
-                        continue
-
-                    if m.name.startswith("get"): continue
-                    if m.name.startswith("clear"): continue
-
-                    if m.name.startswith("with"):
-                        warn(clazz, m, None, "Builder methods names should use setFoo() style")
-
-                    if m.name.startswith("set"):
-                        if not m.typ.endswith(clazz.fullname):
-                            warn(clazz, m, "M4", "Methods must return the builder object")
-
-                if not has_build:
-                    warn(clazz, None, None, "Missing build() method")
-         */
         if (!cls.simpleName().endsWith("Builder")) {
             return
         }
@@ -1486,13 +1103,6 @@
     }
 
     private fun checkAidl(cls: ClassItem, superClass: ClassItem?, interfaces: Sequence<TypeItem>) {
-        /*
-            def verify_aidl(clazz):
-                """Catch people exposing raw AIDL."""
-                if "extends android.os.Binder" in clazz.raw or "implements android.os.IInterface" in clazz.raw:
-                    error(clazz, None, None, "Raw AIDL interfaces must not be exposed")
-        */
-
         // Instead of ClassItem.implements() and .extends() which performs hierarchy
         // searches, here we only want to flag directly extending or implementing:
         val extendsBinder = superClass?.qualifiedName() == "android.os.Binder"
@@ -1511,13 +1121,6 @@
     }
 
     private fun checkInternal(cls: ClassItem) {
-        /*
-            def verify_internal(clazz):
-                """Catch people exposing internal classes."""
-                if clazz.pkg.name.startswith("com.android"):
-                    error(clazz, None, None, "Internal classes must not be exposed")
-        */
-
         if (cls.qualifiedName().startsWith("com.android.")) {
             report(
                 INTERNAL_CLASSES, cls,
@@ -1531,52 +1134,6 @@
         methodsAndConstructors: Sequence<MethodItem>,
         fields: Sequence<FieldItem>
     ) {
-        /*
-            def verify_layering(clazz):
-                """Catch package layering violations.
-                For example, something in android.os depending on android.app."""
-                ranking = [
-                    ["android.service","android.accessibilityservice","android.inputmethodservice","android.printservice","android.appwidget","android.webkit","android.preference","android.gesture","android.print"],
-                    "android.app",
-                    "android.widget",
-                    "android.view",
-                    "android.animation",
-                    "android.provider",
-                    ["android.content","android.graphics.drawable"],
-                    "android.database",
-                    "android.text",
-                    "android.graphics",
-                    "android.os",
-                    "android.util"
-                ]
-
-                def rank(p):
-                    for i in range(len(ranking)):
-                        if isinstance(ranking[i], list):
-                            for j in ranking[i]:
-                                if p.startswith(j): return i
-                        else:
-                            if p.startswith(ranking[i]): return i
-
-                cr = rank(clazz.pkg.name)
-                if cr is None: return
-
-                for f in clazz.fields:
-                    ir = rank(f.typ)
-                    if ir and ir < cr:
-                        warn(clazz, f, "FW6", "Field type violates package layering")
-
-                for m in clazz.methods:
-                    ir = rank(m.typ)
-                    if ir and ir < cr:
-                        warn(clazz, m, "FW6", "Method return type violates package layering")
-                    for arg in m.args:
-                        ir = rank(arg)
-                        if ir and ir < cr:
-                            warn(clazz, m, "FW6", "Method argument type violates package layering")
-
-        */
-
         fun packageRank(pkg: PackageItem): Int {
             return when (pkg.qualifiedName()) {
                 "android.service",
@@ -1738,21 +1295,6 @@
         type: TypeItem,
         item: Item
     ) {
-        /*
-            def verify_collections(clazz):
-                """Verifies that collection types are interfaces."""
-                if clazz.fullname == "android.os.Bundle": return
-
-                bad = ["java.util.Vector", "java.util.LinkedList", "java.util.ArrayList", "java.util.Stack",
-                       "java.util.HashMap", "java.util.HashSet", "android.util.ArraySet", "android.util.ArrayMap"]
-                for m in clazz.methods:
-                    if m.typ in bad:
-                        error(clazz, m, "CL2", "Return type is concrete collection; must be higher-level interface")
-                    for arg in m.args:
-                        if arg in bad:
-                            error(clazz, m, "CL2", "Argument is concrete collection; must be higher-level interface")
-        */
-
         if (type.primitive) {
             return
         }
@@ -1830,23 +1372,6 @@
     }
 
     private fun checkFlags(fields: Sequence<FieldItem>) {
-        /*
-            def verify_flags(clazz):
-                """Verifies that flags are non-overlapping."""
-                known = collections.defaultdict(int)
-                for f in clazz.fields:
-                    if "FLAG_" in f.name:
-                        try:
-                            val = int(f.value)
-                        except:
-                            continue
-
-                        scope = f.name[0:f.name.index("FLAG_")]
-                        if val & known[scope]:
-                            warn(clazz, f, "C1", "Found overlapping flag constant value")
-                        known[scope] |= val
-
-        */
         var known: MutableMap<String, Int>? = null
         var valueToFlag: MutableMap<Int?, String>? = null
         for (field in fields) {
@@ -1878,24 +1403,6 @@
     }
 
     private fun checkExceptions(method: MethodItem, filterReference: Predicate<Item>) {
-        /*
-            def verify_exception(clazz):
-                """Verifies that methods don't throw generic exceptions."""
-                for m in clazz.methods:
-                    for t in m.throws:
-                        if t in ["java.lang.Exception", "java.lang.Throwable", "java.lang.Error"]:
-                            error(clazz, m, "S1", "Methods must not throw generic exceptions")
-
-                        if t in ["android.os.RemoteException"]:
-                            if clazz.name == "android.content.ContentProviderClient": continue
-                            if clazz.name == "android.os.Binder": continue
-                            if clazz.name == "android.os.IBinder": continue
-
-                            error(clazz, m, "FW9", "Methods calling into system server should rethrow RemoteException as RuntimeException")
-
-                        if len(m.args) == 0 and t in ["java.lang.IllegalArgumentException", "java.lang.NullPointerException"]:
-                            warn(clazz, m, "S1", "Methods taking no arguments should throw IllegalStateException")
-        */
         for (exception in method.filteredThrowsTypes(filterReference)) {
             when (val qualifiedName = exception.qualifiedName()) {
                 "java.lang.Exception",
@@ -1935,23 +1442,6 @@
     }
 
     private fun checkGoogle(cls: ClassItem, methods: Sequence<MethodItem>, fields: Sequence<FieldItem>) {
-        /*
-            def verify_google(clazz):
-                """Verifies that APIs never reference Google."""
-
-                if re.search("google", clazz.raw, re.IGNORECASE):
-                    error(clazz, None, None, "Must never reference Google")
-
-                test = []
-                test.extend(clazz.ctors)
-                test.extend(clazz.fields)
-                test.extend(clazz.methods)
-
-                for t in test:
-                    if re.search("google", t.raw, re.IGNORECASE):
-                        error(clazz, t, None, "Must never reference Google")
-        */
-
         fun checkName(name: String, item: Item) {
             if (name.contains("Google", ignoreCase = true)) {
                 report(
@@ -1982,20 +1472,6 @@
     }
 
     private fun checkManager(cls: ClassItem, methods: Sequence<MethodItem>, constructors: Sequence<ConstructorItem>) {
-        /*
-            def verify_manager(clazz):
-                """Verifies that FooManager is only obtained from Context."""
-
-                if not clazz.name.endswith("Manager"): return
-
-                for c in clazz.ctors:
-                    error(clazz, c, None, "Managers must always be obtained from Context; no direct constructors")
-
-                for m in clazz.methods:
-                    if m.typ == clazz.fullname:
-                        error(clazz, m, None, "Managers must always be obtained from Context")
-
-        */
         if (!cls.simpleName().endsWith("Manager")) {
             return
         }
@@ -2073,29 +1549,6 @@
     }
 
     private fun checkBoxed(type: TypeItem, item: Item) {
-        /*
-            def verify_boxed(clazz):
-                """Verifies that methods avoid boxed primitives."""
-
-                boxed = ["java.lang.Number","java.lang.Byte","java.lang.Double","java.lang.Float","java.lang.Integer","java.lang.Long","java.lang.Short"]
-
-                for c in clazz.ctors:
-                    for arg in c.args:
-                        if arg in boxed:
-                            error(clazz, c, "M11", "Must avoid boxed primitives")
-
-                for f in clazz.fields:
-                    if f.typ in boxed:
-                        error(clazz, f, "M11", "Must avoid boxed primitives")
-
-                for m in clazz.methods:
-                    if m.typ in boxed:
-                        error(clazz, m, "M11", "Must avoid boxed primitives")
-                    for arg in m.args:
-                        if arg in boxed:
-                            error(clazz, m, "M11", "Must avoid boxed primitives")
-        */
-
         fun isBoxType(qualifiedName: String): Boolean {
             return when (qualifiedName) {
                 "java.lang.Number",
@@ -2127,25 +1580,6 @@
         constructors: Sequence<ConstructorItem>,
         fields: Sequence<FieldItem>
     ) {
-        /*
-            def verify_static_utils(clazz):
-                """Verifies that helper classes can't be constructed."""
-                if clazz.fullname.startswith("android.opengl"): return
-                if clazz.fullname.startswith("android.R"): return
-
-                # Only care about classes with default constructors
-                if len(clazz.ctors) == 1 and len(clazz.ctors[0].args) == 0:
-                    test = []
-                    test.extend(clazz.fields)
-                    test.extend(clazz.methods)
-
-                    if len(test) == 0: return
-                    for t in test:
-                        if "static" not in t.split:
-                            return
-
-                    error(clazz, None, None, "Fully-static utility classes must not have constructor")
-        */
         if (!cls.isClass()) {
             return
         }
@@ -2184,47 +1618,6 @@
     }
 
     private fun checkOverloadArgs(cls: ClassItem, methods: Sequence<MethodItem>) {
-        /*
-            def verify_overload_args(clazz):
-                """Verifies that method overloads add new arguments at the end."""
-                if clazz.fullname.startswith("android.opengl"): return
-
-                overloads = collections.defaultdict(list)
-                for m in clazz.methods:
-                    if "deprecated" in m.split: continue
-                    overloads[m.name].append(m)
-
-                for name, methods in overloads.items():
-                    if len(methods) <= 1: continue
-
-                    # Look for arguments common across all overloads
-                    def cluster(args):
-                        count = collections.defaultdict(int)
-                        res = set()
-                        for i in range(len(args)):
-                            a = args[i]
-                            res.add("%s#%d" % (a, count[a]))
-                            count[a] += 1
-                        return res
-
-                    common_args = cluster(methods[0].args)
-                    for m in methods:
-                        common_args = common_args & cluster(m.args)
-
-                    if len(common_args) == 0: continue
-
-                    # Require that all common arguments are present at start of signature
-                    locked_sig = None
-                    for m in methods:
-                        sig = m.args[0:len(common_args)]
-                        if not common_args.issubset(cluster(sig)):
-                            warn(clazz, m, "M2", "Expected common arguments [%s] at beginning of overloaded method" % (", ".join(common_args)))
-                        elif not locked_sig:
-                            locked_sig = sig
-                        elif locked_sig != sig:
-                            error(clazz, m, "M2", "Expected consistent argument ordering between overloads: %s..." % (", ".join(locked_sig)))
-        */
-
         if (cls.qualifiedName().startsWith("android.opengl")) {
             return
         }
@@ -2297,62 +1690,6 @@
         methodsAndConstructors: Sequence<MethodItem>,
         superClass: ClassItem?
     ) {
-        /*
-            def verify_callback_handlers(clazz):
-                """Verifies that methods adding listener/callback have overload
-                for specifying delivery thread."""
-
-                # Ignore UI packages which assume main thread
-                skip = [
-                    "animation",
-                    "view",
-                    "graphics",
-                    "transition",
-                    "widget",
-                    "webkit",
-                ]
-                for s in skip:
-                    if s in clazz.pkg.name_path: return
-                    if s in clazz.extends_path: return
-
-                # Ignore UI classes which assume main thread
-                if "app" in clazz.pkg.name_path or "app" in clazz.extends_path:
-                    for s in ["ActionBar","Dialog","Application","Activity","Fragment","Loader"]:
-                        if s in clazz.fullname: return
-                if "content" in clazz.pkg.name_path or "content" in clazz.extends_path:
-                    for s in ["Loader"]:
-                        if s in clazz.fullname: return
-
-                found = {}
-                by_name = collections.defaultdict(list)
-                examine = clazz.ctors + clazz.methods
-                for m in examine:
-                    if m.name.startswith("unregister"): continue
-                    if m.name.startswith("remove"): continue
-                    if re.match("on[A-Z]+", m.name): continue
-
-                    by_name[m.name].append(m)
-
-                    for a in m.args:
-                        if a.endswith("Listener") or a.endswith("Callback") or a.endswith("Callbacks"):
-                            found[m.name] = m
-
-                for f in found.values():
-                    takes_handler = False
-                    takes_exec = False
-                    for m in by_name[f.name]:
-                        if "android.os.Handler" in m.args:
-                            takes_handler = True
-                        if "java.util.concurrent.Executor" in m.args:
-                            takes_exec = True
-                    if not takes_exec:
-                        warn(clazz, f, "L1", "Registration methods should have overload that accepts delivery Executor")
-
-        */
-
-        // Note: In the above we compute takes_handler but it's not used; is this an incomplete
-        // check?
-
         fun packageContainsSegment(packageName: String?, segment: String): Boolean {
             packageName ?: return false
             return (
@@ -2461,18 +1798,6 @@
     }
 
     private fun checkContextFirst(method: MethodItem) {
-        /*
-            def verify_context_first(clazz):
-                """Verifies that methods accepting a Context keep it the first argument."""
-                examine = clazz.ctors + clazz.methods
-                for m in examine:
-                    if len(m.args) > 1 and m.args[0] != "android.content.Context":
-                        if "android.content.Context" in m.args[1:]:
-                            error(clazz, m, "M3", "Context is distinct, so it must be the first argument")
-                    if len(m.args) > 1 and m.args[0] != "android.content.ContentResolver":
-                        if "android.content.ContentResolver" in m.args[1:]:
-                            error(clazz, m, "M3", "ContentResolver is distinct, so it must be the first argument")
-        */
         val parameters = method.parameters()
         if (parameters.size > 1 && parameters[0].type().toTypeString() != "android.content.Context") {
             for (i in 1 until parameters.size) {
@@ -2499,20 +1824,6 @@
     }
 
     private fun checkListenerLast(method: MethodItem) {
-        /*
-            def verify_listener_last(clazz):
-                """Verifies that methods accepting a Listener or Callback keep them as last arguments."""
-                examine = clazz.ctors + clazz.methods
-                for m in examine:
-                    if "Listener" in m.name or "Callback" in m.name: continue
-                    found = False
-                    for a in m.args:
-                        if a.endswith("Callback") or a.endswith("Callbacks") or a.endswith("Listener"):
-                            found = True
-                        elif found:
-                            warn(clazz, m, "M3", "Listeners should always be at end of argument list")
-                    */
-
         val name = method.name()
         if (name.contains("Listener") || name.contains("Callback")) {
             return
@@ -2536,37 +1847,6 @@
     }
 
     private fun checkResourceNames(cls: ClassItem, fields: Sequence<FieldItem>) {
-        /*
-            def verify_resource_names(clazz):
-                """Verifies that resource names have consistent case."""
-                if not re.match("android\.R\.[a-z]+", clazz.fullname): return
-
-                # Resources defined by files are foo_bar_baz
-                if clazz.name in ["anim","animator","color","dimen","drawable","interpolator","layout","transition","menu","mipmap","string","plurals","raw","xml"]:
-                    for f in clazz.fields:
-                        if re.match("config_[a-z][a-zA-Z1-9]*$", f.name): continue
-                        if f.name.startswith("config_"):
-                            error(clazz, f, None, "Expected config name to be config_fooBarBaz style")
-
-                        if re.match("[a-z1-9_]+$", f.name): continue
-                        error(clazz, f, None, "Expected resource name in this class to be foo_bar_baz style")
-
-                # Resources defined inside files are fooBarBaz
-                if clazz.name in ["array","attr","id","bool","fraction","integer"]:
-                    for f in clazz.fields:
-                        if re.match("config_[a-z][a-zA-Z1-9]*$", f.name): continue
-                        if re.match("layout_[a-z][a-zA-Z1-9]*$", f.name): continue
-                        if re.match("state_[a-z_]*$", f.name): continue
-
-                        if re.match("[a-z][a-zA-Z1-9]*$", f.name): continue
-                        error(clazz, f, "C7", "Expected resource name in this class to be fooBarBaz style")
-
-                # Styles are FooBar_Baz
-                if clazz.name in ["style"]:
-                    for f in clazz.fields:
-                        if re.match("[A-Z][A-Za-z1-9]+(_[A-Z][A-Za-z1-9]+?)*$", f.name): continue
-                        error(clazz, f, "C7", "Expected resource name in this class to be FooBar_Baz style")
-        */
         if (!cls.qualifiedName().startsWith("android.R.")) {
             return
         }
@@ -2668,28 +1948,6 @@
     }
 
     private fun checkFiles(methodsAndConstructors: Sequence<MethodItem>) {
-        /*
-            def verify_files(clazz):
-                """Verifies that methods accepting File also accept streams."""
-
-                has_file = set()
-                has_stream = set()
-
-                test = []
-                test.extend(clazz.ctors)
-                test.extend(clazz.methods)
-
-                for m in test:
-                    if "java.io.File" in m.args:
-                        has_file.add(m)
-                    if "java.io.FileDescriptor" in m.args or "android.os.ParcelFileDescriptor" in m.args or "java.io.InputStream" in m.args or "java.io.OutputStream" in m.args:
-                        has_stream.add(m.name)
-
-                for m in has_file:
-                    if m.name not in has_stream:
-                        warn(clazz, m, "M10", "Methods accepting File should also accept FileDescriptor or streams")
-        */
-
         var hasFile: MutableSet<MethodItem>? = null
         var hasStream: MutableSet<String>? = null
         for (method in methodsAndConstructors) {
@@ -2732,16 +1990,6 @@
     }
 
     private fun checkManagerList(cls: ClassItem, methods: Sequence<MethodItem>) {
-        /*
-            def verify_manager_list(clazz):
-                """Verifies that managers return List<? extends Parcelable> instead of arrays."""
-
-                if not clazz.name.endswith("Manager"): return
-
-                for m in clazz.methods:
-                    if m.typ.startswith("android.") and m.typ.endswith("[]"):
-                        warn(clazz, m, None, "Methods should return List<? extends Parcelable> instead of Parcelable[] to support ParceledListSlice under the hood")
-        */
         if (!cls.simpleName().endsWith("Manager")) {
             return
         }
@@ -2761,14 +2009,6 @@
     }
 
     private fun checkAbstractInner(cls: ClassItem) {
-        /*
-            def verify_abstract_inner(clazz):
-                """Verifies that abstract inner classes are static."""
-
-                if re.match(".+?\.[A-Z][^\.]+\.[A-Z]", clazz.fullname):
-                    if " abstract " in clazz.raw and " static " not in clazz.raw:
-                        warn(clazz, None, None, "Abstract inner classes should be static to improve testability")
-        */
         if (!cls.isTopLevelClass() && cls.isClass() && cls.modifiers.isAbstract() && !cls.modifiers.isStatic()) {
             report(
                 ABSTRACT_INNER, cls,
@@ -2781,51 +2021,6 @@
         methodsAndConstructors: Sequence<MethodItem>,
         filterReference: Predicate<Item>
     ) {
-        /*
-            def verify_runtime_exceptions(clazz):
-                """Verifies that runtime exceptions aren't listed in throws."""
-
-                banned = [
-                    "java.lang.NullPointerException",
-                    "java.lang.ClassCastException",
-                    "java.lang.IndexOutOfBoundsException",
-                    "java.lang.reflect.UndeclaredThrowableException",
-                    "java.lang.reflect.MalformedParametersException",
-                    "java.lang.reflect.MalformedParameterizedTypeException",
-                    "java.lang.invoke.WrongMethodTypeException",
-                    "java.lang.EnumConstantNotPresentException",
-                    "java.lang.IllegalMonitorStateException",
-                    "java.lang.SecurityException",
-                    "java.lang.UnsupportedOperationException",
-                    "java.lang.annotation.AnnotationTypeMismatchException",
-                    "java.lang.annotation.IncompleteAnnotationException",
-                    "java.lang.TypeNotPresentException",
-                    "java.lang.IllegalStateException",
-                    "java.lang.ArithmeticException",
-                    "java.lang.IllegalArgumentException",
-                    "java.lang.ArrayStoreException",
-                    "java.lang.NegativeArraySizeException",
-                    "java.util.MissingResourceException",
-                    "java.util.EmptyStackException",
-                    "java.util.concurrent.CompletionException",
-                    "java.util.concurrent.RejectedExecutionException",
-                    "java.util.IllformedLocaleException",
-                    "java.util.ConcurrentModificationException",
-                    "java.util.NoSuchElementException",
-                    "java.io.UncheckedIOException",
-                    "java.time.DateTimeException",
-                    "java.security.ProviderException",
-                    "java.nio.BufferUnderflowException",
-                    "java.nio.BufferOverflowException",
-                ]
-
-                examine = clazz.ctors + clazz.methods
-                for m in examine:
-                    for t in m.throws:
-                        if t in banned:
-                            error(clazz, m, None, "Methods must not mention RuntimeException subclasses in throws clauses")
-
-        */
         for (method in methodsAndConstructors) {
             if (method.synthetic) {
                 continue
@@ -2874,15 +2069,6 @@
     }
 
     private fun checkError(cls: ClassItem, superClass: ClassItem?) {
-        /*
-            def verify_error(clazz):
-                """Verifies that we always use Exception instead of Error."""
-                if not clazz.extends: return
-                if clazz.extends.endswith("Error"):
-                    error(clazz, None, None, "Trouble must be reported through an Exception, not Error")
-                if clazz.extends.endswith("Exception") and not clazz.name.endswith("Exception"):
-                    error(clazz, None, None, "Exceptions must be named FooException")
-        */
         superClass ?: return
         if (superClass.simpleName().endsWith("Error")) {
             report(
@@ -2931,18 +2117,6 @@
     }
 
     private fun checkCloseable(cls: ClassItem, methods: Sequence<MethodItem>) {
-        /*
-            def verify_closable(clazz):
-                """Verifies that classes are AutoClosable."""
-                if "implements java.lang.AutoCloseable" in clazz.raw: return
-                if "implements java.io.Closeable" in clazz.raw: return
-
-                for m in clazz.methods:
-                    if len(m.args) > 0: continue
-                    if m.name in ["close","release","destroy","finish","finalize","disconnect","shutdown","stop","free","quit"]:
-                        warn(clazz, m, None, "Classes that release resources should implement AutoClosable and CloseGuard")
-                        return
-         */
         // AutoClosable has been added in API 19, so libraries with minSdkVersion <19 cannot use it. If the version
         // is not set, then keep the check enabled.
         val minSdkVersion = codebase.getMinSdkVersion()
@@ -2966,57 +2140,6 @@
     }
 
     private fun checkNotKotlinOperator(methods: Sequence<MethodItem>) {
-        /*
-            def verify_method_name_not_kotlin_operator(clazz):
-                """Warn about method names which become operators in Kotlin."""
-
-                binary = set()
-
-                def unique_binary_op(m, op):
-                    if op in binary:
-                        error(clazz, m, None, "Only one of '{0}' and '{0}Assign' methods should be present for Kotlin".format(op))
-                    binary.add(op)
-
-                for m in clazz.methods:
-                    if 'static' in m.split:
-                        continue
-
-                    # https://kotlinlang.org/docs/reference/operator-overloading.html#unary-prefix-operators
-                    if m.name in ["unaryPlus", "unaryMinus", "not"] and len(m.args) == 0:
-                        warn(clazz, m, None, "Method can be invoked as a unary operator from Kotlin")
-
-                    # https://kotlinlang.org/docs/reference/operator-overloading.html#increments-and-decrements
-                    if m.name in ["inc", "dec"] and len(m.args) == 0 and m.typ != "void":
-                        # This only applies if the return type is the same or a subtype of the enclosing class, but we have no
-                        # practical way of checking that relationship here.
-                        warn(clazz, m, None, "Method can be invoked as a pre/postfix inc/decrement operator from Kotlin")
-
-                    # https://kotlinlang.org/docs/reference/operator-overloading.html#arithmetic
-                    if m.name in ["plus", "minus", "times", "div", "rem", "mod", "rangeTo"] and len(m.args) == 1:
-                        warn(clazz, m, None, "Method can be invoked as a binary operator from Kotlin")
-                        unique_binary_op(m, m.name)
-
-                    # https://kotlinlang.org/docs/reference/operator-overloading.html#in
-                    if m.name == "contains" and len(m.args) == 1 and m.typ == "boolean":
-                        warn(clazz, m, None, "Method can be invoked as a "in" operator from Kotlin")
-
-                    # https://kotlinlang.org/docs/reference/operator-overloading.html#indexed
-                    if (m.name == "get" and len(m.args) > 0) or (m.name == "set" and len(m.args) > 1):
-                        warn(clazz, m, None, "Method can be invoked with an indexing operator from Kotlin")
-
-                    # https://kotlinlang.org/docs/reference/operator-overloading.html#invoke
-                    if m.name == "invoke":
-                        warn(clazz, m, None, "Method can be invoked with function call syntax from Kotlin")
-
-                    # https://kotlinlang.org/docs/reference/operator-overloading.html#assignments
-                    if m.name in ["plusAssign", "minusAssign", "timesAssign", "divAssign", "remAssign", "modAssign"] \
-                            and len(m.args) == 1 \
-                            and m.typ == "void":
-                        warn(clazz, m, None, "Method can be invoked as a compound assignment operator from Kotlin")
-                        unique_binary_op(m, m.name[:-6])  # Remove "Assign" suffix
-
-         */
-
         fun flagKotlinOperator(method: MethodItem, message: String) {
             if (method.isKotlin()) {
                 report(
@@ -3118,20 +2241,6 @@
     }
 
     private fun checkCollectionsOverArrays(type: TypeItem, typeString: String, item: Item) {
-        /*
-            def verify_collections_over_arrays(clazz):
-                """Warn that [] should be Collections."""
-
-                safe = ["java.lang.String[]","byte[]","short[]","int[]","long[]","float[]","double[]","boolean[]","char[]"]
-                for m in clazz.methods:
-                    if m.typ.endswith("[]") and m.typ not in safe:
-                        warn(clazz, m, None, "Method should return Collection<> (or subclass) instead of raw array")
-                    for arg in m.args:
-                        if arg.endswith("[]") and arg not in safe:
-                            warn(clazz, m, None, "Method argument should be Collection<> (or subclass) instead of raw array")
-
-         */
-
         if (!type.isArray() || (item is ParameterItem && item.isVarArgs())) {
             return
         }
@@ -3173,31 +2282,6 @@
     }
 
     private fun checkUserHandle(cls: ClassItem, methods: Sequence<MethodItem>) {
-        /*
-            def verify_user_handle(clazz):
-                """Methods taking UserHandle should be ForUser or AsUser."""
-                if clazz.name.endswith("Listener") or clazz.name.endswith("Callback") or clazz.name.endswith("Callbacks"): return
-                if clazz.fullname == "android.app.admin.DeviceAdminReceiver": return
-                if clazz.fullname == "android.content.pm.LauncherApps": return
-                if clazz.fullname == "android.os.UserHandle": return
-                if clazz.fullname == "android.os.UserManager": return
-
-                for m in clazz.methods:
-                    if re.match("on[A-Z]+", m.name): continue
-
-                    has_arg = "android.os.UserHandle" in m.args
-                    has_name = m.name.endswith("AsUser") or m.name.endswith("ForUser")
-
-                    if clazz.fullname.endswith("Manager") and has_arg:
-                        warn(clazz, m, None, "When a method overload is needed to target a specific "
-                             "UserHandle, callers should be directed to use "
-                             "Context.createPackageContextAsUser() and re-obtain the relevant "
-                             "Manager, and no new API should be added")
-                    elif has_arg and not has_name:
-                        warn(clazz, m, None, "Method taking UserHandle should be named 'doFooAsUser' "
-                             "or 'queryFooForUser'")
-
-         */
         val qualifiedName = cls.qualifiedName()
         if (qualifiedName == "android.app.admin.DeviceAdminReceiver" ||
             qualifiedName == "android.content.pm.LauncherApps" ||
@@ -3238,22 +2322,6 @@
     }
 
     private fun checkParams(cls: ClassItem) {
-        /*
-            def verify_params(clazz):
-                """Parameter classes should be 'Params'."""
-                if clazz.name.endswith("Params"): return
-                if clazz.fullname == "android.app.ActivityOptions": return
-                if clazz.fullname == "android.app.BroadcastOptions": return
-                if clazz.fullname == "android.os.Bundle": return
-                if clazz.fullname == "android.os.BaseBundle": return
-                if clazz.fullname == "android.os.PersistableBundle": return
-
-                bad = ["Param","Parameter","Parameters","Args","Arg","Argument","Arguments","Options","Bundle"]
-                for b in bad:
-                    if clazz.name.endswith(b):
-                        error(clazz, None, None, "Classes holding a set of parameters should be called 'FooParams'")
-         */
-
         val qualifiedName = cls.qualifiedName()
         for (suffix in badParameterClassNames) {
             if (qualifiedName.endsWith(suffix) && !(
@@ -3276,19 +2344,6 @@
     }
 
     private fun checkServices(field: FieldItem) {
-        /*
-            def verify_services(clazz):
-                """Service name should be FOO_BAR_SERVICE = 'foo_bar'."""
-                if clazz.fullname != "android.content.Context": return
-
-                for f in clazz.fields:
-                    if f.typ != "java.lang.String": continue
-                    found = re.match(r"([A-Z_]+)_SERVICE", f.name)
-                    if found:
-                        expected = found.group(1).lower()
-                        if f.value != expected:
-                            error(clazz, f, "C4", "Inconsistent service value; expected '%s'" % (expected))
-         */
         val type = field.type()
         if (!type.isString() || !field.modifiers.isFinal() || !field.modifiers.isStatic() ||
             field.containingClass().qualifiedName() != "android.content.Context"
@@ -3339,15 +2394,6 @@
     }
 
     private fun checkTense(method: MethodItem) {
-        /*
-            def verify_tense(clazz):
-                """Verify tenses of method names."""
-                if clazz.fullname.startswith("android.opengl"): return
-
-                for m in clazz.methods:
-                    if m.name.endswith("Enable"):
-                        warn(clazz, m, None, "Unexpected tense; probably meant 'enabled'")
-         */
         val name = method.name()
         if (name.endsWith("Enable")) {
             if (method.containingClass().qualifiedName().startsWith("android.opengl")) {
@@ -3361,37 +2407,6 @@
     }
 
     private fun checkIcu(type: TypeItem, typeString: String, item: Item) {
-        /*
-            def verify_icu(clazz):
-                """Verifies that richer ICU replacements are used."""
-                better = {
-                    "java.util.TimeZone": "android.icu.util.TimeZone",
-                    "java.util.Calendar": "android.icu.util.Calendar",
-                    "java.util.Locale": "android.icu.util.ULocale",
-                    "java.util.ResourceBundle": "android.icu.util.UResourceBundle",
-                    "java.util.SimpleTimeZone": "android.icu.util.SimpleTimeZone",
-                    "java.util.StringTokenizer": "android.icu.util.StringTokenizer",
-                    "java.util.GregorianCalendar": "android.icu.util.GregorianCalendar",
-                    "java.lang.Character": "android.icu.lang.UCharacter",
-                    "java.text.BreakIterator": "android.icu.text.BreakIterator",
-                    "java.text.Collator": "android.icu.text.Collator",
-                    "java.text.DecimalFormatSymbols": "android.icu.text.DecimalFormatSymbols",
-                    "java.text.NumberFormat": "android.icu.text.NumberFormat",
-                    "java.text.DateFormatSymbols": "android.icu.text.DateFormatSymbols",
-                    "java.text.DateFormat": "android.icu.text.DateFormat",
-                    "java.text.SimpleDateFormat": "android.icu.text.SimpleDateFormat",
-                    "java.text.MessageFormat": "android.icu.text.MessageFormat",
-                    "java.text.DecimalFormat": "android.icu.text.DecimalFormat",
-                }
-
-                for m in clazz.ctors + clazz.methods:
-                    types = []
-                    types.extend(m.typ)
-                    types.extend(m.args)
-                    for arg in types:
-                        if arg in better:
-                            warn(clazz, m, None, "Type %s should be replaced with richer ICU type %s" % (arg, better[arg]))
-         */
         if (type.primitive) {
             return
         }
@@ -3428,13 +2443,6 @@
     }
 
     private fun checkClone(method: MethodItem) {
-        /*
-            def verify_clone(clazz):
-                """Verify that clone() isn't implemented; see EJ page 61."""
-                for m in clazz.methods:
-                    if m.name == "clone":
-                        error(clazz, m, None, "Provide an explicit copy constructor instead of implementing clone()")
-         */
         if (method.name() == "clone" && method.parameters().isEmpty()) {
             report(
                 NO_CLONE, method,
@@ -3444,25 +2452,6 @@
     }
 
     private fun checkPfd(type: String, item: Item) {
-        /*
-            def verify_pfd(clazz):
-                """Verify that android APIs use PFD over FD."""
-                examine = clazz.ctors + clazz.methods
-                for m in examine:
-                    if m.typ == "java.io.FileDescriptor":
-                        error(clazz, m, "FW11", "Must use ParcelFileDescriptor")
-                    if m.typ == "int":
-                        if "Fd" in m.name or "FD" in m.name or "FileDescriptor" in m.name:
-                            error(clazz, m, "FW11", "Must use ParcelFileDescriptor")
-                    for arg in m.args:
-                        if arg == "java.io.FileDescriptor":
-                            error(clazz, m, "FW11", "Must use ParcelFileDescriptor")
-
-                for f in clazz.fields:
-                    if f.typ == "java.io.FileDescriptor":
-                        error(clazz, f, "FW11", "Must use ParcelFileDescriptor")
-
-         */
         if (item.containingClass()?.qualifiedName() in lowLevelFileClassNames ||
             isServiceDumpMethod(item)
         ) {
@@ -3486,28 +2475,6 @@
     }
 
     private fun checkNumbers(type: String, item: Item) {
-        /*
-            def verify_numbers(clazz):
-                """Discourage small numbers types like short and byte."""
-
-                discouraged = ["short","byte"]
-
-                for c in clazz.ctors:
-                    for arg in c.args:
-                        if arg in discouraged:
-                            warn(clazz, c, "FW12", "Should avoid odd sized primitives; use int instead")
-
-                for f in clazz.fields:
-                    if f.typ in discouraged:
-                        warn(clazz, f, "FW12", "Should avoid odd sized primitives; use int instead")
-
-                for m in clazz.methods:
-                    if m.typ in discouraged:
-                        warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead")
-                    for arg in m.args:
-                        if arg in discouraged:
-                            warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead")
-         */
         if (type == "short" || type == "byte") {
             report(
                 NO_BYTE_OR_SHORT, item,
@@ -3521,19 +2488,6 @@
         methods: Sequence<MethodItem>,
         constructors: Sequence<ConstructorItem>
     ) {
-        /*
-            def verify_singleton(clazz):
-                """Catch singleton objects with constructors."""
-
-                singleton = False
-                for m in clazz.methods:
-                    if m.name.startswith("get") and m.name.endswith("Instance") and " static " in m.raw:
-                        singleton = True
-
-                if singleton:
-                    for c in clazz.ctors:
-                        error(clazz, c, None, "Singleton classes should use getInstance() methods")
-         */
         if (constructors.none()) {
             return
         }
@@ -3573,15 +2527,6 @@
     }
 
     private fun checkTypedef(cls: ClassItem) {
-        /*
-        def verify_intdef(clazz):
-            """intdefs must be @hide, because the constant names cannot be stored in
-               the stubs (only the values are, which is not useful)"""
-            if "@interface" not in clazz.split:
-                return
-            if "@IntDef" in clazz.annotations or "@LongDef" in clazz.annotations:
-                error(clazz, None, None, "@IntDef and @LongDef annotations must be @hide")
-         */
         if (cls.isAnnotationType()) {
             cls.modifiers.annotations().firstOrNull { it.isTypeDefAnnotation() }?.let {
                 report(PUBLIC_TYPEDEF, cls, "Don't expose ${AnnotationItem.simpleName(it)}: ${cls.simpleName()} must be hidden.")
@@ -3590,21 +2535,6 @@
     }
 
     private fun checkUri(typeString: String, item: Item) {
-        /*
-        def verify_uris(clazz):
-            bad = ["java.net.URL", "java.net.URI", "android.net.URL"]
-
-            for f in clazz.fields:
-                if f.typ in bad:
-                    error(clazz, f, None, "Field must be android.net.Uri instead of " + f.typ)
-
-            for m in clazz.methods + clazz.ctors:
-                if m.typ in bad:
-                    error(clazz, m, None, "Must return android.net.Uri instead of " + m.typ)
-                for arg in m.args:
-                    if arg in bad:
-                        error(clazz, m, None, "Argument must take android.net.Uri instead of " + arg)
-         */
         badUriTypes.firstOrNull { typeString.contains(it) }?.let {
             report(
                 ANDROID_URI, item, "Use android.net.Uri instead of $it (${item.describe()})"
@@ -3622,6 +2552,20 @@
         }
     }
 
+    private fun checkMethodSuffixListenableFutureReturn(type: TypeItem, method: MethodItem) {
+        if (type.toTypeString().contains(listenableFuture) &&
+            !method.isConstructor() &&
+            !method.name().endsWith("Async")
+        ) {
+            report(
+                ASYNC_SUFFIX_FUTURE,
+                method,
+                "Methods returning $listenableFuture should have a suffix *Async to " +
+                    "reserve unmodified name for a suspend function"
+            )
+        }
+    }
+
     private fun isInteresting(cls: ClassItem): Boolean {
         val name = cls.qualifiedName()
         for (prefix in options.checkApiIgnorePrefix) {
@@ -3662,6 +2606,8 @@
             "java.util.concurrent.Future"
         )
 
+        private val listenableFuture = "com.google.common.util.concurrent.ListenableFuture"
+
         /**
          * Classes for manipulating file descriptors directly, where using ParcelFileDescriptor
          * isn't required
diff --git a/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt b/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt
index 4f830c5..f9be836 100644
--- a/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt
+++ b/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt
@@ -30,7 +30,6 @@
 import com.android.tools.metalava.model.VisitCandidate
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.intellij.util.containers.Stack
-import java.util.Comparator
 import java.util.function.Predicate
 
 /**
@@ -452,7 +451,7 @@
                         item1.parameterIndex.compareTo((item2 as ParameterItem).parameterIndex)
                     }
                     is AnnotationItem -> {
-                        (item1.qualifiedName() ?: "").compareTo((item2 as AnnotationItem).qualifiedName() ?: "")
+                        (item1.qualifiedName ?: "").compareTo((item2 as AnnotationItem).qualifiedName ?: "")
                     }
                     is PropertyItem -> {
                         item1.name().compareTo((item2 as PropertyItem).name())
diff --git a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
index 5ec87a2..fe085d3 100644
--- a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
+++ b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
@@ -31,6 +31,7 @@
 import com.android.tools.metalava.model.ParameterItem
 import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.model.configuration
+import com.android.tools.metalava.model.psi.PsiItem
 import com.android.tools.metalava.model.text.TextCodebase
 import com.intellij.psi.PsiField
 import java.io.File
@@ -182,7 +183,7 @@
             report(
                 Issues.PARAMETER_NAME_CHANGE,
                 new,
-                "Attempted to remove parameter name from ${describe(new)} in ${describe(new.containingMethod())}"
+                "Attempted to remove parameter name from ${describe(new)}"
             )
         } else if (newName != prevName) {
             report(
@@ -196,7 +197,7 @@
             report(
                 Issues.DEFAULT_VALUE_CHANGE,
                 new,
-                "Attempted to remove default value from ${describe(new)} in ${describe(new.containingMethod())}"
+                "Attempted to remove default value from ${describe(new)}"
             )
         }
 
@@ -823,7 +824,26 @@
         }
 
         if (inherited == null || inherited == new || !inherited.modifiers.isAbstract()) {
-            val error = if (new.modifiers.isAbstract()) Issues.ADDED_ABSTRACT_METHOD else Issues.ADDED_METHOD
+            val error = when {
+                new.modifiers.isAbstract() -> Issues.ADDED_ABSTRACT_METHOD
+                new.containingClass().isInterface() -> when {
+                    new.modifiers.isStatic() -> Issues.ADDED_METHOD
+                    new.modifiers.isDefault() -> {
+                        // Hack to always mark added Kotlin interface methods as abstract until
+                        // we properly support JVM default methods for Kotlin. This has to check
+                        // if it's a PsiItem because TextItem doesn't support isKotlin.
+                        //
+                        // TODO(b/200077254): Remove Kotlin special case
+                        if (new is PsiItem && new.isKotlin()) {
+                            Issues.ADDED_ABSTRACT_METHOD
+                        } else {
+                            Issues.ADDED_METHOD
+                        }
+                    }
+                    else -> Issues.ADDED_ABSTRACT_METHOD
+                }
+                else -> Issues.ADDED_METHOD
+            }
             handleAdded(error, new)
         }
     }
diff --git a/src/main/java/com/android/tools/metalava/Constants.kt b/src/main/java/com/android/tools/metalava/Constants.kt
index 6317850..b3f5ddf 100644
--- a/src/main/java/com/android/tools/metalava/Constants.kt
+++ b/src/main/java/com/android/tools/metalava/Constants.kt
@@ -47,3 +47,9 @@
 const val ENV_VAR_METALAVA_DUMP_ARGV = "METALAVA_DUMP_ARGV"
 const val ENV_VAR_METALAVA_PREPEND_ARGS = "METALAVA_PREPEND_ARGS"
 const val ENV_VAR_METALAVA_APPEND_ARGS = "METALAVA_APPEND_ARGS"
+
+const val JAVA_RETENTION = "java.lang.annotation.Retention"
+const val KT_RETENTION = "kotlin.annotation.Retention"
+
+fun isRetention(qualifiedName: String?): Boolean =
+    JAVA_RETENTION == qualifiedName || KT_RETENTION == qualifiedName
diff --git a/src/main/java/com/android/tools/metalava/DocAnalyzer.kt b/src/main/java/com/android/tools/metalava/DocAnalyzer.kt
index b43209b..5f5a363 100644
--- a/src/main/java/com/android/tools/metalava/DocAnalyzer.kt
+++ b/src/main/java/com/android/tools/metalava/DocAnalyzer.kt
@@ -147,7 +147,7 @@
             private fun findThreadAnnotations(annotations: List<AnnotationItem>): List<String> {
                 var result: MutableList<String>? = null
                 for (annotation in annotations) {
-                    val name = annotation.qualifiedName()
+                    val name = annotation.qualifiedName
                     if (name != null && name.endsWith("Thread") &&
                         (
                             name.startsWith(ANDROID_SUPPORT_ANNOTATION_PREFIX) ||
@@ -184,7 +184,7 @@
                 depth: Int,
                 visitedClasses: MutableSet<String> = mutableSetOf()
             ) {
-                val name = annotation.qualifiedName()
+                val name = annotation.qualifiedName
                 if (name == null || name.startsWith(JAVA_LANG_PREFIX)) {
                     // Ignore java.lang.Retention etc.
                     return
@@ -226,7 +226,7 @@
                             "Unbounded recursion, processing annotation ${annotation.toSource()} " +
                                 "in $item in ${item.sourceFile()} "
                         )
-                    } else if (nested.qualifiedName() !in visitedClasses) {
+                    } else if (nested.qualifiedName !in visitedClasses) {
                         handleAnnotation(nested, item, depth + 1, visitedClasses)
                     }
                 }
@@ -250,9 +250,17 @@
                     // Some docs already specifically talk about null policy; in that case,
                     // don't include the docs (since it may conflict with more specific conditions
                     // outlined in the docs).
-                    if (item.documentation.contains("null") &&
-                        mentionsNull.matcher(item.documentation).find()
-                    ) {
+                    val doc =
+                        if (item is ParameterItem) {
+                            item.containingMethod().findTagDocumentation("param", item.name())
+                                ?: ""
+                        } else if (item is MethodItem) {
+                            // Don't inspect param docs (and other tags) for this purpose.
+                            item.findMainDocumentation() + (item.findTagDocumentation("return") ?: "")
+                        } else {
+                            item.documentation
+                        }
+                    if (doc.contains("null") && mentionsNull.matcher(doc).find()) {
                         return
                     }
                 }
@@ -284,7 +292,7 @@
                 var values: List<AnnotationAttributeValue>? = null
                 var any = false
                 var conditional = false
-                for (attribute in annotation.attributes()) {
+                for (attribute in annotation.attributes) {
                     when (attribute.name) {
                         "value", "allOf" -> {
                             values = attribute.leafValues()
diff --git a/src/main/java/com/android/tools/metalava/Driver.kt b/src/main/java/com/android/tools/metalava/Driver.kt
index dcbf6d7..59e3a07 100644
--- a/src/main/java/com/android/tools/metalava/Driver.kt
+++ b/src/main/java/com/android/tools/metalava/Driver.kt
@@ -251,6 +251,7 @@
         } else {
             return
         }
+    codebase.apiLevel = options.currentApiLevel + if (options.currentCodeName != null) 1 else 0
     options.manifest?.let { codebase.manifest = it }
 
     if (options.verbose) {
@@ -269,11 +270,13 @@
         ApiGenerator.generate(apiLevelJars, options.firstApiLevel, androidApiLevelXml, codebase)
     }
 
-    if (options.docStubsDir != null && codebase.supportsDocumentation()) {
+    if (options.docStubsDir != null || options.enhanceDocumentation) {
+        if (!codebase.supportsDocumentation()) {
+            error("Codebase does not support documentation, so it cannot be enhanced.")
+        }
         progress("Enhancing docs: ")
         val docAnalyzer = DocAnalyzer(codebase)
         docAnalyzer.enhance()
-
         val applyApiLevelsXml = options.applyApiLevelsXml
         if (applyApiLevelsXml != null) {
             progress("Applying API levels")
@@ -746,8 +749,7 @@
     javaLanguageLevel: LanguageLevel = options.javaLanguageLevel,
     kotlinLanguageLevel: LanguageVersionSettings = options.kotlinLanguageLevel,
     manifest: File? = options.manifest,
-    currentApiLevel: Int = options.currentApiLevel + if (options.currentCodeName != null) 1 else 0,
-    useKtModel: Boolean = options.useKtModel
+    enableKotlinPsi: Boolean = options.enableKotlinPsi
 ): PsiBasedCodebase {
     val sourceRoots = mutableListOf<File>()
     sourcePath.filterTo(sourceRoots) { it.path.isNotBlank() }
@@ -778,10 +780,9 @@
     val units = Extractor.createUnitsForFiles(environment.ideaProject, sources)
     val packageDocs = gatherPackageJavadoc(sources, sourceRoots)
 
-    val codebase = PsiBasedCodebase(rootDir, description)
-    codebase.initialize(environment, units, packageDocs, useKtModel)
+    val codebase = PsiBasedCodebase(rootDir, description, enableKotlinPsi)
+    codebase.initialize(environment, units, packageDocs)
     codebase.manifest = manifest
-    codebase.apiLevel = currentApiLevel
     return codebase
 }
 
diff --git a/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt b/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt
index d53af19..df0ec4b 100644
--- a/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt
+++ b/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt
@@ -36,6 +36,8 @@
 import com.android.tools.metalava.model.psi.UAnnotationItem
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.google.common.xml.XmlEscapers
+import com.intellij.lang.jvm.annotation.JvmAnnotationConstantValue
+import com.intellij.lang.jvm.annotation.JvmAnnotationEnumFieldValue
 import com.intellij.psi.JavaRecursiveElementVisitor
 import com.intellij.psi.PsiAnnotation
 import com.intellij.psi.PsiClass
@@ -51,8 +53,8 @@
 import org.jetbrains.uast.UReferenceExpression
 import org.jetbrains.uast.USimpleNameReferenceExpression
 import org.jetbrains.uast.UastEmptyExpression
-import org.jetbrains.uast.java.JavaUAnnotation
-import org.jetbrains.uast.java.expressions.JavaUAnnotationCallExpression
+import org.jetbrains.uast.UastFacade
+import org.jetbrains.uast.toUElement
 import java.io.BufferedOutputStream
 import java.io.File
 import java.io.FileOutputStream
@@ -186,7 +188,7 @@
     /** For a given item, extract the relevant annotations for that item */
     private fun checkItem(item: Item) {
         for (annotation in item.modifiers.annotations()) {
-            val qualifiedName = annotation.qualifiedName() ?: continue
+            val qualifiedName = annotation.qualifiedName ?: continue
             if (qualifiedName.startsWith(JAVA_LANG_PREFIX) ||
                 qualifiedName.startsWith(ANDROIDX_ANNOTATION_PREFIX) ||
                 qualifiedName.startsWith(ANDROID_ANNOTATION_PREFIX) ||
@@ -195,7 +197,7 @@
                 if (annotation.isTypeDefAnnotation()) {
                     // Imported typedef
                     addItem(item, AnnotationHolder(null, annotation, null))
-                } else if (annotation.targets().contains(AnnotationTarget.EXTERNAL_ANNOTATIONS_FILE) &&
+                } else if (annotation.targets.contains(AnnotationTarget.EXTERNAL_ANNOTATIONS_FILE) &&
                     !options.includeSourceRetentionAnnotations
                 ) {
                     addItem(item, AnnotationHolder(null, annotation, null))
@@ -332,8 +334,15 @@
         val modifierList = cls.modifierList
         if (modifierList != null) {
             for (psiAnnotation in modifierList.annotations) {
-                val annotation = JavaUAnnotation.wrap(psiAnnotation)
-                if (hasSourceRetention(annotation)) {
+                val uAnnotation = psiAnnotation.toUElement(UAnnotation::class.java)
+                val hasSourceRetention =
+                    if (uAnnotation != null) {
+                        hasSourceRetention(uAnnotation)
+                    } else {
+                        // There is a hole in UAST conversion. If so, fall back to using PSI.
+                        hasSourceRetention(psiAnnotation)
+                    }
+                if (hasSourceRetention) {
                     return true
                 }
             }
@@ -344,7 +353,7 @@
 
     private fun hasSourceRetention(annotation: UAnnotation): Boolean {
         val qualifiedName = annotation.qualifiedName
-        if ("java.lang.annotation.Retention" == qualifiedName || "kotlin.annotation.Retention" == qualifiedName) {
+        if (isRetention(qualifiedName)) {
             val attributes = annotation.attributeValues
             if (attributes.size != 1) {
                 reporter.report(
@@ -359,13 +368,13 @@
                     val element = value.resolve()
                     if (element is PsiField) {
                         val field = element as PsiField?
-                        if ("SOURCE" == field!!.name) {
+                        if (SOURCE == field!!.name) {
                             return true
                         }
                     }
                 } catch (t: Throwable) {
                     val s = value.asSourceString()
-                    return s.contains("SOURCE")
+                    return s.contains(SOURCE)
                 }
             }
         }
@@ -373,6 +382,28 @@
         return false
     }
 
+    private fun hasSourceRetention(psiAnnotation: PsiAnnotation): Boolean {
+        val qualifiedName = psiAnnotation.qualifiedName
+        if (isRetention(qualifiedName)) {
+            val attributes = psiAnnotation.parameterList.attributes
+            if (attributes.size != 1) {
+                reporter.report(
+                    Issues.ANNOTATION_EXTRACTION, psiAnnotation,
+                    "Expected exactly one parameter passed to @Retention"
+                )
+                return false
+            }
+            return when (val value = attributes[0].attributeValue) {
+                is JvmAnnotationEnumFieldValue -> SOURCE == value.fieldName
+                is JvmAnnotationConstantValue ->
+                    (value.constantValue as? String)?.contains(SOURCE) ?: false
+                else -> false
+            }
+        }
+
+        return false
+    }
+
     /**
      * A writer which stores all its contents into a string and has the ability to mark a certain
      * freeze point and then reset back to it
@@ -478,10 +509,10 @@
                 is UAnnotationItem -> annotationItem.uAnnotation
                 is PsiAnnotationItem ->
                     // Imported annotation
-                    JavaUAnnotation.wrap(annotationItem.psiAnnotation)
+                    annotationItem.psiAnnotation.toUElement(UAnnotation::class.java) ?: return
                 else -> return
             }
-        val qualifiedName = annotationItem.qualifiedName()
+        val qualifiedName = annotationItem.qualifiedName
 
         writer.mark()
         writer.print("    <annotation name=\"")
@@ -522,14 +553,17 @@
                 // but we'll counteract that on the read-annotations side.
                 val annotation = expression as UAnnotation
                 attributes = annotation.attributeValues
-            } else if (expression is JavaUAnnotationCallExpression) {
-                val annotation = expression.uAnnotation
-                attributes = annotation.attributeValues
+            } else if (expression is UCallExpression) {
+                val nestedPsi = expression.sourcePsi as? PsiAnnotation
+                val annotation = nestedPsi?.let {
+                    UastFacade.convertElement(it, expression, UAnnotation::class.java)
+                } as? UAnnotation
+                annotation?.attributeValues?.let { attributes = it }
             } else if (expression is UastEmptyExpression && attributes[0].sourcePsi is PsiNameValuePair) {
                 val memberValue = (attributes[0].sourcePsi as PsiNameValuePair).value
                 if (memberValue is PsiAnnotation) {
-                    val annotation = JavaUAnnotation.wrap(memberValue)
-                    attributes = annotation.attributeValues
+                    val annotation = memberValue.toUElement(UAnnotation::class.java)
+                    annotation?.attributeValues?.let { attributes = it }
                 }
             }
         }
@@ -592,4 +626,8 @@
 
     /** Whether to sort annotation attributes (otherwise their declaration order is used)  */
     private val sortAnnotations: Boolean = true
+
+    companion object {
+        private const val SOURCE = "SOURCE"
+    }
 }
diff --git a/src/main/java/com/android/tools/metalava/Issues.kt b/src/main/java/com/android/tools/metalava/Issues.kt
index 066d79c..b2ee7fc 100644
--- a/src/main/java/com/android/tools/metalava/Issues.kt
+++ b/src/main/java/com/android/tools/metalava/Issues.kt
@@ -238,6 +238,7 @@
         Issue(Severity.WARNING, Category.API_LINT, "builders-nonnull-constructors")
     val NO_SETTINGS_PROVIDER = Issue(Severity.HIDDEN, Category.API_LINT, "no-settings-provider")
     val NULLABLE_COLLECTION = Issue(Severity.WARNING, Category.API_LINT, "methods-prefer-non-null-collections")
+    val ASYNC_SUFFIX_FUTURE = Issue(Severity.ERROR, Category.API_LINT)
 
     fun findIssueById(id: String?): Issue? {
         return nameToIssue[id]
diff --git a/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt b/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt
index fb9feee..3000831 100644
--- a/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt
+++ b/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt
@@ -30,7 +30,7 @@
 import org.jetbrains.kotlin.psi.KtProperty
 import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
 import org.jetbrains.kotlin.psi.psiUtil.isPublic
-import org.jetbrains.uast.kotlin.KotlinUField
+import org.jetbrains.uast.UField
 
 // Enforces the interoperability guidelines outlined in
 //   https://android.github.io/kotlin-guides/interop.html
@@ -92,7 +92,7 @@
         if (exceptions.isEmpty()) {
             return
         }
-        val doc = method.documentation
+        val doc = method.documentation.ifEmpty { method.property?.documentation.orEmpty() }
         for (exception in exceptions.sortedBy { it.qualifiedName() }) {
             val checked = !(
                 exception.extends("java.lang.RuntimeException") ||
@@ -102,7 +102,7 @@
                 val annotation = method.modifiers.findAnnotation("kotlin.jvm.Throws")
                 if (annotation != null) {
                     // There can be multiple values
-                    for (attribute in annotation.attributes()) {
+                    for (attribute in annotation.attributes) {
                         for (v in attribute.leafValues()) {
                             val source = v.toSource()
                             if (source.endsWith(exception.simpleName() + "::class")) {
@@ -133,7 +133,7 @@
             // dip into Kotlin PSI to figure out if this field was really declared in
             // a companion object
             val psi = field.psi()
-            if (psi is KotlinUField) {
+            if (psi is UField) {
                 val sourcePsi = psi.sourcePsi
                 if (sourcePsi is KtProperty) {
                     val companionClassName = sourcePsi.containingClassOrObject?.name
diff --git a/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt b/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt
index ee650a7..a7b5df0 100644
--- a/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt
+++ b/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt
@@ -134,7 +134,7 @@
     }
 
     private fun isNullFromTypeParam(it: AnnotationItem) =
-        it.qualifiedName()?.endsWith("NullFromTypeParam") == true
+        it.qualifiedName?.endsWith("NullFromTypeParam") == true
 
     private fun isAnyNullabilityAnnotation(it: AnnotationItem) =
         it.isNullnessAnnotation() || isNullFromTypeParam(it)
diff --git a/src/main/java/com/android/tools/metalava/Options.kt b/src/main/java/com/android/tools/metalava/Options.kt
index 603730c..9e81d24 100644
--- a/src/main/java/com/android/tools/metalava/Options.kt
+++ b/src/main/java/com/android/tools/metalava/Options.kt
@@ -80,6 +80,7 @@
 const val ARG_EXTRACT_ANNOTATIONS = "--extract-annotations"
 const val ARG_EXCLUDE_ALL_ANNOTATIONS = "--exclude-all-annotations"
 const val ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS = "--exclude-documentation-from-stubs"
+const val ARG_ENHANCE_DOCUMENTATION = "--enhance-documentation"
 const val ARG_HIDE_PACKAGE = "--hide-package"
 const val ARG_MANIFEST = "--manifest"
 const val ARG_MIGRATE_NULLNESS = "--migrate-nullness"
@@ -166,7 +167,7 @@
 const val ARG_STRICT_INPUT_FILES_WARN = "--strict-input-files:warn"
 const val ARG_STRICT_INPUT_FILES_EXEMPT = "--strict-input-files-exempt"
 const val ARG_REPEAT_ERRORS_MAX = "--repeat-errors-max"
-const val ARG_KOTLIN_MODEL = "--kotlin-model"
+const val ARG_ENABLE_KOTLIN_PSI = "--enable-kotlin-psi"
 
 class Options(
     private val args: Array<String>,
@@ -252,6 +253,12 @@
     var includeDocumentationInStubs = true
 
     /**
+     * Enhance documentation in various ways, for example auto-generating documentation based on
+     * source annotations present in the code. This is implied by --doc-stubs.
+     */
+    var enhanceDocumentation = false
+
+    /**
      * Whether metalava is invoked as part of updating the API files. When this is true, metalava
      * should *cancel* various other flags that are also being passed in, such as --check-compatibility.
      * This is there to ease integration in the build system: for a given target, the build system will
@@ -504,7 +511,7 @@
     /** Whether to use the experimental KtPsi model on .kt source files instead of existing
      * PSI implementation
      */
-    var useKtModel = false
+    var enableKotlinPsi = false
 
     /**
      * mapping from API level to android.jar files, if computing API levels
@@ -790,7 +797,7 @@
                     throw DriverException(stdout = "$PROGRAM_NAME version: ${Version.VERSION}")
                 }
 
-                ARG_KOTLIN_MODEL -> useKtModel = true
+                ARG_ENABLE_KOTLIN_PSI -> enableKotlinPsi = true
 
                 // For now we don't distinguish between bootclasspath and classpath
                 ARG_CLASS_PATH, "-classpath", "-bootclasspath" -> {
@@ -907,6 +914,7 @@
                 ARG_EXCLUDE_ALL_ANNOTATIONS -> generateAnnotations = false
 
                 ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS -> includeDocumentationInStubs = false
+                ARG_ENHANCE_DOCUMENTATION -> enhanceDocumentation = true
 
                 // Note that this only affects stub generation, not signature files.
                 // For signature files, clear the compatibility mode
@@ -2260,9 +2268,8 @@
 
             "$ARG_PROGUARD <file>", "Write a ProGuard keep file for the API",
             "$ARG_SDK_VALUES <dir>", "Write SDK values files to the given directory",
-            ARG_KOTLIN_MODEL,
-            "[CURRENTLY EXPERIMENTAL] If set, use Kotlin PSI for Kotlin " +
-                "instead of UAST",
+            ARG_ENABLE_KOTLIN_PSI,
+            "[EXPERIMENTAL] If set, use Kotlin PSI for Kotlin instead of UAST",
 
             "", "\nGenerating Stubs:",
             "$ARG_STUBS <dir>", "Generate stub source files for the API",
@@ -2284,6 +2291,9 @@
             "$ARG_EXCLUDE_ANNOTATION <annotation classes>",
             "A comma separated list of fully qualified names of " +
                 "annotation classes that must be stripped from metalava's outputs.",
+            ARG_ENHANCE_DOCUMENTATION,
+            "Enhance documentation in various ways, for example auto-generating documentation based on source " +
+                "annotations present in the code. This is implied by --doc-stubs.",
             ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS,
             "Exclude element documentation (javadoc and kdoc) " +
                 "from the generated stubs. (Copyright notices are not affected by this, they are always included. " +
diff --git a/src/main/java/com/android/tools/metalava/Reporter.kt b/src/main/java/com/android/tools/metalava/Reporter.kt
index 2fdc6e6..0c691eb 100644
--- a/src/main/java/com/android/tools/metalava/Reporter.kt
+++ b/src/main/java/com/android/tools/metalava/Reporter.kt
@@ -33,8 +33,11 @@
 import com.intellij.psi.PsiCompiledElement
 import com.intellij.psi.PsiElement
 import com.intellij.psi.PsiModifierListOwner
+import com.intellij.psi.PsiNameIdentifierOwner
 import com.intellij.psi.impl.light.LightElement
-import org.jetbrains.uast.kotlin.KotlinUClass
+import org.jetbrains.kotlin.psi.KtModifierListOwner
+import org.jetbrains.uast.UClass
+import org.jetbrains.uast.UElement
 import java.io.File
 import java.io.PrintWriter
 
@@ -185,9 +188,9 @@
         item ?: return false
 
         for (annotation in item.modifiers.annotations()) {
-            val annotationName = annotation.qualifiedName()
+            val annotationName = annotation.qualifiedName
             if (annotationName != null && annotationName in SUPPRESS_ANNOTATIONS) {
-                for (attribute in annotation.attributes()) {
+                for (attribute in annotation.attributes) {
                     // Assumption that all annotations in SUPPRESS_ANNOTATIONS only have
                     // one attribute such as value/names that is varargs of String
                     val value = attribute.value
@@ -232,7 +235,7 @@
     private fun getTextRange(element: PsiElement): TextRange? {
         var range: TextRange? = null
 
-        if (element is KotlinUClass) {
+        if (element is UClass) {
             range = element.sourcePsi?.textRange
         } else if (element is PsiCompiledElement) {
             if (element is LightElement) {
@@ -248,7 +251,7 @@
         return range
     }
 
-    private fun elementToLocation(element: PsiElement?, includeDocs: Boolean = true): String? {
+    private fun elementToLocation(element: PsiElement?): String? {
         element ?: return null
         val psiFile = element.containingFile ?: return null
         val virtualFile = psiFile.virtualFile ?: return null
@@ -256,17 +259,20 @@
 
         val path = (rootFolder?.toPath()?.relativize(file.toPath()) ?: file.toPath()).toString()
 
-        // Skip doc comments for classes, methods and fields; we usually want to point right to
-        // the class/method/field definition
-        val rangeElement = if (!includeDocs && element is PsiModifierListOwner) {
-            element.modifierList ?: element
-        } else
-            element
+        // Unwrap UAST for accurate Kotlin line numbers (UAST synthesizes text offsets sometimes)
+        val sourceElement = (element as? UElement)?.sourcePsi ?: element
+
+        // Skip doc comments for classes, methods and fields by pointing at the line where the
+        // element's name is or falling back to the first line of its modifier list (which may
+        // include annotations) or lastly to the start of the element itself
+        val rangeElement = (sourceElement as? PsiNameIdentifierOwner)?.nameIdentifier
+            ?: (sourceElement as? KtModifierListOwner)?.modifierList
+            ?: (sourceElement as? PsiModifierListOwner)?.modifierList
+            ?: sourceElement
 
         val range = getTextRange(rangeElement)
         val lineNumber = if (range == null) {
-            // No source offsets, use invalid line number
-            -1
+            -1 // No source offsets, use invalid line number
         } else {
             getLineNumber(psiFile.text, range.startOffset) + 1
         }
diff --git a/src/main/java/com/android/tools/metalava/SdkFileWriter.kt b/src/main/java/com/android/tools/metalava/SdkFileWriter.kt
index 2cfc372..6d71da5 100644
--- a/src/main/java/com/android/tools/metalava/SdkFileWriter.kt
+++ b/src/main/java/com/android/tools/metalava/SdkFileWriter.kt
@@ -77,7 +77,7 @@
                 val value = field.initialValue() ?: continue
                 val annotations = field.modifiers.annotations()
                 for (annotation in annotations) {
-                    if (SDK_CONSTANT_ANNOTATION == annotation.qualifiedName()) {
+                    if (SDK_CONSTANT_ANNOTATION == annotation.qualifiedName) {
                         val resolved =
                             annotation.findAttribute(null)?.leafValues()?.firstOrNull()?.resolve() as? FieldItem
                                 ?: continue
@@ -99,11 +99,11 @@
                 val annotations = clazz.modifiers.annotations()
                 if (annotations.isNotEmpty()) {
                     for (annotation in annotations) {
-                        if (SDK_WIDGET_ANNOTATION == annotation.qualifiedName()) {
+                        if (SDK_WIDGET_ANNOTATION == annotation.qualifiedName) {
                             widgets.add(clazz)
                             annotated = true
                             break
-                        } else if (SDK_LAYOUT_ANNOTATION == annotation.qualifiedName()) {
+                        } else if (SDK_LAYOUT_ANNOTATION == annotation.qualifiedName) {
                             layouts.add(clazz)
                             annotated = true
                             break
diff --git a/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
index 16ae373..df72723 100644
--- a/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
@@ -59,10 +59,10 @@
     val codebase: Codebase
 
     /** Fully qualified name of the annotation */
-    fun qualifiedName(): String?
+    val qualifiedName: String?
 
     /** Fully qualified name of the annotation (prior to name mapping) */
-    fun originalName(): String?
+    val originalName: String?
 
     /** Generates source code for this annotation (using fully qualified names) */
     fun toSource(
@@ -71,10 +71,10 @@
     ): String
 
     /** The applicable targets for this annotation */
-    fun targets(): Set<AnnotationTarget>
+    val targets: Set<AnnotationTarget>
 
     /** Attributes of the annotation (may be empty) */
-    fun attributes(): List<AnnotationAttribute>
+    val attributes: List<AnnotationAttribute>
 
     /** True if this annotation represents @Nullable or @NonNull (or some synonymous annotation) */
     fun isNullnessAnnotation(): Boolean {
@@ -83,17 +83,17 @@
 
     /** True if this annotation represents @Nullable (or some synonymous annotation) */
     fun isNullable(): Boolean {
-        return isNullableAnnotation(qualifiedName() ?: return false)
+        return isNullableAnnotation(qualifiedName ?: return false)
     }
 
     /** True if this annotation represents @NonNull (or some synonymous annotation) */
     fun isNonNull(): Boolean {
-        return isNonNullAnnotation(qualifiedName() ?: return false)
+        return isNonNullAnnotation(qualifiedName ?: return false)
     }
 
     /** True if this annotation represents @IntDef, @LongDef or @StringDef */
     fun isTypeDefAnnotation(): Boolean {
-        val name = qualifiedName() ?: return false
+        val name = qualifiedName ?: return false
         if (!(name.endsWith("Def"))) {
             return false
         }
@@ -112,7 +112,7 @@
      * The parameter name should be the default attribute or "value".
      */
     fun isParameterName(): Boolean {
-        return qualifiedName()?.endsWith(".ParameterName") ?: return false
+        return qualifiedName?.endsWith(".ParameterName") ?: return false
     }
 
     /**
@@ -120,30 +120,30 @@
      * The default value should be the default attribute or "value".
      */
     fun isDefaultValue(): Boolean {
-        return qualifiedName()?.endsWith(".DefaultValue") ?: return false
+        return qualifiedName?.endsWith(".DefaultValue") ?: return false
     }
 
     /** Returns the given named attribute if specified */
     fun findAttribute(name: String?): AnnotationAttribute? {
         val actualName = name ?: ATTR_VALUE
-        return attributes().firstOrNull { it.name == actualName }
+        return attributes.firstOrNull { it.name == actualName }
     }
 
     /** Find the class declaration for the given annotation */
     fun resolve(): ClassItem? {
-        return codebase.findClass(qualifiedName() ?: return null)
+        return codebase.findClass(qualifiedName ?: return null)
     }
 
     /** If this annotation has a typedef annotation associated with it, return it */
     fun findTypedefAnnotation(): AnnotationItem? {
-        val className = originalName() ?: return null
+        val className = originalName ?: return null
         return codebase.findClass(className)?.modifiers?.annotations()?.firstOrNull { it.isTypeDefAnnotation() }
     }
 
     /** Returns the retention of this annotation */
     val retention: AnnotationRetention
         get() {
-            val name = qualifiedName()
+            val name = qualifiedName
             if (name != null) {
                 val cls = codebase.findClass(name) ?: (codebase as? PsiBasedCodebase)?.findOrCreateClass(name)
                 if (cls != null) {
@@ -159,8 +159,7 @@
     companion object {
         /** The simple name of an annotation, which is the annotation name (not qualified name) prefixed by @ */
         fun simpleName(item: AnnotationItem): String {
-            val qualifiedName = item.qualifiedName() ?: return ""
-            return "@${qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1)}"
+            return item.qualifiedName?.let { "@${it.substringAfterLast('.')}" }.orEmpty()
         }
 
         /**
@@ -417,7 +416,7 @@
             annotation: AnnotationItem,
             classFinder: (String) -> ClassItem?
         ): Set<AnnotationTarget> {
-            val qualifiedName = annotation.qualifiedName() ?: return NO_ANNOTATION_TARGETS
+            val qualifiedName = annotation.qualifiedName ?: return NO_ANNOTATION_TARGETS
             if (options.passThroughAnnotations.contains(qualifiedName)) {
                 return ANNOTATION_IN_ALL_STUBS
             }
@@ -440,6 +439,11 @@
                 "android.view.ViewDebug.ExportedProperty",
                 "android.view.ViewDebug.CapturedViewProperty" -> return ANNOTATION_STUBS_ONLY
 
+                // Retained in the sdk/jar stub source code so that SdkConstant files can be extracted
+                // from those. This is useful for modularizing the main SDK stubs without having to
+                // add a separate module SDK artifact for sdk constants.
+                "android.annotation.SdkConstant" -> return ANNOTATION_SDK_STUBS_ONLY
+
                 // Skip known annotations that we (a) never want in external annotations and (b) we are
                 // specially overwriting anyway in the stubs (and which are (c) not API significant)
                 "com.android.modules.annotation.MinSdk",
@@ -676,15 +680,8 @@
 
 /** Default implementation of an annotation item */
 abstract class DefaultAnnotationItem(override val codebase: Codebase) : AnnotationItem {
-    protected var targets: Set<AnnotationTarget>? = null
-
-    override fun targets(): Set<AnnotationTarget> {
-        if (targets == null) {
-            targets = AnnotationItem.computeTargets(this) { className ->
-                codebase.findClass(className)
-            }
-        }
-        return targets!!
+    override val targets: Set<AnnotationTarget> by lazy {
+        AnnotationItem.computeTargets(this, codebase::findClass)
     }
 }
 
diff --git a/src/main/java/com/android/tools/metalava/model/AnnotationTarget.kt b/src/main/java/com/android/tools/metalava/model/AnnotationTarget.kt
index c124819..772cb0b 100644
--- a/src/main/java/com/android/tools/metalava/model/AnnotationTarget.kt
+++ b/src/main/java/com/android/tools/metalava/model/AnnotationTarget.kt
@@ -107,3 +107,9 @@
     AnnotationTarget.DOC_STUBS_FILE,
     AnnotationTarget.INTERNAL
 )
+
+/** Write it only into the SDK stubs, but don't track it in the signature files. */
+val ANNOTATION_SDK_STUBS_ONLY = setOf(
+    AnnotationTarget.SDK_STUBS_FILE,
+    AnnotationTarget.INTERNAL
+)
diff --git a/src/main/java/com/android/tools/metalava/model/Item.kt b/src/main/java/com/android/tools/metalava/model/Item.kt
index bc07fd5..f309fe4 100644
--- a/src/main/java/com/android/tools/metalava/model/Item.kt
+++ b/src/main/java/com/android/tools/metalava/model/Item.kt
@@ -94,8 +94,11 @@
      */
     var documentation: String
 
-    /** Looks up docs for a specific tag */
-    fun findTagDocumentation(tag: String): String?
+    /**
+     * Looks up docs for the first instance of a specific javadoc tag having
+     * the (optionally) provided value (e.g. parameter name).
+     */
+    fun findTagDocumentation(tag: String, value: String? = null): String?
 
     /**
      * A rank used for sorting. This allows signature files etc to
diff --git a/src/main/java/com/android/tools/metalava/model/MethodItem.kt b/src/main/java/com/android/tools/metalava/model/MethodItem.kt
index 6516719..c85f6c6 100644
--- a/src/main/java/com/android/tools/metalava/model/MethodItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/MethodItem.kt
@@ -46,6 +46,9 @@
 
     override fun type(): TypeItem? = returnType()
 
+    /** Returns the main documentation for the method (the documentation before any tags). */
+    fun findMainDocumentation(): String
+
     /**
      * Like [internalName] but is the desc-portion of the internal signature,
      * e.g. for the method "void create(int x, int y)" the internal name of
diff --git a/src/main/java/com/android/tools/metalava/model/ModifierList.kt b/src/main/java/com/android/tools/metalava/model/ModifierList.kt
index 2f27cf2..e589401 100644
--- a/src/main/java/com/android/tools/metalava/model/ModifierList.kt
+++ b/src/main/java/com/android/tools/metalava/model/ModifierList.kt
@@ -166,7 +166,7 @@
             return false
         }
         return annotations().any { annotation ->
-            options.hideMetaAnnotations.contains(annotation.qualifiedName())
+            options.hideMetaAnnotations.contains(annotation.qualifiedName)
         }
     }
 
@@ -179,7 +179,7 @@
     fun findAnnotation(qualifiedName: String): AnnotationItem? {
         val mappedName = AnnotationItem.mapName(codebase, qualifiedName)
         return annotations().firstOrNull {
-            mappedName == it.qualifiedName()
+            mappedName == it.qualifiedName
         }
     }
 
@@ -433,7 +433,7 @@
 
             // Ensure stable signature file order
             if (annotations.size > 1) {
-                annotations = annotations.sortedBy { it.qualifiedName() }
+                annotations = annotations.sortedBy { it.qualifiedName }
             }
 
             if (annotations.isNotEmpty()) {
@@ -446,13 +446,13 @@
                     }
 
                     var printAnnotation = annotation
-                    if (!annotation.targets().contains(target)) {
+                    if (!annotation.targets.contains(target)) {
                         continue
                     } else if ((annotation.isNullnessAnnotation())) {
                         if (skipNullnessAnnotations) {
                             continue
                         }
-                    } else if (annotation.qualifiedName() == "java.lang.Deprecated") {
+                    } else if (annotation.qualifiedName == "java.lang.Deprecated") {
                         // Special cased in stubs and signature files: emitted first
                         continue
                     } else if (options.typedefMode == Options.TypedefMode.INLINE) {
@@ -461,12 +461,12 @@
                             printAnnotation = typedef
                         }
                     } else if (options.typedefMode == Options.TypedefMode.REFERENCE &&
-                        annotation.targets() === ANNOTATION_SIGNATURE_ONLY &&
+                        annotation.targets === ANNOTATION_SIGNATURE_ONLY &&
                         annotation.findTypedefAnnotation() != null
                     ) {
                         // For annotation references, only include the simple name
                         writer.write("@")
-                        writer.write(annotation.resolve()?.simpleName() ?: annotation.qualifiedName()!!)
+                        writer.write(annotation.resolve()?.simpleName() ?: annotation.qualifiedName!!)
                         if (separateLines) {
                             writer.write("\n")
                         } else {
@@ -477,11 +477,11 @@
 
                     // Optionally filter out duplicates
                     if (index > 0 && filterDuplicates) {
-                        val qualifiedName = annotation.qualifiedName()
+                        val qualifiedName = annotation.qualifiedName
                         var found = false
                         for (i in 0 until index) {
                             val prev = annotations[i]
-                            if (prev.qualifiedName() == qualifiedName) {
+                            if (prev.qualifiedName == qualifiedName) {
                                 found = true
                                 break
                             }
diff --git a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
index 651f8aa..95792d7 100644
--- a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
@@ -28,7 +28,7 @@
     val setter: MethodItem?
         get() = null
 
-    /** The backing field for this property, if available; inverse of [FieldItem.property] */
+    /** The backing field for this property, if it exists; inverse of [FieldItem.property] */
     val backingField: FieldItem?
         get() = null
 
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinAnnotationItem.kt
deleted file mode 100644
index 7e99b68..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinAnnotationItem.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.AnnotationAttribute
-import com.android.tools.metalava.model.AnnotationTarget
-import com.android.tools.metalava.model.DefaultAnnotationItem
-import com.android.tools.metalava.model.psi.PsiBasedCodebase
-import org.jetbrains.kotlin.psi.KtAnnotation
-
-class KotlinAnnotationItem private constructor(
-    override val codebase: PsiBasedCodebase,
-    val ktAnnotation: KtAnnotation,
-    private val originalName: String?
-) : DefaultAnnotationItem(codebase) {
-    override fun qualifiedName(): String? {
-        TODO("Not yet implemented")
-    }
-
-    override fun originalName(): String? {
-        TODO("Not yet implemented")
-    }
-
-    override fun toSource(target: AnnotationTarget, showDefaultAttrs: Boolean): String {
-        TODO("Not yet implemented")
-    }
-
-    override fun attributes(): List<AnnotationAttribute> {
-        TODO("Not yet implemented")
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinClassItem.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinClassItem.kt
deleted file mode 100644
index 472127d..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinClassItem.kt
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.AnnotationRetention
-import com.android.tools.metalava.model.ClassItem
-import com.android.tools.metalava.model.ConstructorItem
-import com.android.tools.metalava.model.DefaultItem
-import com.android.tools.metalava.model.FieldItem
-import com.android.tools.metalava.model.MethodItem
-import com.android.tools.metalava.model.MutableModifierList
-import com.android.tools.metalava.model.PackageItem
-import com.android.tools.metalava.model.PropertyItem
-import com.android.tools.metalava.model.TypeItem
-import com.android.tools.metalava.model.TypeParameterList
-import com.android.tools.metalava.model.psi.PsiBasedCodebase
-import org.jetbrains.kotlin.psi.KtClass
-import org.jetbrains.kotlin.psi.KtClassOrObject
-
-class KotlinClassItem(
-    override val codebase: PsiBasedCodebase,
-    override val element: KtClassOrObject,
-    override val modifiers: KotlinModifierList = KotlinModifierList(codebase),
-    override var documentation: String = element.docComment?.toString().orEmpty()
-) : KotlinItem, ClassItem, DefaultItem() {
-    lateinit var containingPackage: PackageItem
-
-    override fun simpleName(): String = element.name!!.toString()
-
-    override fun fullName(): String {
-        if (isTopLevelClass()) {
-            return simpleName()
-        }
-
-        TODO("Implement fullName() for inner classes")
-    }
-
-    override fun qualifiedName(): String = element.fqName!!.asString()
-
-    override fun isTopLevelClass(): Boolean = element.isTopLevel()
-
-    override fun isInnerClass(): Boolean = !element.isTopLevel()
-
-    override fun isDefined(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun superClass(): ClassItem? {
-        TODO("Not yet implemented")
-    }
-
-    override fun superClassType(): TypeItem? {
-        TODO("Not yet implemented")
-    }
-
-    override fun interfaceTypes(): List<TypeItem> {
-        TODO("Not yet implemented")
-    }
-
-    override fun allInterfaces(): Sequence<ClassItem> {
-        TODO("Not yet implemented")
-    }
-
-    override fun innerClasses(): List<ClassItem> = emptyList()
-
-    override fun constructors(): List<ConstructorItem> = emptyList()
-
-    override fun hasImplicitDefaultConstructor(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun methods(): List<MethodItem> = emptyList()
-
-    override fun properties(): List<PropertyItem> = emptyList()
-
-    override fun fields(): List<FieldItem> = emptyList()
-
-    override fun isInterface(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun isAnnotationType(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun isEnum(): Boolean = (element as? KtClass)?.isEnum() ?: false
-
-    override fun containingClass(): ClassItem? {
-        TODO("Not yet implemented")
-    }
-
-    override fun containingPackage(): PackageItem = containingPackage
-
-    override fun toType(): TypeItem {
-        TODO("Not yet implemented")
-    }
-
-    override fun hasTypeVariables(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun typeParameterList(): TypeParameterList {
-        TODO("Not yet implemented")
-    }
-
-    override fun setSuperClass(superClass: ClassItem?, superClassType: TypeItem?) {
-        TODO("Not yet implemented")
-    }
-
-    override fun setInterfaceTypes(interfaceTypes: List<TypeItem>) {
-        TODO("Not yet implemented")
-    }
-
-    override val isTypeParameter: Boolean
-        get() = TODO("Not yet implemented")
-    override var hasPrivateConstructor: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var artifact: String?
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override fun getRetention(): AnnotationRetention {
-        TODO("Not yet implemented")
-    }
-
-    override var stubConstructor: ConstructorItem?
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var originallyHidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var hidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var removed: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var deprecated: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var docOnly: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override val synthetic: Boolean
-        get() = TODO("Not yet implemented")
-
-    override fun mutableModifiers(): MutableModifierList {
-        TODO("Not yet implemented")
-    }
-
-    override fun findTagDocumentation(tag: String): String? {
-        TODO("Not yet implemented")
-    }
-
-    override fun appendDocumentation(comment: String, tagSection: String?, append: Boolean) {
-        TODO("Not yet implemented")
-    }
-
-    override fun equals(other: Any?): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun hashCode(): Int {
-        TODO("Not yet implemented")
-    }
-
-    override fun isCloned(): Boolean {
-        TODO("Not yet implemented")
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinItem.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinItem.kt
deleted file mode 100644
index f85572f..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinItem.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.Item
-import com.android.tools.metalava.model.psi.PsiBasedCodebase
-import org.jetbrains.kotlin.psi.KtElement
-
-interface KotlinItem : Item {
-    override val codebase: PsiBasedCodebase
-    val element: KtElement
-    override val modifiers: KotlinModifierList
-    override var documentation: String
-}
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinMethodItem.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinMethodItem.kt
deleted file mode 100644
index 8e73b10..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinMethodItem.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.ClassItem
-import com.android.tools.metalava.model.DefaultItem
-import com.android.tools.metalava.model.MethodItem
-import com.android.tools.metalava.model.MutableModifierList
-import com.android.tools.metalava.model.ParameterItem
-import com.android.tools.metalava.model.TypeItem
-import com.android.tools.metalava.model.TypeParameterList
-import com.android.tools.metalava.model.psi.PsiBasedCodebase
-import org.jetbrains.kotlin.psi.KtNamedFunction
-
-class KotlinMethodItem(
-    override val codebase: PsiBasedCodebase,
-    override val element: KtNamedFunction,
-    override val modifiers: KotlinModifierList = KotlinModifierList(codebase),
-    override var documentation: String = element.docComment?.toString().orEmpty()
-) : KotlinItem, MethodItem, DefaultItem() {
-    override fun name(): String {
-        TODO("Not yet implemented")
-    }
-
-    override fun containingClass(): ClassItem {
-        TODO("Not yet implemented")
-    }
-
-    override fun isConstructor(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun returnType(): TypeItem? {
-        TODO("Not yet implemented")
-    }
-
-    override fun parameters(): List<ParameterItem> {
-        TODO("Not yet implemented")
-    }
-
-    override fun isExtensionMethod(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun superMethods(): List<MethodItem> {
-        TODO("Not yet implemented")
-    }
-
-    override fun typeParameterList(): TypeParameterList {
-        TODO("Not yet implemented")
-    }
-
-    override fun throwsTypes(): List<ClassItem> {
-        TODO("Not yet implemented")
-    }
-
-    override var inheritedMethod: Boolean
-        get() = TODO("Not yet implemented")
-        set(_) { TODO("Not yet implemented") }
-    override var originallyHidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(_) { TODO("Not yet implemented") }
-    override var hidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(_) { TODO("Not yet implemented") }
-    override var removed: Boolean
-        get() = TODO("Not yet implemented")
-        set(_) { TODO("Not yet implemented") }
-    override var deprecated: Boolean
-        get() = TODO("Not yet implemented")
-        set(_) { TODO("Not yet implemented") }
-    override var docOnly: Boolean
-        get() = TODO("Not yet implemented")
-        set(_) { TODO("Not yet implemented") }
-    override val synthetic: Boolean
-        get() = TODO("Not yet implemented")
-
-    override fun mutableModifiers(): MutableModifierList {
-        TODO("Not yet implemented")
-    }
-
-    override fun findTagDocumentation(tag: String): String? {
-        TODO("Not yet implemented")
-    }
-
-    override fun appendDocumentation(comment: String, tagSection: String?, append: Boolean) {
-        TODO("Not yet implemented")
-    }
-
-    override fun equals(other: Any?): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun hashCode(): Int {
-        TODO("Not yet implemented")
-    }
-
-    override fun isCloned(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override var inheritedFrom: ClassItem?
-        get() = TODO("Not yet implemented")
-        set(_) { TODO("Not yet implemented") }
-
-    override fun duplicate(targetContainingClass: ClassItem): MethodItem {
-        TODO("Not yet implemented")
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinModifierList.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinModifierList.kt
deleted file mode 100644
index 6834dc2..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinModifierList.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.AnnotationItem
-import com.android.tools.metalava.model.Codebase
-import com.android.tools.metalava.model.DefaultModifierList
-import com.android.tools.metalava.model.ModifierList
-import com.android.tools.metalava.model.MutableModifierList
-
-class KotlinModifierList(
-    codebase: Codebase,
-    flags: Int = PACKAGE_PRIVATE,
-    annotations: MutableList<AnnotationItem>? = null
-) : DefaultModifierList(codebase, flags, annotations), ModifierList, MutableModifierList
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinParameterItem.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinParameterItem.kt
deleted file mode 100644
index dfea619..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinParameterItem.kt
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.DefaultItem
-import com.android.tools.metalava.model.MethodItem
-import com.android.tools.metalava.model.MutableModifierList
-import com.android.tools.metalava.model.ParameterItem
-import com.android.tools.metalava.model.TypeItem
-import com.android.tools.metalava.model.psi.PsiBasedCodebase
-import org.jetbrains.kotlin.psi.KtParameter
-
-class KotlinParameterItem(
-    override val codebase: PsiBasedCodebase,
-    override val element: KtParameter,
-    private val name: String,
-    override val parameterIndex: Int,
-    override val modifiers: KotlinModifierList,
-    override var documentation: String,
-    private val type: KotlinTypeItem
-) : KotlinItem, ParameterItem, DefaultItem() {
-    override fun name(): String {
-        TODO("Not yet implemented")
-    }
-
-    override fun type(): TypeItem {
-        TODO("Not yet implemented")
-    }
-
-    override fun containingMethod(): MethodItem {
-        TODO("Not yet implemented")
-    }
-
-    override fun publicName(): String? {
-        TODO("Not yet implemented")
-    }
-
-    override fun hasDefaultValue(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun isDefaultValueKnown(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun defaultValue(): String? {
-        TODO("Not yet implemented")
-    }
-
-    override fun isVarArgs(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override var originallyHidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var hidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var removed: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var deprecated: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var docOnly: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override val synthetic: Boolean
-        get() = TODO("Not yet implemented")
-
-    override fun mutableModifiers(): MutableModifierList {
-        TODO("Not yet implemented")
-    }
-
-    override fun findTagDocumentation(tag: String): String? {
-        TODO("Not yet implemented")
-    }
-
-    override val sortingRank: Int
-        get() = TODO("Not yet implemented")
-
-    override fun appendDocumentation(comment: String, tagSection: String?, append: Boolean) {
-        TODO("Not yet implemented")
-    }
-
-    override val isPackagePrivate: Boolean
-        get() = TODO("Not yet implemented")
-    override val isPrivate: Boolean
-        get() = TODO("Not yet implemented")
-
-    override fun equals(other: Any?): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun hashCode(): Int {
-        TODO("Not yet implemented")
-    }
-
-    override fun isCloned(): Boolean {
-        TODO("Not yet implemented")
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinPropertyItem.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinPropertyItem.kt
deleted file mode 100644
index f3251d9..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinPropertyItem.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.ClassItem
-import com.android.tools.metalava.model.DefaultItem
-import com.android.tools.metalava.model.MutableModifierList
-import com.android.tools.metalava.model.PropertyItem
-import com.android.tools.metalava.model.TypeItem
-import com.android.tools.metalava.model.psi.PsiBasedCodebase
-import org.jetbrains.kotlin.psi.KtProperty
-
-class KotlinPropertyItem(
-    override val codebase: PsiBasedCodebase,
-    override val element: KtProperty,
-    private val containingClass: KotlinClassItem,
-    private val name: String,
-    override val modifiers: KotlinModifierList,
-    override var documentation: String,
-    private val fieldType: KotlinTypeItem,
-    override val constructorParameter: KotlinParameterItem? = null
-) : KotlinItem, PropertyItem, DefaultItem() {
-    override fun type(): TypeItem {
-        TODO("Not yet implemented")
-    }
-
-    override fun name(): String {
-        TODO("Not yet implemented")
-    }
-
-    override fun containingClass(): ClassItem {
-        TODO("Not yet implemented")
-    }
-
-    override var originallyHidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var hidden: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var removed: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var deprecated: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override var docOnly: Boolean
-        get() = TODO("Not yet implemented")
-        set(value) { TODO(value.toString()) }
-    override val synthetic: Boolean
-        get() = TODO("Not yet implemented")
-
-    override fun mutableModifiers(): MutableModifierList {
-        TODO("Not yet implemented")
-    }
-
-    override fun findTagDocumentation(tag: String): String? {
-        TODO("Not yet implemented")
-    }
-
-    override val sortingRank: Int
-        get() = TODO("Not yet implemented")
-
-    override fun appendDocumentation(comment: String, tagSection: String?, append: Boolean) {
-        TODO("Not yet implemented")
-    }
-
-    override fun equals(other: Any?): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun hashCode(): Int {
-        TODO("Not yet implemented")
-    }
-
-    override fun isCloned(): Boolean {
-        TODO("Not yet implemented")
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinTypeItem.kt b/src/main/java/com/android/tools/metalava/model/kotlin/KotlinTypeItem.kt
deleted file mode 100644
index bf50487..0000000
--- a/src/main/java/com/android/tools/metalava/model/kotlin/KotlinTypeItem.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.model.ClassItem
-import com.android.tools.metalava.model.Item
-import com.android.tools.metalava.model.MemberItem
-import com.android.tools.metalava.model.TypeItem
-import com.android.tools.metalava.model.TypeParameterItem
-import com.android.tools.metalava.model.psi.PsiBasedCodebase
-import org.jetbrains.kotlin.types.KotlinType
-import java.util.function.Predicate
-
-class KotlinTypeItem private constructor(
-    private val codebase: PsiBasedCodebase,
-    var ktType: KotlinType
-) : TypeItem {
-    override fun toTypeString(
-        outerAnnotations: Boolean,
-        innerAnnotations: Boolean,
-        erased: Boolean,
-        kotlinStyleNulls: Boolean,
-        context: Item?,
-        filter: Predicate<Item>?
-    ): String {
-        TODO("Not yet implemented")
-    }
-
-    override fun toErasedTypeString(context: Item?): String {
-        TODO("Not yet implemented")
-    }
-
-    override fun arrayDimensions(): Int {
-        TODO("Not yet implemented")
-    }
-
-    override fun asClass(): ClassItem? {
-        TODO("Not yet implemented")
-    }
-
-    override val primitive: Boolean
-        get() = TODO("Not yet implemented")
-
-    override fun typeArgumentClasses(): List<ClassItem> {
-        TODO("Not yet implemented")
-    }
-
-    override fun convertType(replacementMap: Map<String, String>?, owner: Item?): TypeItem {
-        TODO("Not yet implemented")
-    }
-
-    override fun asTypeParameter(context: MemberItem?): TypeParameterItem? {
-        TODO("Not yet implemented")
-    }
-
-    override fun markRecent() {
-        TODO("Not yet implemented")
-    }
-
-    override fun scrubAnnotations() {
-        TODO("Not yet implemented")
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
index c8e2d75..567a935 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
@@ -48,13 +48,9 @@
 class PsiAnnotationItem private constructor(
     override val codebase: PsiBasedCodebase,
     val psiAnnotation: PsiAnnotation,
-    private val originalName: String?
+    override val originalName: String?
 ) : DefaultAnnotationItem(codebase) {
-    private val qualifiedName = AnnotationItem.mapName(codebase, originalName)
-
-    private var attributes: List<AnnotationAttribute>? = null
-
-    override fun originalName(): String? = originalName
+    override val qualifiedName: String? = AnnotationItem.mapName(codebase, originalName)
 
     override fun toString(): String = toSource()
 
@@ -78,37 +74,16 @@
         return super.isNonNull()
     }
 
-    override fun qualifiedName() = qualifiedName
-
-    override fun attributes(): List<AnnotationAttribute> {
-        if (attributes == null) {
-            val psiAttributes = psiAnnotation.parameterList.attributes
-            attributes = if (psiAttributes.isEmpty()) {
-                emptyList()
-            } else {
-                val list = mutableListOf<AnnotationAttribute>()
-                for (parameter in psiAttributes) {
-                    list.add(
-                        PsiAnnotationAttribute(
-                            codebase,
-                            parameter.name ?: ATTR_VALUE, parameter.value ?: continue
-                        )
-                    )
-                }
-                list
+    override val attributes: List<PsiAnnotationAttribute> by lazy {
+        psiAnnotation.parameterList.attributes.mapNotNull { attribute ->
+            attribute.value?.let { value ->
+                PsiAnnotationAttribute(codebase, attribute.name ?: ATTR_VALUE, value)
             }
-        }
-
-        return attributes!!
+        }.toList()
     }
 
-    override fun targets(): Set<AnnotationTarget> {
-        if (targets == null) {
-            targets = AnnotationItem.computeTargets(this) { className ->
-                codebase.findOrCreateClass(className)
-            }
-        }
-        return targets!!
+    override val targets: Set<AnnotationTarget> by lazy {
+        AnnotationItem.computeTargets(this, codebase::findOrCreateClass)
     }
 
     companion object {
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt
index 33f263e..bd9b176 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt
@@ -23,12 +23,12 @@
 import com.android.tools.metalava.Issues
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.DefaultCodebase
+import com.android.tools.metalava.model.FieldItem
 import com.android.tools.metalava.model.Item
 import com.android.tools.metalava.model.MethodItem
 import com.android.tools.metalava.model.PackageDocs
 import com.android.tools.metalava.model.PackageItem
 import com.android.tools.metalava.model.PackageList
-import com.android.tools.metalava.model.kotlin.KotlinClassItem
 import com.android.tools.metalava.options
 import com.android.tools.metalava.reporter
 import com.android.tools.metalava.tick
@@ -56,28 +56,50 @@
 import com.intellij.psi.javadoc.PsiDocTag
 import com.intellij.psi.search.GlobalSearchScope
 import com.intellij.psi.util.PsiTreeUtil
-import org.jetbrains.kotlin.psi.KtClassOrObject
-import org.jetbrains.kotlin.psi.KtFile
-import org.jetbrains.kotlin.psi.classOrObjectVisitor
+import org.jetbrains.kotlin.psi.KtElement
+import org.jetbrains.kotlin.resolve.BindingContext
 import org.jetbrains.uast.UFile
 import org.jetbrains.uast.UastFacade
+import org.jetbrains.uast.kotlin.KotlinUastResolveProviderService
 import java.io.File
 import java.io.IOException
-import java.util.ArrayList
-import java.util.HashMap
 import java.util.zip.ZipFile
 
 const val PACKAGE_ESTIMATE = 500
 const val CLASS_ESTIMATE = 15000
 const val METHOD_ESTIMATE = 1000
 
-open class PsiBasedCodebase(location: File, override var description: String = "Unknown") : DefaultCodebase(location) {
+/**
+ * A codebase containing Java, Kotlin, or UAST PSI classes
+ *
+ * After creation, a list of PSI file or a JAR file is passed to [initialize]. This creates package
+ * and class items along with their members. This process is broken into two phases:
+ *
+ * First, [initializing] is set to true, and class items are created from the supplied sources.
+ * These are main classes of the codebase and have [ClassItem.emit] set to true and
+ * [ClassItem.isFromClassPath] set to false. While creating these, package names are reserved and
+ * associated with their classes in [packageClasses].
+ *
+ * Next, package items are created for source classes based on the contents of [packageClasses]
+ * with [PackageItem.emit] set to true.
+ *
+ * Then [initializing] is set to false and the second pass begins. This path iteratively resolves
+ * supertypes of class items until all are fully resolved, creating new class and package items as
+ * needed. Since all the source class and package items have been created, new items are assumed to
+ * originate from the classpath and have [Item.emit] set to false and [Item.isFromClassPath] set to
+ * true.
+ */
+open class PsiBasedCodebase(
+    location: File,
+    override var description: String = "Unknown",
+    internal val enableKotlinPsi: Boolean = false
+) : DefaultCodebase(location) {
     lateinit var uastEnvironment: UastEnvironment
     val project: Project
         get() = uastEnvironment.ideaProject
 
-    /** Map from class name to class item */
-    private val classMap: MutableMap<String, ClassItem> = HashMap(CLASS_ESTIMATE)
+    /** Map from class name to class item. Classes are added via [registerClass] */
+    private val classMap: MutableMap<String, PsiClassItem> = HashMap(CLASS_ESTIMATE)
 
     /**
      * Map from classes to the set of methods for each (but only for classes where we've
@@ -88,8 +110,8 @@
     /** Map from package name to the corresponding package item */
     private lateinit var packageMap: MutableMap<String, PsiPackageItem>
 
-    /** Map from package name to list of classes in that package */
-    private lateinit var packageClasses: MutableMap<String, MutableList<ClassItem>>
+    /** Map from package name to list of classes in that package. Only used during [initialize]. */
+    private lateinit var packageClasses: MutableMap<String, MutableList<PsiClassItem>>
 
     /** A set of packages to hide */
     private lateinit var hiddenPackages: MutableMap<String, Boolean?>
@@ -98,8 +120,18 @@
      * A list of the top-level classes declared in the codebase's source (rather than on its
      * classpath).
      */
-    private lateinit var topLevelClassesFromSource: MutableList<ClassItem>
+    private lateinit var topLevelClassesFromSource: MutableList<PsiClassItem>
 
+    /**
+     * Set to true in [initialize] for the first pass of creating class items for all classes in
+     * the codebase sources and false for the second pass of creating class items for the
+     * supertypes of the codebase classes. New class items created in the supertypes pass must come
+     * from the classpath (dependencies) since all source classes have been created.
+     *
+     * This information is used in [createClass] to set [ClassItem.emit] to true for source classes
+     * and [ClassItem.isFromClassPath] to true for classpath classes. It is also used in
+     * [registerPackage] to set [PackageItem.emit] to true for source packages.
+     */
     private var initializing = false
 
     override fun trustedApi(): Boolean = false
@@ -114,7 +146,6 @@
         uastEnvironment: UastEnvironment,
         psiFiles: List<PsiFile>,
         packages: PackageDocs,
-        useKtModel: Boolean
     ) {
         initializing = true
         this.units = psiFiles
@@ -153,18 +184,11 @@
             })
 
             var classes = (psiFile as? PsiClassOwner)?.classes?.toList() ?: emptyList()
-            if (classes.isEmpty() && !useKtModel) {
+            if (classes.isEmpty()) {
                 val uFile = UastFacade.convertElementWithParent(psiFile, UFile::class.java) as? UFile?
                 classes = uFile?.classes?.map { it }?.toList() ?: emptyList()
             }
             when {
-                useKtModel && psiFile is KtFile -> {
-                    psiFile.acceptChildren(
-                        classOrObjectVisitor { ktClassOrObject ->
-                            topLevelClassesFromSource += createClass(ktClassOrObject)
-                        }
-                    )
-                }
                 classes.isEmpty() && psiFile is PsiJavaFile -> {
                     // package-info.java ?
                     val packageStatement = psiFile.packageStatement
@@ -224,7 +248,6 @@
             val sortedClasses = classes.toMutableList().sortedWith(ClassItem.fullNameComparator)
             registerPackage(psiPackage, sortedClasses, packageDocs[pkgName], pkgName)
         }
-
         initializing = false
 
         emptyPackage = findPackage("")!!
@@ -249,6 +272,8 @@
         // Point to "parent" packages, since doclava treats packages as nested (e.g. an @hide on
         // android.foo will also apply to android.foo.bar)
         addParentPackages(packageMap.values)
+
+        packageClasses.clear() // Not used after this point
     }
 
     override fun dispose() {
@@ -303,11 +328,14 @@
 
     private fun registerPackage(
         psiPackage: PsiPackage,
-        sortedClasses: List<ClassItem>?,
+        sortedClasses: List<PsiClassItem>?,
         packageHtml: String?,
         pkgName: String
     ): PsiPackageItem {
-        val packageItem = PsiPackageItem.create(this, psiPackage, packageHtml)
+        val packageItem = PsiPackageItem
+            .create(this, psiPackage, packageHtml, fromClassPath = !initializing)
+        packageItem.emit = initializing
+
         packageMap[pkgName] = packageItem
         if (isPackageHidden(pkgName)) {
             packageItem.hidden = true
@@ -414,6 +442,8 @@
         for (pkg in packageMap.values) {
             pkg.finishInitialization()
         }
+
+        packageClasses.clear() // Not used after this point
     }
 
     fun dumpStats() {
@@ -424,7 +454,7 @@
         )
     }
 
-    private fun registerPackageClass(packageName: String, cls: ClassItem) {
+    private fun registerPackageClass(packageName: String, cls: PsiClassItem) {
         var list = packageClasses[packageName]
         if (list == null) {
             list = ArrayList()
@@ -462,14 +492,12 @@
     }
 
     private fun createClass(clz: PsiClass): PsiClassItem {
-        val classItem = PsiClassItem.create(this, clz)
+        // If initializing is true, this class is from source
+        val classItem = PsiClassItem.create(this, clz, fromClassPath = !initializing)
+        // Set emit to true for source classes but false for classpath classes
+        classItem.emit = initializing
 
         if (!initializing) {
-            // This class is found while we're no longer initializing all the source units:
-            // that means it must be found on the classpath instead. These should be treated
-            // as hidden; we don't want to generate code for them.
-            classItem.emit = false
-
             // Workaround: we're pulling in .aidl files from .jar files. These are
             // marked @hide, but since we only see the .class files we don't know that.
             if (classItem.simpleName().startsWith("I") &&
@@ -488,15 +516,12 @@
             classItem.finishInitialization()
             return classItem
         }
-        val qualifiedName: String = clz.qualifiedName ?: clz.name!!
-        classMap[qualifiedName] = classItem
 
         // TODO: Cache for adjacent files!
         val packageName = getPackageName(clz)
         registerPackageClass(packageName, classItem)
 
         if (!initializing) {
-            classItem.emit = false
             classItem.finishInitialization()
             val pkgName = getPackageName(clz)
             val pkg = findPackage(pkgName)
@@ -518,21 +543,6 @@
         return classItem
     }
 
-    private fun createClass(ktClassOrObject: KtClassOrObject): ClassItem {
-        val classItem = KotlinClassItem(this, ktClassOrObject)
-
-        if (!initializing) {
-            classItem.emit = false
-        }
-
-        classMap[classItem.qualifiedName()] = classItem
-
-        val packageName = ktClassOrObject.containingKtFile.packageFqName.asString()
-        registerPackageClass(packageName, classItem)
-
-        return classItem
-    }
-
     override fun getPackages(): PackageList {
         // TODO: Sorting is probably not necessary here!
         return PackageList(this, packageMap.values.toMutableList().sortedWith(PackageItem.comparator))
@@ -550,13 +560,13 @@
         return packageMap[pkgName]
     }
 
-    override fun findClass(className: String): ClassItem? {
+    override fun findClass(className: String): PsiClassItem? {
         return classMap[className]
     }
 
     open fun findClass(psiClass: PsiClass): PsiClassItem? {
         val qualifiedName: String = psiClass.qualifiedName ?: psiClass.name!!
-        return classMap[qualifiedName] as? PsiClassItem
+        return classMap[qualifiedName]
     }
 
     open fun findOrCreateClass(qualifiedName: String): PsiClassItem? {
@@ -684,7 +694,7 @@
         return methodItem
     }
 
-    fun findField(field: PsiField): Item? {
+    fun findField(field: PsiField): FieldItem? {
         val containingClass = field.containingClass ?: return null
         val cls = findOrCreateClass(containingClass)
         return cls.findField(field.name)
@@ -758,9 +768,17 @@
 
     override fun toString(): String = description
 
-    fun registerClass(cls: PsiClassItem) {
-        assert(classMap[cls.qualifiedName()] == null || classMap[cls.qualifiedName()] == cls)
-
+    /** Add a class to the codebase. Called from [createClass] and [PsiClassItem.create]. */
+    internal fun registerClass(cls: PsiClassItem) {
         classMap[cls.qualifiedName()] = cls
     }
+
+    /** Get a Kotlin [BindingContext] at [element]
+     *
+     * Do not cache returned binding context for longer than the lifetime of this codebase
+     */
+    fun bindingContext(element: KtElement): BindingContext {
+        return checkNotNull(project.getService(KotlinUastResolveProviderService::class.java))
+            .getBindingContext(element)
+    }
 }
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt
index 9c96efe..118791a 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt
@@ -16,6 +16,9 @@
 
 package com.android.tools.metalava.model.psi
 
+import com.android.tools.metalava.JAVA_RETENTION
+import com.android.tools.metalava.KT_RETENTION
+import com.android.tools.metalava.isRetention
 import com.android.tools.metalava.model.AnnotationRetention
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.ConstructorItem
@@ -38,16 +41,14 @@
 import com.intellij.psi.SyntheticElement
 import com.intellij.psi.impl.source.PsiClassReferenceType
 import com.intellij.psi.util.PsiUtil
+import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
 import org.jetbrains.kotlin.psi.KtParameter
 import org.jetbrains.kotlin.psi.KtProperty
 import org.jetbrains.kotlin.psi.KtPropertyAccessor
 import org.jetbrains.kotlin.psi.psiUtil.isPropertyParameter
 import org.jetbrains.uast.UClass
-import org.jetbrains.uast.UElement
 import org.jetbrains.uast.UFile
-import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.getParentOfType
-import org.jetbrains.uast.kotlin.KotlinUClass
 
 open class PsiClassItem(
     override val codebase: PsiBasedCodebase,
@@ -58,7 +59,9 @@
     private val hasImplicitDefaultConstructor: Boolean,
     val classType: ClassType,
     modifiers: PsiModifierItem,
-    documentation: String
+    documentation: String,
+    /** True if this class is from the class path (dependencies). Exposed in [isFromClassPath]. */
+    private val fromClassPath: Boolean
 ) :
     PsiItem(
         codebase = codebase,
@@ -78,6 +81,7 @@
     override fun isInterface(): Boolean = classType == ClassType.INTERFACE
     override fun isAnnotationType(): Boolean = classType == ClassType.ANNOTATION_TYPE
     override fun isEnum(): Boolean = classType == ClassType.ENUM
+    override fun isFromClassPath(): Boolean = fromClassPath
     override fun hasImplicitDefaultConstructor(): Boolean = hasImplicitDefaultConstructor
 
     private var superClass: ClassItem? = null
@@ -397,11 +401,15 @@
     override fun toString(): String = "class ${qualifiedName()}"
 
     companion object {
-        private fun hasExplicitRetention(modifiers: PsiModifierItem, psiClass: PsiClass, isKotlin: Boolean): Boolean {
-            if (modifiers.findAnnotation("java.lang.annotation.Retention") != null) {
+        private fun hasExplicitRetention(
+            modifiers: PsiModifierItem,
+            psiClass: PsiClass,
+            isKotlin: Boolean
+        ): Boolean {
+            if (modifiers.findAnnotation(JAVA_RETENTION) != null) {
                 return true
             }
-            if (modifiers.findAnnotation("kotlin.annotation.Retention") != null) {
+            if (modifiers.findAnnotation(KT_RETENTION) != null) {
                 return true
             }
             if (isKotlin && psiClass is UClass) {
@@ -409,11 +417,8 @@
                 // a @DslMarker annotation will imply a runtime annotation which is present
                 // in the java facade, not in the source list of annotations
                 val modifierList = psiClass.modifierList
-                if (modifierList != null && modifierList.annotations.any {
-                    val qualifiedName = it.qualifiedName
-                    qualifiedName == "kotlin.annotation.Retention" ||
-                        qualifiedName == "java.lang.annotation.Retention"
-                }
+                if (modifierList != null &&
+                    modifierList.annotations.any { isRetention(it.qualifiedName) }
                 ) {
                     return true
                 }
@@ -421,7 +426,11 @@
             return false
         }
 
-        fun create(codebase: PsiBasedCodebase, psiClass: PsiClass): PsiClassItem {
+        fun create(
+            codebase: PsiBasedCodebase,
+            psiClass: PsiClass,
+            fromClassPath: Boolean
+        ): PsiClassItem {
             if (psiClass is PsiTypeParameter) {
                 return PsiTypeParameterItem.create(codebase, psiClass)
             }
@@ -432,7 +441,10 @@
             val classType = ClassType.getClassType(psiClass)
 
             val commentText = PsiItem.javadoc(psiClass)
-            val modifiers = modifiers(codebase, psiClass, commentText)
+            val isFacade = (psiClass as? UClass)?.javaPsi is KtLightClassForFacade
+            val modifiers = PsiModifierItem
+                .create(codebase, psiClass, commentText, codebase.enableKotlinPsi && !isFacade)
+
             val item = PsiClassItem(
                 codebase = codebase,
                 psiClass = psiClass,
@@ -442,11 +454,15 @@
                 classType = classType,
                 hasImplicitDefaultConstructor = hasImplicitDefaultConstructor,
                 documentation = commentText,
-                modifiers = modifiers
+                modifiers = modifiers,
+                fromClassPath = fromClassPath
             )
-            codebase.registerClass(item)
             item.modifiers.setOwner(item)
 
+            // Register this class now so it's present when calling Codebase.findOrCreateClass for
+            // inner classes below
+            codebase.registerClass(item)
+
             // Construct the children
             val psiMethods = psiClass.methods
             val methods: MutableList<PsiMethodItem> = ArrayList(psiMethods.size)
@@ -491,7 +507,14 @@
                     methods.add(method)
                 }
             }
-            if (noArgConstructor != null && !hasConstructorWithOnlyOptionalArgs) {
+
+            // Add the no-arg constructor back in if no constructors have only optional arguments
+            // or if an all-optional constructor created it as part of @JvmOverloads
+            if (noArgConstructor != null && (
+                !hasConstructorWithOnlyOptionalArgs ||
+                    noArgConstructor.modifiers.isAnnotatedWith("kotlin.jvm.JvmOverloads")
+                )
+            ) {
                 constructors.add(noArgConstructor)
             }
 
@@ -504,7 +527,7 @@
                 constructors.add(PsiConstructorItem.createDefaultConstructor(codebase, item, psiClass))
             }
 
-            val fields: MutableList<FieldItem> = mutableListOf()
+            val fields: MutableList<PsiFieldItem> = mutableListOf()
             val psiFields = psiClass.fields
             if (psiFields.isNotEmpty()) {
                 psiFields.asSequence()
@@ -533,51 +556,49 @@
             item.fields = fields
 
             item.properties = emptyList()
-            if (isKotlin) {
-                val primaryParameters = item.primaryConstructor?.parameters()
-                    ?.associateBy { (it.element as? UElement)?.sourcePsi as? KtParameter }
+
+            if (isKotlin && methods.isNotEmpty()) {
+                val getters = mutableMapOf<String, PsiMethodItem>()
+                val setters = mutableMapOf<String, PsiMethodItem>()
+                val backingFields = fields.associateBy { it.name() }
+                val constructorParameters = item.primaryConstructor?.parameters()
+                    ?.filter { (it.sourcePsi as? KtParameter)?.isPropertyParameter() ?: false }
+                    ?.associateBy { it.name() }
                     .orEmpty()
-                // Try to initialize the Kotlin properties
-                val properties = mutableListOf<PsiPropertyItem>()
-                for (method in psiMethods) {
-                    if (method is UMethod) {
-                        if (method.modifierList.hasModifierProperty(PsiModifier.STATIC)) {
-                            // Skip extension properties
-                            continue
-                        }
-                        val sourcePsi = method.sourcePsi
-                        if (sourcePsi is KtProperty ||
-                            sourcePsi is KtPropertyAccessor ||
-                            sourcePsi is KtParameter
-                        ) {
-                            if (method.name.startsWith("set") ||
-                                method.name.startsWith("component")
-                            ) {
-                                continue
+
+                for (method in methods) {
+                    if (method.isKotlinProperty()) {
+                        val name = when (val sourcePsi = method.sourcePsi) {
+                            is KtProperty -> sourcePsi.name
+                            is KtPropertyAccessor -> sourcePsi.property.name
+                            is KtParameter -> sourcePsi.name
+                            else -> null
+                        } ?: continue
+
+                        if (method.parameters().isEmpty()) {
+                            if (!method.name().startsWith("component")) {
+                                getters[name] = method
                             }
-                            val name =
-                                when (sourcePsi) {
-                                    is KtProperty -> sourcePsi.name
-                                    is KtPropertyAccessor -> sourcePsi.property.name
-                                    is KtParameter -> {
-                                        if (sourcePsi.isPropertyParameter()) {
-                                            sourcePsi.name
-                                        } else null
-                                    }
-                                    else -> null
-                                } ?: continue
-                            val psiType = method.returnType ?: continue
-                            PsiPropertyItem.create(
-                                codebase = codebase,
-                                containingClass = item,
-                                name = name,
-                                psiType = psiType,
-                                psiMethod = method,
-                                constructorParameter = primaryParameters[sourcePsi as? KtParameter]
-                            ).also { properties.add(it) }
+                        } else {
+                            setters[name] = method
                         }
                     }
                 }
+
+                val properties = mutableListOf<PsiPropertyItem>()
+                for ((name, getter) in getters) {
+                    val type = getter.returnType() as? PsiTypeItem ?: continue
+                    properties += PsiPropertyItem.create(
+                        codebase = codebase,
+                        containingClass = item,
+                        name = name,
+                        type = type,
+                        getter = getter,
+                        setter = setters[name],
+                        constructorParameter = constructorParameters[name],
+                        backingField = backingFields[name]
+                    )
+                }
                 item.properties = properties
             }
 
@@ -628,7 +649,7 @@
                 //     @file:JvmName("-ViewModelExtensions") // Hide from Java sources in the IDE.
                 return false
             }
-            if (psiClass is KotlinUClass && psiClass.sourcePsi == null) {
+            if (psiClass is UClass && psiClass.sourcePsi == null) {
                 // Top level kt classes (FooKt for Foo.kt) do not have implicit default constructor
                 return false
             }
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt
index fe2a632..c513ef8 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt
@@ -27,7 +27,9 @@
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.PsiMethodCallExpression
 import com.intellij.psi.PsiWhiteSpace
-import org.jetbrains.uast.kotlin.KotlinConstructorUMethod
+import org.jetbrains.kotlin.psi.KtClassOrObject
+import org.jetbrains.kotlin.psi.KtPrimaryConstructor
+import org.jetbrains.uast.UMethod
 
 class PsiConstructorItem(
     codebase: PsiBasedCodebase,
@@ -126,7 +128,7 @@
                 parameters = parameters,
                 returnType = codebase.getType(containingClass.psiClass),
                 implicitConstructor = false,
-                isPrimary = (psiMethod as? KotlinConstructorUMethod)?.isPrimary ?: false
+                isPrimary = (psiMethod as? UMethod)?.isPrimaryConstructor ?: false
             )
             constructor.modifiers.setOwner(constructor)
             return constructor
@@ -158,5 +160,8 @@
             modifiers.setOwner(item)
             return item
         }
+
+        private val UMethod.isPrimaryConstructor: Boolean
+            get() = sourcePsi is KtPrimaryConstructor || sourcePsi is KtClassOrObject
     }
 }
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt
index 303560d..d8bf548 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt
@@ -44,6 +44,8 @@
     ),
     FieldItem {
 
+    override var property: PsiPropertyItem? = null
+
     override fun type(): TypeItem = fieldType
     override fun initialValue(requireConstant: Boolean): Any? {
         if (initialValue != null) {
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt
index 27de05a..df9fd1a 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt
@@ -25,6 +25,7 @@
 import com.intellij.psi.PsiModifierListOwner
 import org.jetbrains.kotlin.idea.KotlinLanguage
 import org.jetbrains.kotlin.kdoc.psi.api.KDoc
+import org.jetbrains.kotlin.psi.KtDeclaration
 import org.jetbrains.uast.UElement
 import org.jetbrains.uast.sourcePsiElement
 import kotlin.properties.ReadWriteProperty
@@ -47,6 +48,9 @@
 
     override val synthetic = false
 
+    /** The source PSI provided by UAST */
+    val sourcePsi: PsiElement? = (element as? UElement)?.sourcePsi
+
     // a property with a lazily calculated default value
     inner class LazyDelegate<T>(
         val defaultValueProvider: () -> T
@@ -81,13 +85,8 @@
 
     override fun psi(): PsiElement? = element
 
-    // TODO: Consider only doing this in tests!
     override fun isFromClassPath(): Boolean {
-        return if (element is UElement) {
-            (element.sourcePsi ?: element.javaPsi) is PsiCompiledElement
-        } else {
-            element is PsiCompiledElement
-        }
+        return containingClass()?.isFromClassPath() ?: false
     }
 
     override fun isCloned(): Boolean = false
@@ -95,7 +94,7 @@
     /** Get a mutable version of modifiers for this item */
     override fun mutableModifiers(): MutableModifierList = modifiers
 
-    override fun findTagDocumentation(tag: String): String? {
+    override fun findTagDocumentation(tag: String, value: String?): String? {
         if (element is PsiCompiledElement) {
             return null
         }
@@ -107,9 +106,17 @@
         // the comment and then the comment snapshot in PSI isn't up to date with our
         // latest changes
         val docComment = codebase.getComment(documentation)
-        val docTag = docComment.findTagByName(tag) ?: return null
-        val text = docTag.text
+        val tagComment = if (value == null) {
+            docComment.findTagByName(tag)
+        } else {
+            docComment.findTagsByName(tag).firstOrNull { it.valueElement?.text == value }
+        }
 
+        if (tagComment == null) {
+            return null
+        }
+
+        val text = tagComment.text
         // Trim trailing next line (javadoc *)
         var index = text.length - 1
         while (index > 0) {
@@ -120,10 +127,10 @@
             index--
         }
         index++
-        return if (index < text.length) {
-            text.substring(0, index)
+        if (index < text.length) {
+            return text.substring(0, index)
         } else {
-            text
+            return text
         }
     }
 
@@ -242,6 +249,10 @@
                 return ""
             }
 
+            if (element is KtDeclaration) {
+                return element.docComment?.text.orEmpty()
+            }
+
             if (element is UElement) {
                 val comments = element.comments
                 if (comments.isNotEmpty()) {
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt
index 4d30efd..167173f 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt
@@ -32,15 +32,13 @@
 import org.jetbrains.kotlin.psi.KtParameter
 import org.jetbrains.kotlin.psi.KtProperty
 import org.jetbrains.kotlin.psi.KtPropertyAccessor
+import org.jetbrains.uast.UAnnotationMethod
 import org.jetbrains.uast.UClass
 import org.jetbrains.uast.UElement
-import org.jetbrains.uast.UExpression
 import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.UThrowExpression
 import org.jetbrains.uast.UTryExpression
-import org.jetbrains.uast.UastFacade
 import org.jetbrains.uast.getParentOfType
-import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
 import org.jetbrains.uast.visitor.AbstractUastVisitor
 import java.io.StringWriter
 
@@ -80,6 +78,8 @@
     override var inheritedMethod: Boolean = false
     override var inheritedFrom: ClassItem? = null
 
+    override var property: PsiPropertyItem? = null
+
     override fun name(): String = name
     override fun containingClass(): PsiClassItem = containingClass
 
@@ -99,6 +99,13 @@
         return psiMethod.hashCode()
     }
 
+    override fun findMainDocumentation(): String {
+        if (documentation == "") return documentation
+        val comment = codebase.getComment(documentation)
+        val end = findFirstTag(comment)?.textRange?.startOffset ?: documentation.length
+        return comment.text.substring(0, end)
+    }
+
     override fun isConstructor(): Boolean = false
 
     override fun isImplicitConstructor(): Boolean = false
@@ -160,7 +167,7 @@
     override fun isExtensionMethod(): Boolean {
         if (isKotlin()) {
             val ktParameters =
-                ((psiMethod as? KotlinUMethod)?.sourcePsi as? KtNamedFunction)?.valueParameters
+                ((psiMethod as? UMethod)?.sourcePsi as? KtNamedFunction)?.valueParameters
                     ?: return false
             return ktParameters.size < parameters.size
         }
@@ -169,7 +176,7 @@
     }
 
     override fun isKotlinProperty(): Boolean {
-        return psiMethod is KotlinUMethod && (
+        return psiMethod is UMethod && (
             psiMethod.sourcePsi is KtProperty ||
                 psiMethod.sourcePsi is KtPropertyAccessor ||
                 psiMethod.sourcePsi is KtParameter && (psiMethod.sourcePsi as KtParameter).hasValOrVar()
@@ -230,29 +237,19 @@
     }
 
     override fun defaultValue(): String {
-        if (psiMethod is PsiAnnotationMethod) {
-            val value = psiMethod.defaultValue
-            if (value != null) {
-                if (isKotlin(value)) {
-                    val defaultExpression: UExpression = UastFacade.convertElement(
-                        value, null,
-                        UExpression::class.java
-                    ) as? UExpression ?: return ""
-                    val constant = defaultExpression.evaluate()
-                    return if (constant != null) {
-                        CodePrinter.constantToSource(constant)
-                    } else {
-                        // Expression: Compute from UAST rather than just using the source text
-                        // such that we can ensure references are fully qualified etc.
-                        codebase.printer.toSourceString(defaultExpression) ?: ""
-                    }
-                } else {
-                    return codebase.printer.toSourceExpression(value, this)
-                }
+        return when (psiMethod) {
+            is UAnnotationMethod -> {
+                psiMethod.uastDefaultValue?.let {
+                    codebase.printer.toSourceString(it)
+                } ?: ""
             }
+            is PsiAnnotationMethod -> {
+                psiMethod.defaultValue?.let {
+                    codebase.printer.toSourceExpression(it, this)
+                } ?: super.defaultValue()
+            }
+            else -> super.defaultValue()
         }
-
-        return super.defaultValue()
     }
 
     override fun duplicate(targetContainingClass: ClassItem): PsiMethodItem {
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt
index f7187d3..33acdd7 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt
@@ -31,19 +31,30 @@
 import com.intellij.psi.PsiPrimitiveType
 import com.intellij.psi.PsiReferenceExpression
 import com.intellij.psi.impl.light.LightModifierList
+import org.jetbrains.annotations.NotNull
+import org.jetbrains.annotations.Nullable
 import org.jetbrains.kotlin.asJava.elements.KtLightModifierList
 import org.jetbrains.kotlin.asJava.elements.KtLightNullabilityAnnotation
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
+import org.jetbrains.kotlin.descriptors.EffectiveVisibility
+import org.jetbrains.kotlin.descriptors.effectiveVisibility
 import org.jetbrains.kotlin.lexer.KtTokens
+import org.jetbrains.kotlin.psi.KtAnnotated
+import org.jetbrains.kotlin.psi.KtClass
+import org.jetbrains.kotlin.psi.KtClassOrObject
+import org.jetbrains.kotlin.psi.KtElement
 import org.jetbrains.kotlin.psi.KtModifierList
 import org.jetbrains.kotlin.psi.KtModifierListOwner
 import org.jetbrains.kotlin.psi.KtNamedFunction
 import org.jetbrains.kotlin.psi.KtPropertyAccessor
 import org.jetbrains.kotlin.psi.psiUtil.hasFunModifier
+import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
+import org.jetbrains.kotlin.resolve.BindingContext
 import org.jetbrains.uast.UAnnotated
+import org.jetbrains.uast.UAnnotation
+import org.jetbrains.uast.UElement
 import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.UVariable
-import org.jetbrains.uast.kotlin.KotlinNullabilityUAnnotation
-import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
 
 class PsiModifierItem(
     codebase: Codebase,
@@ -51,16 +62,23 @@
     annotations: MutableList<AnnotationItem>? = null
 ) : DefaultModifierList(codebase, flags, annotations), ModifierList, MutableModifierList {
     companion object {
-        fun create(codebase: PsiBasedCodebase, element: PsiModifierListOwner, documentation: String?): PsiModifierItem {
+        fun create(
+            codebase: PsiBasedCodebase,
+            element: PsiModifierListOwner,
+            documentation: String?,
+            enableKotlinPsi: Boolean = false
+        ): PsiModifierItem {
             val modifiers =
                 if (element is UAnnotated) {
-                    create(codebase, element, element)
+                    create(codebase, element, element, enableKotlinPsi)
                 } else {
                     create(codebase, element)
                 }
             if (documentation?.contains("@deprecated") == true ||
                 // Check for @Deprecated annotation
-                ((element as? PsiDocCommentOwner)?.isDeprecated == true)
+                ((element as? PsiDocCommentOwner)?.isDeprecated == true) ||
+                // Check for @Deprecated on sourcePsi
+                isDeprecatedFromSourcePsi(element)
             ) {
                 modifiers.setDeprecated(true)
             }
@@ -68,13 +86,17 @@
             return modifiers
         }
 
-        private fun computeFlag(element: PsiModifierListOwner, modifierList: PsiModifierList): Int {
-            var visibilityFlags = when {
-                modifierList.hasModifierProperty(PsiModifier.PUBLIC) -> PUBLIC
-                modifierList.hasModifierProperty(PsiModifier.PROTECTED) -> PROTECTED
-                modifierList.hasModifierProperty(PsiModifier.PRIVATE) -> PRIVATE
-                else -> PACKAGE_PRIVATE
-            }
+        private fun isDeprecatedFromSourcePsi(element: PsiModifierListOwner): Boolean {
+            return ((element as? UElement)?.sourcePsi as? KtAnnotated)?.annotationEntries?.any {
+                it.shortName?.toString() == "Deprecated"
+            } ?: false
+        }
+
+        private fun computeFlag(
+            codebase: PsiBasedCodebase,
+            element: PsiModifierListOwner,
+            modifierList: PsiModifierList
+        ): Int {
             var flags = 0
             if (modifierList.hasModifierProperty(PsiModifier.STATIC)) {
                 flags = flags or STATIC
@@ -106,24 +128,57 @@
 
             // Look for special Kotlin keywords
             var ktModifierList: KtModifierList? = null
+            val sourcePsi = (element as? UElement)?.sourcePsi
             if (modifierList is KtLightModifierList<*>) {
                 ktModifierList = modifierList.kotlinOrigin
-            } else if (modifierList is LightModifierList && element is KotlinUMethod) {
-                ktModifierList = element.sourcePsi?.modifierList
+            } else if (modifierList is LightModifierList && element is UMethod) {
+                if (sourcePsi is KtModifierListOwner) {
+                    ktModifierList = sourcePsi.modifierList
+                }
+            }
+            var visibilityFlags = when {
+                modifierList.hasModifierProperty(PsiModifier.PUBLIC) -> PUBLIC
+                modifierList.hasModifierProperty(PsiModifier.PROTECTED) -> PROTECTED
+                modifierList.hasModifierProperty(PsiModifier.PRIVATE) -> PRIVATE
+                ktModifierList != null -> when {
+                    ktModifierList.hasModifier(KtTokens.PRIVATE_KEYWORD) -> PRIVATE
+                    ktModifierList.hasModifier(KtTokens.PROTECTED_KEYWORD) -> PROTECTED
+                    ktModifierList.hasModifier(KtTokens.INTERNAL_KEYWORD) -> INTERNAL
+                    else -> PUBLIC
+                }
+                else -> PACKAGE_PRIVATE
             }
             if (ktModifierList != null) {
+                if (ktModifierList.hasModifier(KtTokens.INTERNAL_KEYWORD)) {
+                    // Reset visibilityFlags to INTERNAL if the internal modifier is explicitly
+                    // present on the element
+                    visibilityFlags = INTERNAL
+                } else if (
+                    ktModifierList.hasModifier(KtTokens.OVERRIDE_KEYWORD) &&
+                    ktModifierList.visibilityModifier() == null &&
+                    sourcePsi is KtElement
+                ) {
+                    // Reset visibilityFlags to INTERNAL if the element has no explicit visibility
+                    // modifier, but overrides an internal declaration. Adapted from
+                    // org.jetbrains.kotlin.asJava.classes.UltraLightMembersCreator.isInternal
+                    val descriptor = codebase.bindingContext(sourcePsi)
+                        .get(BindingContext.DECLARATION_TO_DESCRIPTOR, sourcePsi)
+
+                    if (descriptor is DeclarationDescriptorWithVisibility) {
+                        val effectiveVisibility =
+                            descriptor.visibility.effectiveVisibility(descriptor, false)
+
+                        if (effectiveVisibility == EffectiveVisibility.Internal) {
+                            visibilityFlags = INTERNAL
+                        }
+                    }
+                }
                 if (ktModifierList.hasModifier(KtTokens.VARARG_KEYWORD)) {
                     flags = flags or VARARG
                 }
                 if (ktModifierList.hasModifier(KtTokens.SEALED_KEYWORD)) {
                     flags = flags or SEALED
                 }
-                if (ktModifierList.hasModifier(KtTokens.INTERNAL_KEYWORD)) {
-                    // Also remove public flag which at the UAST levels it promotes these
-                    // methods to, e.g. "internal myVar" gets turned into
-                    //    public final boolean getMyHiddenVar$lintWithKotlin()
-                    visibilityFlags = INTERNAL
-                }
                 if (ktModifierList.hasModifier(KtTokens.INFIX_KEYWORD)) {
                     flags = flags or INFIX
                 }
@@ -137,7 +192,7 @@
                     flags = flags or INLINE
 
                     // Workaround for b/117565118:
-                    val func = (element as? UMethod)?.sourcePsi as? KtNamedFunction
+                    val func = sourcePsi as? KtNamedFunction
                     if (func != null &&
                         (func.typeParameterList?.text ?: "").contains("reified") &&
                         !ktModifierList.hasModifier(KtTokens.PRIVATE_KEYWORD) &&
@@ -182,17 +237,57 @@
             return flags
         }
 
+        private fun computeFlag(element: KtModifierListOwner): Int {
+            // Visibility
+            var flags = when {
+                element.hasModifier(KtTokens.PRIVATE_KEYWORD) -> PRIVATE
+                element.hasModifier(KtTokens.PROTECTED_KEYWORD) -> PROTECTED
+                element.hasModifier(KtTokens.INTERNAL_KEYWORD) -> INTERNAL
+                else -> PUBLIC
+            }
+
+            fun set(flag: Int) { flags = flags or flag }
+
+            // Class-specific modifier rules
+            if (element is KtClassOrObject) {
+                // Abstractness
+                when {
+                    element is KtClass && element.isInterface() -> set(ABSTRACT)
+                    element.isAnnotation() -> set(ABSTRACT)
+                    element.hasModifier(KtTokens.ABSTRACT_KEYWORD) -> set(ABSTRACT)
+                    element.hasModifier(KtTokens.SEALED_KEYWORD) -> set(SEALED or ABSTRACT)
+                    element.hasModifier(KtTokens.OPEN_KEYWORD) -> {}
+                    else -> set(FINAL)
+                }
+
+                // Class types
+                when {
+                    element.hasModifier(KtTokens.INLINE_KEYWORD) -> set(INLINE)
+                    element.hasModifier(KtTokens.DATA_KEYWORD) -> set(DATA)
+                    element.hasModifier(KtTokens.VALUE_KEYWORD) -> set(VALUE)
+                    element.hasModifier(KtTokens.FUN_KEYWORD) -> set(FUN)
+                    element.hasModifier(KtTokens.COMPANION_KEYWORD) -> set(COMPANION)
+                }
+
+                // Static
+                if (!element.hasModifier(KtTokens.INNER_KEYWORD) && !element.isTopLevel()) {
+                    set(STATIC)
+                }
+            }
+
+            return flags
+        }
+
         private fun create(codebase: PsiBasedCodebase, element: PsiModifierListOwner): PsiModifierItem {
             val modifierList = element.modifierList ?: return PsiModifierItem(codebase)
-
-            var flags = computeFlag(element, modifierList)
+            var flags = computeFlag(codebase, element, modifierList)
 
             val psiAnnotations = modifierList.annotations
             return if (psiAnnotations.isEmpty()) {
                 PsiModifierItem(codebase, flags)
             } else {
                 val annotations: MutableList<AnnotationItem> =
-                    // psi sometimes returns duplicate annotations, using distint() to counter that.
+                    // psi sometimes returns duplicate annotations, using distinct() to counter that.
                     psiAnnotations.distinct().map {
                         val qualifiedName = it.qualifiedName
                         // Consider also supporting com.android.internal.annotations.VisibleForTesting?
@@ -217,12 +312,21 @@
         private fun create(
             codebase: PsiBasedCodebase,
             element: PsiModifierListOwner,
-            annotated: UAnnotated
+            annotated: UAnnotated,
+            enableKotlinPsi: Boolean
         ): PsiModifierItem {
             val modifierList = element.modifierList ?: return PsiModifierItem(codebase)
-            var flags = computeFlag(element, modifierList)
             val uAnnotations = annotated.uAnnotations
 
+            var flags = if (enableKotlinPsi) {
+                val ktModifiers = requireNotNull(annotated.sourcePsi as? KtModifierListOwner) {
+                    "Expected source PSI to implement KtModifierListOwner"
+                }
+                computeFlag(ktModifiers)
+            } else {
+                computeFlag(codebase, element, modifierList)
+            }
+
             return if (uAnnotations.isEmpty()) {
                 val psiAnnotations = modifierList.annotations
                 if (psiAnnotations.isNotEmpty()) {
@@ -237,7 +341,11 @@
 
                 val annotations: MutableList<AnnotationItem> = uAnnotations
                     // Uast sometimes puts nullability annotations on primitives!?
-                    .filter { !isPrimitiveVariable || it !is KotlinNullabilityUAnnotation }
+                    .filter {
+                        !isPrimitiveVariable ||
+                            it.qualifiedName == null ||
+                            !it.isKotlinNullabilityAnnotation
+                    }
                     .map {
 
                         val qualifiedName = it.qualifiedName
@@ -270,6 +378,12 @@
             }
         }
 
+        private val NOT_NULL = NotNull::class.qualifiedName
+        private val NULLABLE = Nullable::class.qualifiedName
+
+        private val UAnnotation.isKotlinNullabilityAnnotation: Boolean
+            get() = qualifiedName == NOT_NULL || qualifiedName == NULLABLE
+
         /** Modifies the modifier flags based on the VisibleForTesting otherwise constants */
         private fun getVisibilityFlag(ref: String, flags: Int): Int {
             val visibilityFlags = if (ref.endsWith("PROTECTED")) {
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt
index 3b9e528..4de649f 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt
@@ -19,7 +19,6 @@
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.PackageItem
 import com.android.tools.metalava.model.VisibilityLevel
-import com.android.tools.metalava.model.kotlin.KotlinClassItem
 import com.intellij.psi.PsiPackage
 
 class PsiPackageItem(
@@ -27,7 +26,9 @@
     private val psiPackage: PsiPackage,
     private val qualifiedName: String,
     modifiers: PsiModifierItem,
-    documentation: String
+    documentation: String,
+    /** True if this package is from the classpath (dependencies). Exposed in [isFromClassPath]. */
+    private val fromClassPath: Boolean
 ) :
     PsiItem(
         codebase = codebase,
@@ -37,10 +38,6 @@
     ),
     PackageItem {
 
-    init {
-        emit = false // [emit] defaults to false until a class with emit == true is added
-    }
-
     // Note - top level classes only
     private val classes: MutableList<ClassItem> = mutableListOf()
 
@@ -79,7 +76,7 @@
         }
     }
 
-    fun addClass(cls: ClassItem) {
+    fun addClass(cls: PsiClassItem) {
         if (!cls.isTopLevelClass()) {
             // TODO: Stash in a list somewhere to make allClasses() faster?
             return
@@ -97,12 +94,10 @@
         */
 
         classes.add(cls)
-        if (cls.emit) emit = true
-        if (cls is PsiClassItem) cls.containingPackage = this
-        if (cls is KotlinClassItem) cls.containingPackage = this
+        cls.containingPackage = this
     }
 
-    fun addClasses(classList: List<ClassItem>) {
+    fun addClasses(classList: List<PsiClassItem>) {
         for (cls in classList) {
             addClass(cls)
         }
@@ -140,8 +135,15 @@
         }
     }
 
+    override fun isFromClassPath(): Boolean = fromClassPath
+
     companion object {
-        fun create(codebase: PsiBasedCodebase, psiPackage: PsiPackage, extraDocs: String?): PsiPackageItem {
+        fun create(
+            codebase: PsiBasedCodebase,
+            psiPackage: PsiPackage,
+            extraDocs: String?,
+            fromClassPath: Boolean
+        ): PsiPackageItem {
             val commentText = javadoc(psiPackage) + if (extraDocs != null) "\n$extraDocs" else ""
             val modifiers = modifiers(codebase, psiPackage, commentText)
             if (modifiers.isPackagePrivate()) {
@@ -155,7 +157,8 @@
                 psiPackage = psiPackage,
                 qualifiedName = qualifiedName,
                 documentation = commentText,
-                modifiers = modifiers
+                modifiers = modifiers,
+                fromClassPath = fromClassPath
             )
             pkg.modifiers.setOwner(pkg)
             return pkg
@@ -167,7 +170,8 @@
                 psiPackage = original.psiPackage,
                 qualifiedName = original.qualifiedName,
                 documentation = original.documentation,
-                modifiers = PsiModifierItem.create(codebase, original.modifiers)
+                modifiers = PsiModifierItem.create(codebase, original.modifiers),
+                fromClassPath = original.isFromClassPath()
             )
             pkg.modifiers.setOwner(pkg)
             return pkg
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt
index 3f98f19..bff9155 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt
@@ -26,8 +26,8 @@
 import org.jetbrains.kotlin.psi.KtFunction
 import org.jetbrains.kotlin.psi.KtParameter
 import org.jetbrains.uast.UExpression
+import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.UastFacade
-import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
 
 class PsiParameterItem(
     override val codebase: PsiBasedCodebase,
@@ -68,7 +68,7 @@
             // Java: Look for @ParameterName annotation
             val annotation = modifiers.annotations().firstOrNull { it.isParameterName() }
             if (annotation != null) {
-                return annotation.attributes().firstOrNull()?.value?.value()?.toString()
+                return annotation.attributes.firstOrNull()?.value?.value()?.toString()
             }
         }
 
@@ -91,7 +91,7 @@
 
     private fun getKtParameter(): KtParameter? {
         val ktParameters =
-            ((containingMethod.psiMethod as? KotlinUMethod)?.sourcePsi as? KtFunction)?.valueParameters
+            ((containingMethod.psiMethod as? UMethod)?.sourcePsi as? KtFunction)?.valueParameters
                 ?: return null
 
         // Perform matching based on parameter names, because indices won't work in the
@@ -166,7 +166,7 @@
             // Java: Look for @ParameterName annotation
             val annotation = modifiers.annotations().firstOrNull { it.isDefaultValue() }
             if (annotation != null) {
-                return annotation.attributes().firstOrNull()?.value?.value()?.toString()
+                return annotation.attributes.firstOrNull()?.value?.value()?.toString()
             }
         }
 
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt
index fb127ef..f09db8d 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt
@@ -22,10 +22,10 @@
 import com.android.tools.metalava.model.TypeItem
 import com.intellij.psi.PsiClass
 import com.intellij.psi.PsiMethod
-import com.intellij.psi.PsiType
+import org.jetbrains.kotlin.psi.KtPropertyAccessor
 import org.jetbrains.uast.UClass
 
-class PsiPropertyItem(
+class PsiPropertyItem private constructor(
     override val codebase: PsiBasedCodebase,
     private val psiMethod: PsiMethod,
     private val containingClass: PsiClassItem,
@@ -33,7 +33,10 @@
     modifiers: PsiModifierItem,
     documentation: String,
     private val fieldType: PsiTypeItem,
-    override val constructorParameter: PsiParameterItem? = null
+    override val getter: PsiMethodItem,
+    override val setter: PsiMethodItem?,
+    override val constructorParameter: PsiParameterItem?,
+    override val backingField: PsiFieldItem?
 ) :
     PsiItem(
         codebase = codebase,
@@ -73,28 +76,58 @@
     override fun toString(): String = "field ${containingClass.fullName()}.${name()}"
 
     companion object {
+        /**
+         * Creates a new property item, given a [name], [type] and relationships to other items.
+         *
+         * Kotlin properties consist of up to four other declarations: Their accessor functions,
+         * primary constructor parameter, and a backing field. These relationships are useful for
+         * resolving documentation and exposing the model correctly in Kotlin stubs.
+         *
+         * Metalava currently requires all properties to have a [getter]. It does not currently
+         * support private, `const val`, or [JvmField] properties. Mutable `var` properties usually
+         * have a [setter], but properties with a private default setter may use direct field
+         * access instead.
+         *
+         * Properties declared in the primary constructor of a class have an associated
+         * [constructorParameter]. This relationship is important for resolving docs which may
+         * exist on the constructor parameter.
+         *
+         * Most properties on classes without a custom getter have a [backingField] to hold their
+         * value. This is private except for [JvmField] properties.
+         */
         fun create(
             codebase: PsiBasedCodebase,
             containingClass: PsiClassItem,
             name: String,
-            psiType: PsiType,
-            psiMethod: PsiMethod,
-            constructorParameter: PsiParameterItem? = null
+            type: PsiTypeItem,
+            getter: PsiMethodItem,
+            setter: PsiMethodItem? = null,
+            constructorParameter: PsiParameterItem? = null,
+            backingField: PsiFieldItem? = null
         ): PsiPropertyItem {
-            val commentText = javadoc(psiMethod)
-            val modifiers = modifiers(codebase, psiMethod, commentText)
-            val typeItem = codebase.getType(psiType)
+            val psiMethod = getter.psiMethod
+            val documentation = when (val sourcePsi = getter.sourcePsi) {
+                is KtPropertyAccessor -> javadoc(sourcePsi.property)
+                else -> javadoc(sourcePsi ?: psiMethod)
+            }
+            val modifiers = modifiers(codebase, psiMethod, documentation)
             val property = PsiPropertyItem(
                 codebase = codebase,
                 psiMethod = psiMethod,
                 containingClass = containingClass,
                 name = name,
-                documentation = commentText,
+                documentation = documentation,
                 modifiers = modifiers,
-                fieldType = typeItem,
-                constructorParameter = constructorParameter
+                fieldType = type,
+                getter = getter,
+                setter = setter,
+                constructorParameter = constructorParameter,
+                backingField = backingField
             )
+            getter.property = property
+            setter?.property = property
             constructorParameter?.property = property
+            backingField?.property = property
             property.modifiers.setOwner(property)
             return property
         }
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt
index a685428..6f9b277 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt
@@ -38,7 +38,8 @@
     hasImplicitDefaultConstructor = false,
     classType = TYPE_PARAMETER,
     modifiers = modifiers,
-    documentation = ""
+    documentation = "",
+    fromClassPath = false
 ),
     TypeParameterItem {
     override fun bounds(): List<ClassItem> = bounds
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt
index 7648421..0b99b35 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt
@@ -521,7 +521,7 @@
 
         if (elementAnnotations != null) {
             for (annotation in elementAnnotations) {
-                val name = mapAnnotation(annotation.qualifiedName())
+                val name = mapAnnotation(annotation.qualifiedName)
                 if (name != null) {
                     sb.append(annotation.toSource()).append(' ')
                     updated = true
diff --git a/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt
index 6598365..4d6ba79 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt
@@ -16,7 +16,7 @@
 
 package com.android.tools.metalava.model.psi
 
-import com.android.SdkConstants
+import com.android.SdkConstants.ATTR_VALUE
 import com.android.tools.lint.detector.api.ConstantEvaluator
 import com.android.tools.metalava.model.AnnotationArrayAttributeValue
 import com.android.tools.metalava.model.AnnotationAttribute
@@ -41,19 +41,16 @@
 import org.jetbrains.uast.UElement
 import org.jetbrains.uast.UExpression
 import org.jetbrains.uast.ULiteralExpression
+import org.jetbrains.uast.UQualifiedReferenceExpression
 import org.jetbrains.uast.UReferenceExpression
 import org.jetbrains.uast.util.isArrayInitializer
 
 class UAnnotationItem private constructor(
     override val codebase: PsiBasedCodebase,
     val uAnnotation: UAnnotation,
-    private val originalName: String?
+    override val originalName: String?
 ) : DefaultAnnotationItem(codebase) {
-    private val qualifiedName = AnnotationItem.mapName(codebase, originalName)
-
-    private var attributes: List<AnnotationAttribute>? = null
-
-    override fun originalName(): String? = originalName
+    override val qualifiedName: String? = AnnotationItem.mapName(codebase, originalName)
 
     override fun toString(): String = toSource()
 
@@ -77,37 +74,14 @@
         return super.isNonNull()
     }
 
-    override fun qualifiedName() = qualifiedName
-
-    override fun attributes(): List<AnnotationAttribute> {
-        if (attributes == null) {
-            val uAttributes = uAnnotation.attributeValues
-            attributes = if (uAttributes.isEmpty()) {
-                emptyList()
-            } else {
-                val list = mutableListOf<AnnotationAttribute>()
-                for (parameter in uAttributes) {
-                    list.add(
-                        UAnnotationAttribute(
-                            codebase,
-                            parameter.name ?: SdkConstants.ATTR_VALUE, parameter.expression
-                        )
-                    )
-                }
-                list
-            }
-        }
-
-        return attributes!!
+    override val attributes: List<UAnnotationAttribute> by lazy {
+        uAnnotation.attributeValues.map { attribute ->
+            UAnnotationAttribute(codebase, attribute.name ?: ATTR_VALUE, attribute.expression)
+        }.toList()
     }
 
-    override fun targets(): Set<AnnotationTarget> {
-        if (targets == null) {
-            targets = AnnotationItem.computeTargets(this) { className ->
-                codebase.findOrCreateClass(className)
-            }
-        }
-        return targets!!
+    override val targets: Set<AnnotationTarget> by lazy {
+        AnnotationItem.computeTargets(this, codebase::findOrCreateClass)
     }
 
     companion object {
@@ -157,7 +131,7 @@
             sb.append("@")
             sb.append(qualifiedName)
             sb.append("(")
-            if (attributes.size == 1 && (attributes[0].first == null || attributes[0].first == SdkConstants.ATTR_VALUE)) {
+            if (attributes.size == 1 && (attributes[0].first == null || attributes[0].first == ATTR_VALUE)) {
                 // Special case: omit "value" if it's the only attribute
                 appendValue(codebase, sb, attributes[0].second, target, showDefaultAttrs)
             } else {
@@ -168,7 +142,7 @@
                     } else {
                         sb.append(", ")
                     }
-                    sb.append(attribute.first ?: SdkConstants.ATTR_VALUE)
+                    sb.append(attribute.first ?: ATTR_VALUE)
                     sb.append('=')
                     appendValue(codebase, sb, attribute.second, target, showDefaultAttrs)
                 }
@@ -191,38 +165,17 @@
             when (value) {
                 null -> sb.append("null")
                 is ULiteralExpression -> sb.append(CodePrinter.constantToSource(value.value))
+                is UQualifiedReferenceExpression -> { // the value is a Foo.BAR type of reference.
+                    // expand `Foo` to fully qualified name `com.example.Foo`
+                    appendQualifiedName(codebase, sb, value.receiver as UReferenceExpression)
+                    // append accessor `.`
+                    sb.append(value.accessType.name)
+                    // append `BAR`
+                    sb.append(value.selector.asRenderString())
+                }
                 is UReferenceExpression -> {
-                    when (val resolved = value.resolve()) {
-                        is PsiField -> {
-                            val containing = resolved.containingClass
-                            if (containing != null) {
-                                // If it's a field reference, see if it looks like the field is hidden; if
-                                // so, inline the value
-                                val cls = codebase.findOrCreateClass(containing)
-                                val initializer = resolved.initializer
-                                if (initializer != null) {
-                                    val fieldItem = cls.findField(resolved.name)
-                                    if (fieldItem == null || fieldItem.isHiddenOrRemoved()) {
-                                        // Use the literal value instead
-                                        val source = getConstantSource(initializer)
-                                        if (source != null) {
-                                            sb.append(source)
-                                            return
-                                        }
-                                    }
-                                }
-                                containing.qualifiedName?.let {
-                                    sb.append(it).append('.')
-                                }
-                            }
-
-                            sb.append(resolved.name)
-                        }
-                        is PsiClass -> resolved.qualifiedName?.let { sb.append(it) }
-                        else -> {
-                            sb.append(value.sourcePsi?.text ?: value.asSourceString())
-                        }
-                    }
+                    // expand Foo to fully qualified name com.example.Foo
+                    appendQualifiedName(codebase, sb, value)
                 }
                 is UBinaryExpression -> {
                     appendValue(codebase, sb, value.leftOperand, target, showDefaultAttrs)
@@ -260,6 +213,40 @@
             }
         }
 
+        private fun appendQualifiedName(codebase: PsiBasedCodebase, sb: StringBuilder, value: UReferenceExpression) {
+            when (val resolved = value.resolve()) {
+                is PsiField -> {
+                    val containing = resolved.containingClass
+                    if (containing != null) {
+                        // If it's a field reference, see if it looks like the field is hidden; if
+                        // so, inline the value
+                        val cls = codebase.findOrCreateClass(containing)
+                        val initializer = resolved.initializer
+                        if (initializer != null) {
+                            val fieldItem = cls.findField(resolved.name)
+                            if (fieldItem == null || fieldItem.isHiddenOrRemoved()) {
+                                // Use the literal value instead
+                                val source = getConstantSource(initializer)
+                                if (source != null) {
+                                    sb.append(source)
+                                    return
+                                }
+                            }
+                        }
+                        containing.qualifiedName?.let {
+                            sb.append(it).append('.')
+                        }
+                    }
+
+                    sb.append(resolved.name)
+                }
+                is PsiClass -> resolved.qualifiedName?.let { sb.append(it) }
+                else -> {
+                    sb.append(value.sourcePsi?.text ?: value.asSourceString())
+                }
+            }
+        }
+
         private fun getConstantSource(value: UExpression): String? {
             val constant = value.evaluate()
             return CodePrinter.constantToExpression(constant)
diff --git a/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt b/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
index 72324ca..5766605 100644
--- a/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
@@ -15,6 +15,7 @@
  */
 package com.android.tools.metalava.model.text
 
+import com.android.SdkConstants.DOT_TXT
 import com.android.tools.lint.checks.infrastructure.stripComments
 import com.android.tools.metalava.ANDROIDX_NONNULL
 import com.android.tools.metalava.ANDROIDX_NULLABLE
@@ -162,7 +163,7 @@
 
         // Remove the block comments.
         val strippedApiText = if (apiText.contains("/*")) {
-            stripComments(apiText, false) // line comments are used to stash field constants
+            stripComments(apiText, DOT_TXT, false) // line comments are used to stash field constants
         } else {
             apiText
         }
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt
index e741a80..fce3a9d 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt
@@ -28,10 +28,10 @@
     source: String,
     mapName: Boolean = true
 ) : DefaultAnnotationItem(codebase) {
-    private val originalName: String
-    private val qualifiedName: String?
+    override val originalName: String
+    override val qualifiedName: String?
     private val full: String
-    private val attributes: List<AnnotationAttribute>
+    override val attributes: List<AnnotationAttribute>
 
     init {
         val index = source.indexOf("(")
@@ -56,8 +56,5 @@
         }
     }
 
-    override fun originalName(): String? = originalName
-    override fun qualifiedName(): String? = qualifiedName
-    override fun attributes(): List<AnnotationAttribute> = attributes
     override fun toSource(target: AnnotationTarget, showDefaultAttrs: Boolean): String = full
 }
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextItem.kt
index 37a8007..05e4c90 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextItem.kt
@@ -32,7 +32,7 @@
     override var hidden = false
     override var removed = false
 
-    override fun findTagDocumentation(tag: String): String? = null
+    override fun findTagDocumentation(tag: String, value: String?): String? = null
     override fun appendDocumentation(comment: String, tagSection: String?, append: Boolean) = codebase.unsupported()
     override fun mutableModifiers(): MutableModifierList = modifiers
     override fun isJava(): Boolean = codebase.unsupported() // source language not recorded in signature files
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt
index 5b359c1..9dba79a 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt
@@ -109,6 +109,8 @@
         return list
     }
 
+    override fun findMainDocumentation(): String = documentation
+
     override fun findPredicateSuperMethod(predicate: Predicate<Item>): MethodItem? = null
 
     private var typeParameterList: TypeParameterList = TypeParameterList.NONE
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt b/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt
index a48976c..2c72a0d 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt
@@ -68,9 +68,9 @@
                 }
             val codebase = codebase
             val item = object : DefaultAnnotationItem(codebase) {
-                override fun attributes(): List<AnnotationAttribute> = attributes
-                override fun originalName(): String? = originalName
-                override fun qualifiedName(): String? = qualifiedName
+                override val attributes: List<AnnotationAttribute> = attributes
+                override val originalName: String? = originalName
+                override val qualifiedName: String? = qualifiedName
                 override fun toSource(target: AnnotationTarget, showDefaultAttrs: Boolean): String = source
             }
             annotations.add(item)
diff --git a/src/main/resources/version.properties b/src/main/resources/version.properties
index 5c3abb2..0302221 100644
--- a/src/main/resources/version.properties
+++ b/src/main/resources/version.properties
@@ -2,4 +2,4 @@
 # Version definition
 # This file is read by gradle build scripts, but also packaged with metalava
 # as a resource for the Version classes to read.
-metalavaVersion=1.0.0-alpha04
+metalavaVersion=1.0.0-alpha05
diff --git a/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt b/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
index 07fd835..000703e 100644
--- a/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
+++ b/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
@@ -23,8 +23,8 @@
     fun `Flag TODO documentation`() {
         check(
             expectedIssues = """
-                src/android/pkg/Test.java:3: lint: Documentation mentions 'TODO' [Todo]
-                src/android/pkg/Test.java:5: lint: Documentation mentions 'TODO' [Todo]
+                src/android/pkg/Test.java:4: lint: Documentation mentions 'TODO' [Todo]
+                src/android/pkg/Test.java:6: lint: Documentation mentions 'TODO' [Todo]
                 """,
             sourceFiles = arrayOf(
                 // Nothing in outside of Android
@@ -66,8 +66,8 @@
     fun `Document Permissions`() {
         check(
             expectedIssues = """
-                src/android/pkg/PermissionTest.java:10: lint: Method 'test0' documentation mentions permissions without declaring @RequiresPermission [RequiresPermission]
-                src/android/pkg/PermissionTest.java:19: lint: Method 'test1' documentation mentions permissions already declared by @RequiresPermission [RequiresPermission]
+                src/android/pkg/PermissionTest.java:14: lint: Method 'test0' documentation mentions permissions without declaring @RequiresPermission [RequiresPermission]
+                src/android/pkg/PermissionTest.java:21: lint: Method 'test1' documentation mentions permissions already declared by @RequiresPermission [RequiresPermission]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -125,9 +125,9 @@
     fun `Document Intent Actions`() {
         check(
             expectedIssues = """
-                src/android/pkg/IntentActionTest.java:27: lint: Field 'BAR_FOO_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) [SdkConstant]
-                src/android/pkg/IntentActionTest.java:16: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @BroadcastBehavior [BroadcastBehavior]
-                src/android/pkg/IntentActionTest.java:16: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) [SdkConstant]
+                src/android/pkg/IntentActionTest.java:30: lint: Field 'BAR_FOO_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) [SdkConstant]
+                src/android/pkg/IntentActionTest.java:19: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @BroadcastBehavior [BroadcastBehavior]
+                src/android/pkg/IntentActionTest.java:19: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) [SdkConstant]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -176,8 +176,8 @@
         check(
             expectedIssues = """
                 src/android/pkg/NullMentions.java:18: warning: Parameter 'param1' of 'method3' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
-                src/android/pkg/NullMentions.java:19: warning: Return value of 'method4' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
-                src/android/pkg/NullMentions.java:8: warning: Field 'field2' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
+                src/android/pkg/NullMentions.java:21: warning: Return value of 'method4' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
+                src/android/pkg/NullMentions.java:9: warning: Field 'field2' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
                 """,
             extraArguments = arrayOf(ARG_WARNING, "Nullable"), // Hidden by default
             sourceFiles = arrayOf(
@@ -220,7 +220,7 @@
     fun `Check IntDef Warnings`() {
         check(
             expectedIssues = """
-                src/android/pkg/NullMentions.java:15: warning: Field 'field1' documentation mentions constants without declaring an @IntDef [IntDef]
+                src/android/pkg/NullMentions.java:16: warning: Field 'field1' documentation mentions constants without declaring an @IntDef [IntDef]
                 """,
             extraArguments = arrayOf(ARG_WARNING, "IntDef"), // Hidden by default
             sourceFiles = arrayOf(
diff --git a/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt b/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt
index 8eb9f03..1adf181 100644
--- a/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt
@@ -24,8 +24,8 @@
         check(
             showAnnotations = arrayOf("android.annotation.SystemApi"),
             expectedIssues = """
-                src/test/pkg/SystemApiClass.java:6: error: badAbstractHiddenMethod cannot be hidden and abstract when SystemApiClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
-                src/test/pkg/PublicClass.java:4: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/SystemApiClass.java:7: error: badAbstractHiddenMethod cannot be hidden and abstract when SystemApiClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/PublicClass.java:5: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
                 src/test/pkg/PublicClass.java:6: error: badPackagePrivateMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
             """,
             sourceFiles = arrayOf(
@@ -96,9 +96,9 @@
     fun `Hidden abstract method for public API`() {
         check(
             expectedIssues = """
-                src/test/pkg/PublicClass.java:4: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/PublicClass.java:5: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
                 src/test/pkg/PublicClass.java:6: error: badPackagePrivateMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
-                src/test/pkg/PublicClass.java:7: error: badAbstractSystemHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/PublicClass.java:9: error: badAbstractSystemHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
             """,
             sourceFiles = arrayOf(
                 java(
diff --git a/src/test/java/com/android/tools/metalava/ApiFileTest.kt b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
index f04ee75..36cbd0a 100644
--- a/src/test/java/com/android/tools/metalava/ApiFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
@@ -147,6 +147,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Default Values and Names in Kotlin`() {
         // Kotlin code which explicitly specifies parameter names
         check(
@@ -216,6 +217,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Default Values in Kotlin for expressions`() {
         // Testing trickier default values; regression test for problem
         // observed in androidx.core.util with LruCache
@@ -290,6 +292,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Basic Kotlin class`() {
         check(
             format = FileFormat.V1,
@@ -363,6 +366,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Kotlin Reified Methods`() {
         check(
             format = FileFormat.V1,
@@ -394,7 +398,7 @@
                     ctor public Context();
                     method public final <T> T getSystemService(Class<T>);
                   }
-                  public final class _java_Kt {
+                  public final class TestKt {
                     method public static inline <reified T> T systemService1(@NonNull test.pkg.Context);
                     method public static inline String systemService2(@NonNull test.pkg.Context);
                   }
@@ -404,6 +408,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Kotlin Reified Methods 2`() {
         check(
             sourceFiles = arrayOf(
@@ -436,6 +441,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Suspend functions`() {
         check(
             sourceFiles = arrayOf(
@@ -461,6 +467,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Var properties with private setters`() {
         check(
             format = FileFormat.V3,
@@ -495,6 +502,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Kotlin Generics`() {
         check(
             format = FileFormat.V3,
@@ -526,6 +534,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Nullness in reified signatures`() {
         check(
             sourceFiles = arrayOf(
@@ -594,6 +603,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Nullness in varargs`() {
         check(
             sourceFiles = arrayOf(
@@ -688,6 +698,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Propagate Platform types in Kotlin`() {
         check(
             format = FileFormat.V3,
@@ -815,6 +826,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Known nullness`() {
         // Don't emit platform types for some unannotated elements that we know the
         // nullness for: annotation type members, equals-parameters, initialized constants, etc.
@@ -968,6 +980,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun JvmOverloads() {
         // Regression test for https://github.com/android/android-ktx/issues/366
         check(
@@ -1019,6 +1032,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test JvmStatic`() {
         check(
             sourceFiles = arrayOf(
@@ -1055,6 +1069,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test JvmField`() {
         check(
             sourceFiles = arrayOf(
@@ -1088,6 +1103,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test JvmName`() {
         check(
             sourceFiles = arrayOf(
@@ -1123,6 +1139,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test RequiresOptIn and OptIn`() {
         check(
             sourceFiles = arrayOf(
@@ -1151,7 +1168,7 @@
             api = """
                 // Signature format: 3.0
                 package test.pkg {
-                  @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalBar {
+                  @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalBar {
                   }
                   @test.pkg.ExperimentalBar public final class FancyBar {
                     ctor public FancyBar();
@@ -1166,6 +1183,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test Experimental and UseExperimental`() {
         check(
             sourceFiles = arrayOf(
@@ -1230,7 +1248,7 @@
             api = """
                 // Signature format: 3.0
                 package androidx.annotation.experimental {
-                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface UseExperimental {
+                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.TYPEALIAS}) public @interface UseExperimental {
                     method public abstract kotlin.reflect.KClass<? extends java.lang.annotation.Annotation>[] markerClass();
                     property public abstract kotlin.reflect.KClass<? extends java.lang.annotation.Annotation>![] markerClass;
                   }
@@ -1240,7 +1258,7 @@
                     ctor public AnotherSimpleClass();
                     method public void methodUsingFancyBar();
                   }
-                  @kotlin.Experimental @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalBar {
+                  @kotlin.Experimental @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalBar {
                   }
                   @test.pkg.ExperimentalBar public final class FancyBar {
                     ctor public FancyBar();
@@ -1581,6 +1599,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Annotation retention`() {
         // For annotations where the java.lang.annotation classes themselves are not
         // part of the source tree, ensure that we compute the right retention (runtime, meaning
@@ -1631,7 +1650,7 @@
               }
             }
             package test.pkg {
-              @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) public @interface ExplicitRuntimeRetention {
+              @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) public @interface ExplicitRuntimeRetention {
               }
               @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Foo {
                 method public abstract String value();
@@ -2764,6 +2783,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test invalid class name`() {
         // Regression test for b/73018978
         check(
@@ -2889,7 +2909,7 @@
                 )
             ),
             expectedIssues = """
-                src/android/net/http/HttpResponseCache.java:6: warning: Public class android.net.http.HttpResponseCache stripped of unavailable superclass com.squareup.okhttp.OkCacheContainer [HiddenSuperclass]
+                src/android/net/http/HttpResponseCache.java:7: warning: Public class android.net.http.HttpResponseCache stripped of unavailable superclass com.squareup.okhttp.OkCacheContainer [HiddenSuperclass]
             """,
             api = """
                 package android.net.http {
@@ -3215,6 +3235,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test Visible For Testing`() {
         // Use the otherwise= visibility in signatures
         // Regression test for issue 118763806
@@ -3387,6 +3408,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `FooKt class constructors are not public`() {
         check(
             format = FileFormat.V3,
@@ -3807,6 +3829,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test tracking of @Composable annotation from classpath`() {
         check(
             format = FileFormat.V3,
@@ -3881,6 +3904,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test for experimental annotations from classpath`() {
         check(
             format = FileFormat.V3,
@@ -3955,6 +3979,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `@IntRange value in kotlin`() {
         check(
             format = FileFormat.V3,
@@ -4023,6 +4048,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Kotlin properties with overriding get`() {
         check(
             format = FileFormat.V3,
@@ -4058,6 +4084,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Constructor property tracking`() {
         check(
             format = FileFormat.V3,
@@ -4142,6 +4169,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Concise default Values and Names in Kotlin`() {
         // Kotlin code which explicitly specifies parameter names
         check(
@@ -4211,6 +4239,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Concise default Values in Kotlin for expressions`() {
         // Testing trickier default values; regression test for problem
         // observed in androidx.core.util with LruCache
@@ -4308,6 +4337,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Functional interface in signature`() {
         check(
             format = FileFormat.V4,
@@ -4339,6 +4369,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Inline class`() {
         check(
             format = FileFormat.V4,
@@ -4365,6 +4396,8 @@
                   public final inline class Dp implements java.lang.Comparable<test.pkg.Dp> {
                     ctor public Dp();
                     method public float getValue();
+                    method public inline operator float minus(float other);
+                    method public inline operator float plus(float other);
                     property public final float value;
                   }
                 }
@@ -4373,6 +4406,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Value class`() {
         check(
             format = FileFormat.V4,
@@ -4408,4 +4442,157 @@
             """
         )
     }
+
+    @Test
+    @TestKotlinPsi
+    fun `Kotlin doesn't expand java named constants`() {
+        check(
+            format = FileFormat.V3,
+            sourceFiles =
+            arrayOf(
+                kotlin(
+                    """
+                        package test.pkg
+                        annotation class Foo(val bar: Long = java.lang.Long.MIN_VALUE)
+                    """
+                )
+            ),
+            api =
+            """
+                // Signature format: 3.0
+                package test.pkg {
+                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Foo {
+                    method public abstract long bar() default java.lang.Long.MIN_VALUE;
+                    property public abstract long bar;
+                  }
+                }
+            """
+        )
+    }
+
+    @Test
+    @TestKotlinPsi
+    fun `Kotlin constructors with JvmOverloads`() {
+        check(
+            format = FileFormat.V4,
+            sourceFiles = arrayOf(
+                kotlin(
+                    """
+                        package test.pkg
+
+                        class AllOptionalJvmOverloads @JvmOverloads constructor(
+                            private val foo: Int = 0,
+                            private val bar: Int = 0
+                        )
+
+                        class AllOptionalNoJvmOverloads(
+                            private val foo: Int = 0,
+                            private val bar: Int = 0
+                        )
+
+                        class SomeOptionalJvmOverloads @JvmOverloads constructor(
+                            private val foo: Int,
+                            private val bar: Int = 0
+                        )
+
+                        class SomeOptionalNoJvmOverloads(
+                            private val foo: Int,
+                            private val bar: Int = 0
+                        )
+                    """
+                )
+            ),
+            api = """
+                // Signature format: 4.0
+                package test.pkg {
+                  public final class AllOptionalJvmOverloads {
+                    ctor public AllOptionalJvmOverloads(optional int foo, optional int bar);
+                    ctor public AllOptionalJvmOverloads(optional int foo);
+                    ctor public AllOptionalJvmOverloads();
+                  }
+                  public final class AllOptionalNoJvmOverloads {
+                    ctor public AllOptionalNoJvmOverloads(optional int foo, optional int bar);
+                  }
+                  public final class SomeOptionalJvmOverloads {
+                    ctor public SomeOptionalJvmOverloads(int foo, optional int bar);
+                    ctor public SomeOptionalJvmOverloads(int foo);
+                  }
+                  public final class SomeOptionalNoJvmOverloads {
+                    ctor public SomeOptionalNoJvmOverloads(int foo, optional int bar);
+                  }
+                }
+            """
+        )
+    }
+
+    @Test
+    fun `Kotlin public methods with DeprecationLevel HIDDEN are public API`() {
+        check(
+            format = FileFormat.V3,
+            sourceFiles = arrayOf(
+                kotlin(
+                    """
+                        package test.pkg
+                        @Deprecated(
+                            message = "So much regret",
+                            level = DeprecationLevel.HIDDEN
+                        )
+                        fun myMethod() { TODO() }
+                        @Deprecated(
+                            message = "So much regret",
+                            level = DeprecationLevel.HIDDEN
+                        )
+                        internal fun myInternalMethod() { TODO() }
+                        @Deprecated(
+                            message = "So much regret",
+                            level = DeprecationLevel.HIDDEN
+                        )
+                        private fun myPrivateMethod() { TODO() }
+                        @Deprecated(
+                            message = "So much regret",
+                            level = DeprecationLevel.WARNING
+                        )
+                        fun myNormalDeprecatedMethod() { TODO() }
+                    """
+                )
+            ),
+            api = """
+                // Signature format: 3.0
+                package test.pkg {
+                  public final class TestKt {
+                    method @Deprecated public static void myMethod();
+                    method @Deprecated public static void myNormalDeprecatedMethod();
+                  }
+                }
+            """
+        )
+    }
+
+    @Test
+    fun `Annotations aren't dropped when DeprecationLevel is HIDDEN`() {
+        check(
+            format = FileFormat.V3,
+            sourceFiles = arrayOf(
+                kotlin(
+                    """
+                        package test.pkg
+                        @Deprecated(
+                            message = "So much regret",
+                            level = DeprecationLevel.HIDDEN
+                        )
+                        @IntRange(from=0)
+                        fun myMethod() { TODO() }
+                    """
+                )
+            ),
+            api = """
+                // Signature format: 3.0
+                package test.pkg {
+                  public final class TestKt {
+                    method @Deprecated @kotlin.ranges.IntRange public static void myMethod();
+                  }
+                }
+            """
+        )
+    }
 }
diff --git a/src/test/java/com/android/tools/metalava/ApiLintTest.kt b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
index 0956c51..e4f6313 100644
--- a/src/test/java/com/android/tools/metalava/ApiLintTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
@@ -21,6 +21,7 @@
 class ApiLintTest : DriverTest() {
 
     @Test
+    @TestKotlinPsi
     fun `Test names`() {
         // Make sure we only flag issues in new API
         check(
@@ -41,7 +42,7 @@
                 src/android/pkg/badlyNamedClass.java:7: error: Method name must start with lowercase char: BadlyNamedMethod1 [StartWithLower] [See https://s.android.com/api-guidelines#style-conventions]
                 src/android/pkg/badlyNamedClass.java:9: warning: Acronyms should not be capitalized in method names: was `fromHTMLToHTML`, should this be `fromHtmlToHtml`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
                 src/android/pkg/badlyNamedClass.java:10: warning: Acronyms should not be capitalized in method names: was `toXML`, should this be `toXml`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
-                src/android/pkg/badlyNamedClass.java:11: warning: Acronyms should not be capitalized in method names: was `getID`, should this be `getId`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
+                src/android/pkg/badlyNamedClass.java:12: warning: Acronyms should not be capitalized in method names: was `getID`, should this be `getId`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
                 src/android/pkg/badlyNamedClass.java:6: error: Constant field names must be named with only upper case characters: `android.pkg.badlyNamedClass#BadlyNamedField`, should be `BADLY_NAMED_FIELD`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
                 """,
             expectedFail = DefaultLintErrorMessage,
@@ -216,11 +217,11 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                src/android/pkg/Constants.java:13: error: All constants must be defined at compile time: android.pkg.Constants#FOO [CompileTimeConstant]
+                src/android/pkg/Constants.java:14: error: All constants must be defined at compile time: android.pkg.Constants#FOO [CompileTimeConstant]
                 src/android/pkg/Constants.java:12: warning: If min/max could change in future, make them dynamic methods: android.pkg.Constants#MAX_FOO [MinMaxConstant] [See https://s.android.com/api-guidelines#min-max-constants]
                 src/android/pkg/Constants.java:11: warning: If min/max could change in future, make them dynamic methods: android.pkg.Constants#MIN_FOO [MinMaxConstant] [See https://s.android.com/api-guidelines#min-max-constants]
-                src/android/pkg/Constants.java:9: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#myStrings`, should be `MY_STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
-                src/android/pkg/Constants.java:7: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#strings`, should be `STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
+                src/android/pkg/Constants.java:10: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#myStrings`, should be `MY_STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
+                src/android/pkg/Constants.java:8: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#strings`, should be `STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -639,6 +640,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Fields must be final and properly named`() {
         check(
             apiLint = "", // enabled
@@ -760,7 +762,7 @@
                         public @Nullable Future<String> bad3() { return null; }
                         public void bad4(@Nullable Future<String> param) { }
 
-                        public @Nullable ListenableFuture<String> ok1() { return null; }
+                        public @Nullable ListenableFuture<String> okAsync() { return null; }
                         public void ok2(@Nullable ListenableFuture<String> param) { }
 
                         public interface BadFuture<T> extends Future<T> {
@@ -789,9 +791,9 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                src/android/pkg/MyClass.java:15: error: Don't expose @IntDef: SomeInt must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
-                src/android/pkg/MyClass.java:20: error: Don't expose @LongDef: SomeLong must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
-                src/android/pkg/MyClass.java:10: error: Don't expose @StringDef: SomeString must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
+                src/android/pkg/MyClass.java:19: error: Don't expose @IntDef: SomeInt must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
+                src/android/pkg/MyClass.java:24: error: Don't expose @LongDef: SomeLong must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
+                src/android/pkg/MyClass.java:14: error: Don't expose @StringDef: SomeString must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -885,6 +887,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Api methods should not be synchronized in their signature`() {
         check(
             apiLint = "", // enabled
@@ -971,8 +974,8 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                src/android/pkg/IntentBuilderNames.java:8: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `makeMyIntent` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
-                src/android/pkg/IntentBuilderNames.java:10: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `createIntentNow` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
+                src/android/pkg/IntentBuilderNames.java:9: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `makeMyIntent` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
+                src/android/pkg/IntentBuilderNames.java:11: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `createIntentNow` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -1073,16 +1076,16 @@
                 src/android/pkg/Bad.java:12: warning: Builder must be final: android.pkg.Bad.BadBuilder [StaticFinalBuilder] [See https://s.android.com/api-guidelines#builders-static-inner]
                 src/android/pkg/Bad.java:12: warning: Builder must be static: android.pkg.Bad.BadBuilder [StaticFinalBuilder] [See https://s.android.com/api-guidelines#builders-static-inner]
                 src/android/pkg/Bad.java:13: warning: Builder constructor arguments must be mandatory (i.e. not @Nullable): parameter badParameter in android.pkg.Bad.BadBuilder(String badParameter) [OptionalBuilderConstructorArgument] [See https://s.android.com/api-guidelines#builders-nonnull-constructors]
-                src/android/pkg/Bad.java:36: warning: Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.pkg.Bad.BadBuilder.withBadSetterStyle(boolean) [BuilderSetStyle] [See https://s.android.com/api-guidelines#builder-method-naming]
-                src/android/pkg/Bad.java:39: warning: Builder setter must be @NonNull: method android.pkg.Bad.BadBuilder.setReturnsNullable(boolean) [SetterReturnsThis]
+                src/android/pkg/Bad.java:37: warning: Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.pkg.Bad.BadBuilder.withBadSetterStyle(boolean) [BuilderSetStyle] [See https://s.android.com/api-guidelines#builder-method-naming]
+                src/android/pkg/Bad.java:40: warning: Builder setter must be @NonNull: method android.pkg.Bad.BadBuilder.setReturnsNullable(boolean) [SetterReturnsThis]
                 src/android/pkg/Bad.java:42: warning: Getter should be on the built object, not the builder: method android.pkg.Bad.BadBuilder.getOnBuilder() [GetterOnBuilder] [See https://s.android.com/api-guidelines#getter-on-builder]
                 src/android/pkg/Bad.java:44: warning: Methods must return the builder object (return type android.pkg.Bad.BadBuilder instead of void): method android.pkg.Bad.BadBuilder.setNotReturningBuilder(boolean) [SetterReturnsThis]
-                src/android/pkg/Bad.java:18: warning: android.pkg.Bad does not declare a `getWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addWithoutMatchingGetter(String) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:21: warning: android.pkg.Bad does not declare a `isWithoutMatchingGetter()` method matching method android.pkg.Bad.BadBuilder.setWithoutMatchingGetter(boolean) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:24: warning: android.pkg.Bad does not declare a `getPluralWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetter(Collection<String>) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:30: warning: android.pkg.Bad does not declare a getter method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetters(Collection<String>) (expected one of: [getPluralWithoutMatchingGetters(), getPluralWithoutMatchingGetterses()]) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:19: warning: android.pkg.Bad does not declare a `getWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addWithoutMatchingGetter(String) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:22: warning: android.pkg.Bad does not declare a `isWithoutMatchingGetter()` method matching method android.pkg.Bad.BadBuilder.setWithoutMatchingGetter(boolean) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:25: warning: android.pkg.Bad does not declare a `getPluralWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetter(Collection<String>) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:31: warning: android.pkg.Bad does not declare a getter method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetters(Collection<String>) (expected one of: [getPluralWithoutMatchingGetters(), getPluralWithoutMatchingGetterses()]) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
                 src/android/pkg/Bad.java:44: warning: android.pkg.Bad does not declare a `isNotReturningBuilder()` method matching method android.pkg.Bad.BadBuilder.setNotReturningBuilder(boolean) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:55: warning: Methods must return the builder object (return type android.pkg.Bad.BadGenericBuilder<T> instead of T): method android.pkg.Bad.BadGenericBuilder.setBoolean(boolean) [SetterReturnsThis]
+                src/android/pkg/Bad.java:56: warning: Methods must return the builder object (return type android.pkg.Bad.BadGenericBuilder<T> instead of T): method android.pkg.Bad.BadGenericBuilder.setBoolean(boolean) [SetterReturnsThis]
                 src/android/pkg/Bad.java:50: warning: android.pkg.Bad.NoBuildMethodBuilder does not declare a `build()` method, but builder classes are expected to [MissingBuildMethod] [See https://s.android.com/api-guidelines#builder-must-declare-build]
                 src/android/pkg/TopLevelBuilder.java:3: warning: Builder should be defined as inner class: android.pkg.TopLevelBuilder [TopLevelBuilder] [See https://s.android.com/api-guidelines#builders-static-inner]
                 src/android/pkg/TopLevelBuilder.java:3: warning: android.pkg.TopLevelBuilder does not declare a `build()` method, but builder classes are expected to [MissingBuildMethod] [See https://s.android.com/api-guidelines#builder-must-declare-build]
@@ -1405,7 +1408,7 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                    src/android/pkg/MyClass.java:20: error: Symmetric method for `isVisibleBad` must be named `setVisibleBad`; was `setIsVisibleBad` [GetterSetterNames]
+                    src/android/pkg/MyClass.java:21: error: Symmetric method for `isVisibleBad` must be named `setVisibleBad`; was `setIsVisibleBad` [GetterSetterNames]
                     src/android/pkg/MyClass.java:24: error: Symmetric method for `hasTransientStateBad` must be named `setHasTransientStateBad`; was `setTransientStateBad` [GetterSetterNames]
                     src/android/pkg/MyClass.java:28: error: Symmetric method for `setHasTransientStateAlsoBad` must be named `hasTransientStateAlsoBad`; was `isHasTransientStateAlsoBad` [GetterSetterNames]
                     src/android/pkg/MyClass.java:31: error: Symmetric method for `setCanRecordBad` must be named `canRecordBad`; was `isCanRecordBad` [GetterSetterNames]
@@ -1470,7 +1473,7 @@
             apiLint = "", // enabled
             expectedIssues = """
                 src/android/pkg/MyClass.java:6: error: Parameter type is concrete collection (`java.util.HashMap`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
-                src/android/pkg/MyClass.java:9: error: Return type is concrete collection (`java.util.Vector`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
+                src/android/pkg/MyClass.java:10: error: Return type is concrete collection (`java.util.Vector`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
                 src/android/pkg/MyClass.java:10: error: Parameter type is concrete collection (`java.util.LinkedList`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
                 """,
             expectedFail = DefaultLintErrorMessage,
@@ -1504,9 +1507,9 @@
             expectedIssues = """
                 src/android/pkg/MySubClass.java:5: warning: Public class android.pkg.MySubClass stripped of unavailable superclass android.pkg.MyHiddenInterface [HiddenSuperclass]
                 src/android/pkg/MyCallback.java:4: warning: Type of parameter list in android.pkg.MyCallback.onFoo(java.util.List<java.lang.String> list) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
-                src/android/pkg/MyClass.java:8: warning: Return type of method android.pkg.MyClass.getList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
-                src/android/pkg/MyClass.java:12: warning: Type of field android.pkg.MyClass.STRINGS is a nullable collection (`java.lang.String[]`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
-                src/android/pkg/MySubClass.java:12: warning: Return type of method android.pkg.MySubClass.getOtherList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
+                src/android/pkg/MyClass.java:9: warning: Return type of method android.pkg.MyClass.getList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
+                src/android/pkg/MyClass.java:13: warning: Type of field android.pkg.MyClass.STRINGS is a nullable collection (`java.lang.String[]`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
+                src/android/pkg/MySubClass.java:14: warning: Return type of method android.pkg.MySubClass.getOtherList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -1693,9 +1696,9 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                src/android/pkg/MyClass.java:8: error: Type must not be heavy BitSet (method android.pkg.MyClass.reverse(java.util.BitSet)) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
+                src/android/pkg/MyClass.java:9: error: Type must not be heavy BitSet (method android.pkg.MyClass.reverse(java.util.BitSet)) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
                 src/android/pkg/MyClass.java:9: error: Type must not be heavy BitSet (parameter bitset in android.pkg.MyClass.reverse(java.util.BitSet bitset)) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
-                src/android/pkg/MyClass.java:6: error: Type must not be heavy BitSet (field android.pkg.MyClass.bitset) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
+                src/android/pkg/MyClass.java:7: error: Type must not be heavy BitSet (field android.pkg.MyClass.bitset) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -1724,7 +1727,7 @@
             apiLint = "", // enabled
             expectedIssues = """
                 src/android/pkg/MyFirstManager.java:6: error: Managers must always be obtained from Context; no direct constructors [ManagerConstructor]
-                src/android/pkg/MyFirstManager.java:8: error: Managers must always be obtained from Context (`get`) [ManagerLookup]
+                src/android/pkg/MyFirstManager.java:9: error: Managers must always be obtained from Context (`get`) [ManagerLookup]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -1760,6 +1763,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Check boxed types`() {
         check(
             apiLint = "", // enabled
@@ -1767,10 +1771,10 @@
                 src/test/pkg/KotlinClass.kt:4: error: Must avoid boxed primitives (`java.lang.Double`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 src/test/pkg/KotlinClass.kt:6: error: Must avoid boxed primitives (`java.lang.Boolean`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 src/test/pkg/MyClass.java:9: error: Must avoid boxed primitives (`java.lang.Long`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
-                src/test/pkg/MyClass.java:11: error: Must avoid boxed primitives (`java.lang.Short`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
+                src/test/pkg/MyClass.java:12: error: Must avoid boxed primitives (`java.lang.Short`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 src/test/pkg/MyClass.java:12: error: Must avoid boxed primitives (`java.lang.Double`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
-                src/test/pkg/MyClass.java:13: error: Must avoid boxed primitives (`java.lang.Boolean`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
-                src/test/pkg/MyClass.java:6: error: Must avoid boxed primitives (`java.lang.Integer`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
+                src/test/pkg/MyClass.java:14: error: Must avoid boxed primitives (`java.lang.Boolean`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
+                src/test/pkg/MyClass.java:7: error: Must avoid boxed primitives (`java.lang.Integer`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -2445,7 +2449,7 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                src/android/pkg/MyErrorClass1.java:7: warning: Type `java.util.TimeZone` should be replaced with richer ICU type `android.icu.util.TimeZone` [UseIcu]
+                src/android/pkg/MyErrorClass1.java:8: warning: Type `java.util.TimeZone` should be replaced with richer ICU type `android.icu.util.TimeZone` [UseIcu]
             """,
             manifest = """<?xml version="1.0" encoding="UTF-8"?>
                 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
@@ -2568,11 +2572,12 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Return collections instead of arrays`() {
         check(
             extraArguments = arrayOf(ARG_API_LINT, ARG_HIDE, "AutoBoxing"),
             expectedIssues = """
-                src/android/pkg/ArrayTest.java:11: warning: Method should return Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]` [ArrayReturn] [See https://s.android.com/api-guidelines#methods-prefer-collection-over-array]
+                src/android/pkg/ArrayTest.java:12: warning: Method should return Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]` [ArrayReturn] [See https://s.android.com/api-guidelines#methods-prefer-collection-over-array]
                 src/android/pkg/ArrayTest.java:13: warning: Method parameter should be Collection<Number> (or subclass) instead of raw array; was `java.lang.Number[]` [ArrayReturn] [See https://s.android.com/api-guidelines#methods-prefer-collection-over-array]
                 """,
             sourceFiles = arrayOf(
@@ -2680,7 +2685,7 @@
             expectedIssues = """
                 src/android/content/Context.java:11: error: Inconsistent service constant name; expected `SOMETHING_SERVICE`, was `OTHER_MANAGER` [ServiceName]
                 src/android/content/Context.java:12: error: Inconsistent service constant name; expected `OTHER_SERVICE`, was `OTHER_MANAGER_SERVICE` [ServiceName]
-                src/android/content/Context.java:9: error: Inconsistent service value; expected `other`, was `something` (Note: Do not change the name of already released services, which will break tools using `adb shell dumpsys`. Instead add `@SuppressLint("ServiceName"))` [ServiceName]
+                src/android/content/Context.java:10: error: Inconsistent service value; expected `other`, was `something` (Note: Do not change the name of already released services, which will break tools using `adb shell dumpsys`. Instead add `@SuppressLint("ServiceName"))` [ServiceName]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -2750,7 +2755,7 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                src/android/pkg/CloneTest.java:7: error: Provide an explicit copy constructor instead of implementing `clone()` [NoClone] [See https://s.android.com/api-guidelines#avoid-clone]
+                src/android/pkg/CloneTest.java:8: error: Provide an explicit copy constructor instead of implementing `clone()` [NoClone] [See https://s.android.com/api-guidelines#avoid-clone]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -2778,7 +2783,7 @@
             apiLint = "", // enabled
             expectedIssues = """
                 src/android/pkg/IcuTest.java:6: warning: Type `java.util.TimeZone` should be replaced with richer ICU type `android.icu.util.TimeZone` [UseIcu]
-                src/android/pkg/IcuTest.java:7: warning: Type `java.text.BreakIterator` should be replaced with richer ICU type `android.icu.text.BreakIterator` [UseIcu]
+                src/android/pkg/IcuTest.java:8: warning: Type `java.text.BreakIterator` should be replaced with richer ICU type `android.icu.text.BreakIterator` [UseIcu]
                 src/android/pkg/IcuTest.java:8: warning: Type `java.text.Collator` should be replaced with richer ICU type `android.icu.text.Collator` [UseIcu]
                 """,
             sourceFiles = arrayOf(
@@ -2957,13 +2962,14 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `KotlinOperator check only applies when not using operator modifier`() {
         check(
             apiLint = "", // enabled
             expectedIssues = """
                 src/android/pkg/A.kt:3: info: Note that adding the `operator` keyword would allow calling this method using operator syntax [KotlinOperator]
                 src/android/pkg/Bar.kt:4: info: Note that adding the `operator` keyword would allow calling this method using operator syntax [KotlinOperator]
-                src/android/pkg/Foo.java:7: info: Method can be invoked as a binary operator from Kotlin: `div` (this is usually desirable; just make sure it makes sense for this type of object) [KotlinOperator]
+                src/android/pkg/Foo.java:8: info: Method can be invoked as a binary operator from Kotlin: `div` (this is usually desirable; just make sure it makes sense for this type of object) [KotlinOperator]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -3020,6 +3026,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test fields, parameters and returns require nullability`() {
         check(
             apiLint = "", // enabled
@@ -3148,7 +3155,7 @@
         check(
             apiLint = "", // enabled
             expectedIssues = """
-                src/test/pkg/MyClass.java:13: error: Missing nullability on method `method4` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
+                src/test/pkg/MyClass.java:14: error: Missing nullability on method `method4` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
                 src/test/pkg/MyClass.java:14: error: Missing nullability on parameter `input` in method `method4` [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
             """,
             expectedFail = DefaultLintErrorMessage,
@@ -3199,7 +3206,7 @@
             ),
             expectedIssues = """
                 src/android/provider/Settings.java:9: error: New setting keys are not allowed (Field: BAD1); use getters/setters in relevant manager class [NoSettingsProvider] [See https://s.android.com/api-guidelines#no-settings-provider]
-                src/android/provider/Settings.java:11: error: Bare field okay2 must be marked final, or moved behind accessors if mutable [MutableBareField] [See https://s.android.com/api-guidelines#mutable-bare-field]
+                src/android/provider/Settings.java:12: error: Bare field okay2 must be marked final, or moved behind accessors if mutable [MutableBareField] [See https://s.android.com/api-guidelines#mutable-bare-field]
                 src/android/provider/Settings.java:17: error: New setting keys are not allowed (Field: BAD1); use getters/setters in relevant manager class [NoSettingsProvider] [See https://s.android.com/api-guidelines#no-settings-provider]
                 src/android/provider/Settings.java:21: error: New setting keys are not allowed (Field: BAD1); use getters/setters in relevant manager class [NoSettingsProvider] [See https://s.android.com/api-guidelines#no-settings-provider]
             """,
@@ -3273,6 +3280,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `vararg use in annotations`() {
         check(
             apiLint = "", // enabled
@@ -3396,6 +3404,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `No warnings about nullability on private constructor getters`() {
         check(
             expectedIssues = "",
@@ -3412,4 +3421,56 @@
             )
         )
     }
+
+    @Test
+    fun `Methods returning ListenableFuture end with async`() {
+        check(
+            apiLint = "", // enabled
+            expectedIssues = """
+                src/android/pkg/MyClass.java:7: error: Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function [AsyncSuffixFuture]
+            """,
+            expectedFail = DefaultLintErrorMessage,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package android.pkg;
+
+                    import androidx.annotation.Nullable;
+                    import com.google.common.util.concurrent.ListenableFuture;
+
+                    public final class MyClass {
+                        public @Nullable ListenableFuture<String> bad() { return null; }
+                        public @Nullable ListenableFuture<String> goodAsync() { return null; }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package com.google.common.util.concurrent;
+                    public class ListenableFuture<T> {
+                    }
+                    """
+                ),
+                androidxNullableSource
+            )
+        )
+    }
+
+    @Test
+    fun `No warning on generic return type`() {
+        check(
+            expectedIssues = "",
+            apiLint = "",
+            sourceFiles = arrayOf(
+                kotlin(
+                    """
+                        package test.pkg
+                        class SimpleArrayMap<K, V> {
+                            override fun getOrDefault(key: K, defaultValue: V): V {}
+                        }
+                    """
+                )
+            )
+        )
+    }
 }
diff --git a/src/test/java/com/android/tools/metalava/ArtifactTaggerTest.kt b/src/test/java/com/android/tools/metalava/ArtifactTaggerTest.kt
index c684645..27d8ead 100644
--- a/src/test/java/com/android/tools/metalava/ArtifactTaggerTest.kt
+++ b/src/test/java/com/android/tools/metalava/ArtifactTaggerTest.kt
@@ -81,9 +81,9 @@
             ),
             extraArguments = arrayOf(ARG_ERROR, "NoArtifactData,BrokenArtifactFile"),
             expectedIssues = """
-                src/test/pkg/foo/Foo.java:2: error: Class test.pkg.foo.Foo belongs to multiple artifacts: my.library.group:foo:1.0.0 and my.library.group:bar:3.1.4 [BrokenArtifactFile]
+                src/test/pkg/foo/Foo.java:3: error: Class test.pkg.foo.Foo belongs to multiple artifacts: my.library.group:foo:1.0.0 and my.library.group:bar:3.1.4 [BrokenArtifactFile]
                 src/test/pkg/foo/Foo.java:4: error: Class test.pkg.foo.Foo.Inner belongs to multiple artifacts: my.library.group:foo:1.0.0 and my.library.group:bar:3.1.4 [BrokenArtifactFile]
-                src/test/pkg/baz/Missing.java:2: error: No registered artifact signature file referenced class test.pkg.baz.Missing [NoArtifactData]
+                src/test/pkg/baz/Missing.java:3: error: No registered artifact signature file referenced class test.pkg.baz.Missing [NoArtifactData]
             """,
             docStubs = true,
             stubFiles = arrayOf(
diff --git a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
index 12b4339..0fdfad6 100644
--- a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
+++ b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
@@ -171,6 +171,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Kotlin Nullness`() {
         check(
             expectedIssues = """
@@ -222,7 +223,7 @@
     fun `Java Parameter Name Change`() {
         check(
             expectedIssues = """
-                src/test/pkg/JavaClass.java:6: error: Attempted to remove parameter name from parameter newName in test.pkg.JavaClass.method1 in method test.pkg.JavaClass.method1 [ParameterNameChange]
+                src/test/pkg/JavaClass.java:6: error: Attempted to remove parameter name from parameter newName in test.pkg.JavaClass.method1 [ParameterNameChange]
                 src/test/pkg/JavaClass.java:7: error: Attempted to change parameter name from secondParameter to newName in method test.pkg.JavaClass.method2 [ParameterNameChange]
                 """,
             checkCompatibilityApi = """
@@ -254,6 +255,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Kotlin Parameter Name Change`() {
         check(
             expectedIssues = """
@@ -341,6 +343,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Remove operator`() {
         check(
             expectedIssues = """
@@ -369,6 +372,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Remove vararg`() {
         check(
             expectedIssues = """
@@ -395,6 +399,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Add final`() {
         // Adding final on class or method is incompatible; adding it on a parameter is fine.
         // Field is iffy.
@@ -613,7 +618,7 @@
     fun `Added constructor`() {
         // Regression test for issue 116619591
         check(
-            expectedIssues = "src/test/pkg/AbstractMap.java:2: error: Added constructor test.pkg.AbstractMap() [AddedMethod]",
+            expectedIssues = "src/test/pkg/AbstractMap.java:3: error: Added constructor test.pkg.AbstractMap() [AddedMethod]",
             checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class AbstractMap<K, V> implements java.util.Map {
@@ -634,6 +639,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Remove infix`() {
         check(
             expectedIssues = """
@@ -666,6 +672,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Add seal`() {
         check(
             expectedIssues = """
@@ -689,11 +696,12 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Remove default parameter`() {
         check(
             expectedIssues = """
-                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo in constructor test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
-                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 in method test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
 
                 """,
             inputKotlinStyleNulls = true,
@@ -726,11 +734,12 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Remove optional parameter`() {
         check(
             expectedIssues = """
-                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo in constructor test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
-                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 in method test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
                 """,
             inputKotlinStyleNulls = true,
             format = FileFormat.V4,
@@ -823,7 +832,7 @@
                 src/test/pkg/Parent.java:10: error: Field test.pkg.Parent.field7 has changed 'volatile' qualifier [ChangedVolatile]
                 src/test/pkg/Parent.java:11: error: Field test.pkg.Parent.field8 has changed deprecation state true --> false [ChangedDeprecated]
                 src/test/pkg/Parent.java:12: error: Field test.pkg.Parent.field9 has changed deprecation state false --> true [ChangedDeprecated]
-                src/test/pkg/Parent.java:19: error: Field test.pkg.Parent.field94 has changed value from 1 to 42 [ChangedValue]
+                src/test/pkg/Parent.java:20: error: Field test.pkg.Parent.field94 has changed value from 1 to 42 [ChangedValue]
                 """,
             checkCompatibilityApi = """
                 package test.pkg {
@@ -1096,7 +1105,7 @@
     fun `Incompatible class change -- deprecation`() {
         check(
             expectedIssues = """
-                src/test/pkg/Class1.java:3: error: Class test.pkg.Class1 has changed deprecation state false --> true [ChangedDeprecated]
+                src/test/pkg/Class1.java:4: error: Class test.pkg.Class1 has changed deprecation state false --> true [ChangedDeprecated]
                 """,
             checkCompatibilityApi = """
                 package test.pkg {
@@ -1564,6 +1573,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test Kotlin extensions`() {
         check(
             inputKotlinStyleNulls = true,
@@ -1611,6 +1621,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test Kotlin type bounds`() {
         check(
             inputKotlinStyleNulls = false,
@@ -2493,6 +2504,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Compare signatures with Kotlin nullability from source`() {
         check(
             expectedIssues = """
@@ -2522,6 +2534,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Adding and removing reified`() {
         check(
             inputKotlinStyleNulls = true,
@@ -3673,6 +3686,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Remove fun modifier from interface`() {
         check(
             expectedIssues = """
@@ -3753,6 +3767,54 @@
         )
     }
 
+    @Test
+    @TestKotlinPsi
+    fun `adding methods to interfaces`() {
+        check(
+            expectedIssues = """
+                src/test/pkg/JavaInterface.java:5: error: Added method test.pkg.JavaInterface.hasDefault() [AddedMethod]
+                src/test/pkg/JavaInterface.java:8: error: Added method test.pkg.JavaInterface.newStatic() [AddedMethod]
+                src/test/pkg/JavaInterface.java:4: error: Added method test.pkg.JavaInterface.noDefault() [AddedAbstractMethod]
+                src/test/pkg/KotlinInterface.kt:5: error: Added method test.pkg.KotlinInterface.hasDefault() [AddedAbstractMethod]
+                src/test/pkg/KotlinInterface.kt:4: error: Added method test.pkg.KotlinInterface.noDefault() [AddedAbstractMethod]
+            """,
+            checkCompatibilityApi = """
+                // Signature format: 3.0
+                package test.pkg {
+                  public interface JavaInterface {
+                  }
+                  public interface KotlinInterface {
+                  }
+                }
+            """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                        package test.pkg;
+
+                        public interface JavaInterface {
+                            void noDefault();
+                            default boolean hasDefault() {
+                                return true;
+                            }
+                            static void newStatic();
+                        }
+                    """
+                ),
+                kotlin(
+                    """
+                        package test.pkg
+
+                        interface KotlinInterface {
+                            fun noDefault()
+                            fun hasDefault(): Boolean = true
+                        }
+                    """
+                )
+            )
+        )
+    }
+
     // TODO: Check method signatures changing incompatibly (look especially out for adding new overloaded
     // methods and comparator getting confused!)
     //   ..equals on the method items should actually be very useful!
diff --git a/src/test/java/com/android/tools/metalava/CoreApiTest.kt b/src/test/java/com/android/tools/metalava/CoreApiTest.kt
index 75c925f..b3429be 100644
--- a/src/test/java/com/android/tools/metalava/CoreApiTest.kt
+++ b/src/test/java/com/android/tools/metalava/CoreApiTest.kt
@@ -268,9 +268,9 @@
                 ARG_HIDE_ANNOTATION, "libcore.api.LibCoreHidden"
             ),
             expectedIssues = """
-            src/test/pkg/Exposed.java:11: error: Attempting to unhide method test.pkg.Exposed.exposed(), but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
-            src/test/pkg/Exposed.java:14: error: Attempting to unhide field test.pkg.Exposed.exposed, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
-            src/test/pkg/Exposed.java:17: error: Attempting to unhide class test.pkg.Exposed.StillHidden, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
+            src/test/pkg/Exposed.java:12: error: Attempting to unhide method test.pkg.Exposed.exposed(), but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
+            src/test/pkg/Exposed.java:15: error: Attempting to unhide field test.pkg.Exposed.exposed, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
+            src/test/pkg/Exposed.java:18: error: Attempting to unhide class test.pkg.Exposed.StillHidden, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
             """
         )
     }
diff --git a/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt b/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt
index aa328da..a28da1a 100644
--- a/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt
+++ b/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt
@@ -24,6 +24,10 @@
                         /** These are the docs for method2. It can sometimes return null. */
                         @Nullable public Double method2(@NonNull Double factor1, @NonNull Double factor2) { }
                         @Nullable public Double method3(@NonNull Double factor1, @NonNull Double factor2) { }
+                        /**
+                         * @param factor2 Don't pass null here please.
+                         */
+                        @Nullable public Double method4(@NonNull Double factor1, @NonNull Double factor2) { }
                     }
                     """
                 ),
@@ -62,6 +66,13 @@
                      */
                     @androidx.annotation.Nullable
                     public java.lang.Double method3(@androidx.annotation.NonNull java.lang.Double factor1, @androidx.annotation.NonNull java.lang.Double factor2) { throw new RuntimeException("Stub!"); }
+                    /**
+                     * @param factor2 Don't pass null here please.
+                     * @param factor1 This value must never be {@code null}.
+                     * @return This value may be {@code null}.
+                     */
+                    @androidx.annotation.Nullable
+                    public java.lang.Double method4(@androidx.annotation.NonNull java.lang.Double factor1, @androidx.annotation.NonNull java.lang.Double factor2) { throw new RuntimeException("Stub!"); }
                     }
                     """
                 )
@@ -118,6 +129,7 @@
 
     @Test
     fun `Fix typo replacement`() {
+        // common_typos_disable
         check(
             sourceFiles = arrayOf(
                 java(
@@ -134,7 +146,7 @@
             ),
             checkCompilation = true,
             docStubs = true,
-            expectedIssues = "src/test/pkg/Foo.java:2: warning: Replaced Andriod with Android in the documentation for class test.pkg.Foo [Typo]",
+            expectedIssues = "src/test/pkg/Foo.java:3: warning: Replaced Andriod with Android in the documentation for class test.pkg.Foo [Typo]",
             stubFiles = arrayOf(
                 java(
                     """
@@ -149,6 +161,7 @@
                 )
             )
         )
+        // common_typos_enable
     }
 
     @Test
@@ -189,7 +202,7 @@
                         }
 
                         // Typo in marker
-                        @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, "carier priviliges"})
+                        @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, "carier priviliges"}) // NOTYPO
                         public void test6() {
                         }
                     }
@@ -212,8 +225,9 @@
                 requiresPermissionSource
             ),
             checkCompilation = false, // needs androidx.annotations in classpath
-            expectedIssues = "src/test/pkg/PermissionTest.java:31: lint: Unrecognized permission `carier priviliges`; did you mean `carrier privileges`? [MissingPermission]",
+            expectedIssues = "src/test/pkg/PermissionTest.java:33: lint: Unrecognized permission `carier priviliges`; did you mean `carrier privileges`? [MissingPermission]", // NOTYPO
             stubFiles = arrayOf(
+                // common_typos_disable
                 java(
                     """
                     package test.pkg;
@@ -256,6 +270,7 @@
                     }
                     """
                 )
+                // common_typos_enable
             )
         )
     }
@@ -431,7 +446,7 @@
                 workerThreadSource
             ),
             checkCompilation = true,
-            expectedIssues = "src/test/pkg/RangeTest.java:5: lint: Found more than one threading annotation on method test.pkg.RangeTest.test1(); the auto-doc feature does not handle this correctly [MultipleThreadAnnotations]",
+            expectedIssues = "src/test/pkg/RangeTest.java:6: lint: Found more than one threading annotation on method test.pkg.RangeTest.test1(); the auto-doc feature does not handle this correctly [MultipleThreadAnnotations]",
             docStubs = true,
             stubFiles = arrayOf(
                 java(
@@ -460,7 +475,7 @@
     @Test
     fun `Merge Multiple sections`() {
         check(
-            expectedIssues = "src/android/widget/Toolbar2.java:14: error: Documentation should not specify @apiSince manually; it's computed and injected at build time by metalava [ForbiddenTag]",
+            expectedIssues = "src/android/widget/Toolbar2.java:18: error: Documentation should not specify @apiSince manually; it's computed and injected at build time by metalava [ForbiddenTag]",
             sourceFiles = arrayOf(
                 java(
                     """
@@ -726,7 +741,7 @@
             ),
             checkCompilation = true,
             docStubs = true,
-            expectedIssues = "src/test/pkg/RangeTest.java:4: lint: Cannot find permission field for \"MyPermission\" required by method test.pkg.RangeTest.test1() (may be hidden or removed) [MissingPermission]",
+            expectedIssues = "src/test/pkg/RangeTest.java:5: lint: Cannot find permission field for \"MyPermission\" required by method test.pkg.RangeTest.test1() (may be hidden or removed) [MissingPermission]",
             stubFiles = arrayOf(
                 java(
                     """
@@ -1703,6 +1718,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Include Kotlin deprecation text`() {
         check(
             sourceFiles = arrayOf(
@@ -2026,7 +2042,7 @@
             ),
             checkCompilation = false, // stubs contain Cursor.NONEXISTENT so it does not compile
             expectedIssues = """
-                src/test/pkg/ColumnTest.java:12: warning: Cannot find feature field for Cursor.NONEXISTENT required by field ColumnTest.BOGUS (may be hidden or removed) [MissingColumn]
+                src/test/pkg/ColumnTest.java:13: warning: Cannot find feature field for Cursor.NONEXISTENT required by field ColumnTest.BOGUS (may be hidden or removed) [MissingColumn]
                 """,
             docStubs = true,
             stubFiles = arrayOf(
diff --git a/src/test/java/com/android/tools/metalava/DriverTest.kt b/src/test/java/com/android/tools/metalava/DriverTest.kt
index 46e0d69..592b97d 100644
--- a/src/test/java/com/android/tools/metalava/DriverTest.kt
+++ b/src/test/java/com/android/tools/metalava/DriverTest.kt
@@ -18,6 +18,8 @@
 
 import com.android.SdkConstants
 import com.android.SdkConstants.DOT_KT
+import com.android.SdkConstants.DOT_TXT
+import com.android.SdkConstants.DOT_XML
 import com.android.ide.common.process.DefaultProcessExecutor
 import com.android.ide.common.process.LoggedProcessOutputHandler
 import com.android.ide.common.process.ProcessException
@@ -49,6 +51,7 @@
 import org.junit.Before
 import org.junit.Rule
 import org.junit.rules.ErrorCollector
+import org.junit.rules.RuleChain
 import org.junit.rules.TemporaryFolder
 import java.io.ByteArrayOutputStream
 import java.io.File
@@ -62,11 +65,15 @@
 const val CHECK_JDIFF = false
 
 abstract class DriverTest {
-    @get:Rule
-    var temporaryFolder = TemporaryFolder()
+    val kotlinPsi = KotlinPsiRule()
+    val temporaryFolder = TemporaryFolder()
+    val errorCollector = ErrorCollector()
 
     @get:Rule
-    val errorCollector = ErrorCollector()
+    val ruleChain: RuleChain = RuleChain
+        .outerRule(kotlinPsi)
+        .around(temporaryFolder)
+        .around(errorCollector)
 
     @Before
     fun setup() {
@@ -1076,6 +1083,8 @@
             emptyArray()
         }
 
+        val kotlinPsiArgs = if (kotlinPsi.enabled) arrayOf(ARG_ENABLE_KOTLIN_PSI) else emptyArray()
+
         // Run optional additional setup steps on the project directory
         projectSetup?.invoke(project)
 
@@ -1149,6 +1158,7 @@
             *errorMessageCheckCompatibilityReleasedArgs,
             *errorMessageCheckCompatibilityCurrentArgs,
             *repeatErrorsMaxArgs,
+            *kotlinPsiArgs,
             expectedFail = expectedFail
         )
 
@@ -1172,7 +1182,7 @@
         if (api != null && apiFile != null) {
             assertTrue("${apiFile.path} does not exist even though --api was used", apiFile.exists())
             val actualText = readFile(apiFile, stripBlankLines, trim)
-            assertEquals(stripComments(api, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(stripComments(api, DOT_TXT, stripLineComments = false).trimIndent(), actualText)
             // Make sure we can read back the files we write
             ApiFile.parseApi(apiFile, options.outputKotlinStyleNulls)
         }
@@ -1183,7 +1193,7 @@
                 apiXmlFile.exists()
             )
             val actualText = readFile(apiXmlFile, stripBlankLines, trim)
-            assertEquals(stripComments(apiXml, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(stripComments(apiXml, DOT_XML, stripLineComments = false).trimIndent(), actualText)
             // Make sure we can read back the files we write
             parseDocument(apiXmlFile.readText(UTF_8), false)
         }
@@ -1203,7 +1213,7 @@
             // If "update baseline" is set, use it.
             // Otherwise, the original baseline.
             val sourceFile = mergeBaselineContent ?: updateBaselineContent ?: baselineContent ?: ""
-            assertEquals(stripComments(sourceFile, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(stripComments(sourceFile, DOT_XML, stripLineComments = false).trimIndent(), actualText)
         }
         checkBaseline(ARG_BASELINE, baseline, updateBaseline, mergeBaseline, baselineFile)
         checkBaseline(ARG_BASELINE_API_LINT, baselineApiLint, updateBaselineApiLint, null, baselineApiLintFile)
@@ -1224,7 +1234,10 @@
                 if (actualText.contains("<api")) {
                     parseDocument(actualText, false)
                 }
-                assertEquals(stripComments(expected, stripLineComments = false).trimIndent(), actualText)
+                assertEquals(
+                    stripComments(expected, DOT_XML, stripLineComments = false).trimIndent(),
+                    actualText
+                )
                 // Make sure we can read back the files we write
             }
         }
@@ -1235,7 +1248,10 @@
                 dexApiFile.exists()
             )
             val actualText = readFile(dexApiFile, stripBlankLines, trim)
-            assertEquals(stripComments(dexApi, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(
+                stripComments(dexApi, DOT_TXT, stripLineComments = false).trimIndent(),
+                actualText
+            )
         }
 
         if (removedApi != null && removedApiFile != null) {
@@ -1244,7 +1260,10 @@
                 removedApiFile.exists()
             )
             val actualText = readFile(removedApiFile, stripBlankLines, trim)
-            assertEquals(stripComments(removedApi, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(
+                stripComments(removedApi, DOT_TXT, stripLineComments = false).trimIndent(),
+                actualText
+            )
             // Make sure we can read back the files we write
             ApiFile.parseApi(removedApiFile, options.outputKotlinStyleNulls)
         }
@@ -1255,7 +1274,10 @@
                 "${proguardFile.path} does not exist even though --proguard was used",
                 proguardFile.exists()
             )
-            assertEquals(stripComments(proguard, stripLineComments = false).trimIndent(), expectedProguard.trim())
+            assertEquals(
+                stripComments(proguard, DOT_TXT, stripLineComments = false).trimIndent(),
+                expectedProguard.trim()
+            )
         }
 
         if (sdk_broadcast_actions != null) {
@@ -1332,7 +1354,10 @@
                 // To make golden files look better put one entry per line instead of a single
                 // space separated line
                 .replace(' ', '\n')
-            assertEquals(stripComments(stubsSourceList, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(
+                stripComments(stubsSourceList, DOT_TXT, stripLineComments = false).trimIndent(),
+                actualText
+            )
         }
 
         if (docStubsSourceList != null && docStubsSourceListFile != null) {
@@ -1344,7 +1369,10 @@
                 // To make golden files look better put one entry per line instead of a single
                 // space separated line
                 .replace(' ', '\n')
-            assertEquals(stripComments(docStubsSourceList, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(
+                stripComments(docStubsSourceList, DOT_TXT, stripLineComments = false).trimIndent(),
+                actualText
+            )
         }
 
         if (checkCompilation && stubsDir != null) {
diff --git a/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt b/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt
index 4c7258d..022785e 100644
--- a/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt
+++ b/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt
@@ -77,7 +77,7 @@
             includeSourceRetentionAnnotations = false,
             format = FileFormat.V2,
             sourceFiles = sourceFiles1,
-            expectedIssues = "src/test/pkg/IntDefTest.java:11: error: This typedef annotation class should have @Retention(RetentionPolicy.SOURCE) [AnnotationExtraction]",
+            expectedIssues = "src/test/pkg/IntDefTest.java:13: error: This typedef annotation class should have @Retention(RetentionPolicy.SOURCE) [AnnotationExtraction]",
             extractAnnotations = mapOf(
                 "test.pkg" to """
                 <?xml version="1.0" encoding="UTF-8"?>
@@ -106,6 +106,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Check Kotlin and referencing hidden constants from typedef`() {
         check(
             includeSourceRetentionAnnotations = false,
@@ -184,6 +185,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Check including only class retention annotations other than typedefs`() {
         check(
             includeSourceRetentionAnnotations = true,
diff --git a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
index fe44926..47d04d9 100644
--- a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
@@ -21,10 +21,11 @@
 class HideAnnotationTest : DriverTest() {
     // Regression test for b/133364476 crash
     @Test
+    @TestKotlinPsi
     fun `Using hide annotation with Kotlin source`() {
         check(
             expectedIssues = """
-                src/test/pkg/).kt:2: warning: Public class test.pkg.ExtendingMyHiddenClass stripped of unavailable superclass test.pkg.MyHiddenClass [HiddenSuperclass]
+                src/test/pkg/ExtendingMyHiddenClass.kt:3: warning: Public class test.pkg.ExtendingMyHiddenClass stripped of unavailable superclass test.pkg.MyHiddenClass [HiddenSuperclass]
             """,
             sourceFiles = arrayOf(
                 kotlin(
@@ -72,7 +73,7 @@
                   public class ExtendingMyHiddenClass<Float> {
                     ctor public ExtendingMyHiddenClass();
                   }
-                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface MetaHide {
+                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface MetaHide {
                   }
                 }
                 """
diff --git a/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt b/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt
index 4d10642..e064e34 100644
--- a/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt
+++ b/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt
@@ -53,6 +53,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Kotlin language level`() {
         // See https://kotlinlang.org/docs/reference/whatsnew13.html
         check(
diff --git a/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt b/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt
index bdd97c1..c7d9398 100644
--- a/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt
+++ b/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt
@@ -26,7 +26,7 @@
             expectedIssues = """
                 src/test/pkg/Test.java:7: error: Avoid method names that are Kotlin hard keywords ("fun"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
                 src/test/pkg/Test.java:8: error: Avoid parameter names that are Kotlin hard keywords ("typealias"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
-                src/test/pkg/Test.java:9: error: Avoid field names that are Kotlin hard keywords ("object"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
+                src/test/pkg/Test.java:10: error: Avoid field names that are Kotlin hard keywords ("object"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -52,12 +52,13 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Sam-compatible parameters should be last`() {
         check(
             apiLint = "",
             expectedIssues = """
                 src/test/pkg/Test.java:20: warning: SAM-compatible parameters (such as parameter 1, "run", in test.pkg.Test.error1) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
-                src/test/pkg/Test.java:21: warning: SAM-compatible parameters (such as parameter 2, "callback", in test.pkg.Test.error2) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
+                src/test/pkg/Test.java:23: warning: SAM-compatible parameters (such as parameter 2, "callback", in test.pkg.Test.error2) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
                 src/test/pkg/test.kt:7: warning: lambda parameters (such as parameter 1, "bar", in test.pkg.TestKt.error) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
                 """,
             sourceFiles = arrayOf(
@@ -111,6 +112,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Companion object methods should be marked with JvmStatic`() {
         check(
             apiLint = "",
@@ -155,6 +157,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Methods with default parameters should specify JvmOverloads`() {
         check(
             apiLint = "",
@@ -186,15 +189,18 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Methods which throw exceptions should document them`() {
         check(
             apiLint = "",
             extraArguments = arrayOf(ARG_HIDE, "BannedThrow", ARG_HIDE, "GenericException"),
             expectedIssues = """
                 src/test/pkg/Foo.kt:6: error: Method Foo.error_throws_multiple_times appears to be throwing java.io.FileNotFoundException; this should be recorded with a @Throws annotation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
-                src/test/pkg/Foo.kt:16: error: Method Foo.error_throwsCheckedExceptionWithWrongExceptionClassInThrows appears to be throwing java.io.FileNotFoundException; this should be recorded with a @Throws annotation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
+                src/test/pkg/Foo.kt:17: error: Method Foo.error_throwsCheckedExceptionWithWrongExceptionClassInThrows appears to be throwing java.io.FileNotFoundException; this should be recorded with a @Throws annotation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
                 src/test/pkg/Foo.kt:37: error: Method Foo.error_throwsRuntimeExceptionDocsMissing appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
-                src/test/pkg/Foo.kt:43: error: Method Foo.error_missingSpecificAnnotation appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
+                src/test/pkg/Foo.kt:44: error: Method Foo.error_missingSpecificAnnotation appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
+                src/test/pkg/Foo.kt:76: error: Method Foo.getErrorVar appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
+                src/test/pkg/Foo.kt:77: error: Method Foo.setErrorVar appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -274,6 +280,22 @@
                             } catch (e: Exception) {}
                         }
 
+                        var errorVar: Int
+                            get() { throw UnsupportedOperationException() }
+                            set(value) { throw UnsupportedOperationException() }
+
+                        @get:Throws(FileNotFoundException::class)
+                        var okValAnnotation: Int
+                            get() { throw FileNotFoundException("Something") }
+
+                        /** Throws [UnsupportedOperationException] */
+                        val okValDocumented: Int
+                            get() { throw UnsupportedOperationException() }
+
+                        /** Throws [UnsupportedOperationException] */
+                        var okVarDocumented: Int = 0
+                            set(value) { throw UnsupportedOperationException() }
+
                         // TODO: What about something where you call in Java a method
                         // known to throw something (e.g. Integer.parseInt) and you don't catch it; should you
                         // pass it on? Hard to say; if the logic is complicated it may
diff --git a/src/test/java/com/android/tools/metalava/OptionsTest.kt b/src/test/java/com/android/tools/metalava/OptionsTest.kt
index fdf48b0..a782f66 100644
--- a/src/test/java/com/android/tools/metalava/OptionsTest.kt
+++ b/src/test/java/com/android/tools/metalava/OptionsTest.kt
@@ -198,8 +198,8 @@
                                              Write a ProGuard keep file for the API
 --sdk-values <dir>
                                              Write SDK values files to the given directory
---kotlin-model
-                                             [CURRENTLY EXPERIMENTAL] If set, use Kotlin PSI for Kotlin instead of UAST
+--enable-kotlin-psi
+                                             [EXPERIMENTAL] If set, use Kotlin PSI for Kotlin instead of UAST
 
 
 Generating Stubs:
@@ -226,6 +226,10 @@
 --exclude-annotation <annotation classes>
                                              A comma separated list of fully qualified names of annotation classes that
                                              must be stripped from metalava's outputs.
+--enhance-documentation
+                                             Enhance documentation in various ways, for example auto-generating
+                                             documentation based on source annotations present in the code. This is
+                                             implied by --doc-stubs.
 --exclude-documentation-from-stubs
                                              Exclude element documentation (javadoc and kdoc) from the generated stubs.
                                              (Copyright notices are not affected by this, they are always included.
diff --git a/src/test/java/com/android/tools/metalava/ReporterTest.kt b/src/test/java/com/android/tools/metalava/ReporterTest.kt
index 9c2d111..2cbe79f 100644
--- a/src/test/java/com/android/tools/metalava/ReporterTest.kt
+++ b/src/test/java/com/android/tools/metalava/ReporterTest.kt
@@ -46,6 +46,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Test suppression annotations`() {
         check(
             apiLint = "",
diff --git a/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt b/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt
index 3e7ee00..2af497d 100644
--- a/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt
+++ b/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt
@@ -25,7 +25,7 @@
     fun `Test generating broadcast actions`() {
         check(
             expectedIssues = """
-                src/android/telephony/SubscriptionManager.java:7: lint: Field 'ACTION_DEFAULT_SUBSCRIPTION_CHANGED' is missing @BroadcastBehavior [BroadcastBehavior]
+                src/android/telephony/SubscriptionManager.java:11: lint: Field 'ACTION_DEFAULT_SUBSCRIPTION_CHANGED' is missing @BroadcastBehavior [BroadcastBehavior]
                 """,
             sourceFiles = arrayOf(
                 java(
diff --git a/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt b/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt
index 72fd268..ea8da53 100644
--- a/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt
@@ -10,7 +10,7 @@
     fun `Basic showAnnotation test`() {
         check(
             includeSystemApiAnnotations = true,
-            expectedIssues = "src/test/pkg/Foo.java:17: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
+            expectedIssues = "src/test/pkg/Foo.java:18: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
             sourceFiles = arrayOf(
                 java(
                     """
@@ -67,7 +67,7 @@
         check(
             includeSystemApiAnnotations = true,
             showUnannotated = true,
-            expectedIssues = "src/test/pkg/Foo.java:17: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
+            expectedIssues = "src/test/pkg/Foo.java:18: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
             sourceFiles = arrayOf(
                 java(
                     """
@@ -354,9 +354,9 @@
             ),
             showAnnotations = arrayOf("android.annotation.SystemApi"),
             expectedIssues = """
-                src/test/pkg/Class1.java:6: error: Attempting to unhide method test.pkg.Class1.method1(), but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
-                src/test/pkg/Class1.java:10: error: Attempting to unhide class test.pkg.Class1.InnerClass1, but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
-                src/test/pkg/Class2.java:9: error: Attempting to unhide method test.pkg.Class2.InnerClass2.method2(), but surrounding class test.pkg.Class2.InnerClass2 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
+                src/test/pkg/Class1.java:8: error: Attempting to unhide method test.pkg.Class1.method1(), but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
+                src/test/pkg/Class1.java:12: error: Attempting to unhide class test.pkg.Class1.InnerClass1, but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
+                src/test/pkg/Class2.java:11: error: Attempting to unhide method test.pkg.Class2.InnerClass2.method2(), but surrounding class test.pkg.Class2.InnerClass2 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
                 """
         )
     }
@@ -653,6 +653,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Check @PublishedApi handling`() {
         check(
             format = FileFormat.V3,
diff --git a/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt b/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt
index 8bd41e4..246d80f 100644
--- a/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt
@@ -690,7 +690,7 @@
             apiLint = "",
             expectedFail = DefaultLintErrorMessage,
             expectedIssues = """
-                src/test/pkg/ModuleClassExtendingPublic.java:9: error: Missing nullability on method `method2` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
+                src/test/pkg/ModuleClassExtendingPublic.java:11: error: Missing nullability on method `method2` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
                 """
         )
     }
diff --git a/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt b/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt
index e00450a..16f70a9 100644
--- a/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt
+++ b/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt
@@ -152,8 +152,8 @@
     fun `Check SystemService such that at least one permission must be defined with anyOf`() {
         check(
             expectedIssues = """
-                src/test/pkg/MyTest2.java:5: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:5: lint: Method 'myMethod1' must be protected with a system permission. [RequiresPermission]
+                src/test/pkg/MyTest2.java:6: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:6: lint: Method 'myMethod1' must be protected with a system permission. [RequiresPermission]
                 """,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
@@ -181,7 +181,7 @@
     @Test
     fun `Check SystemService -- missing one permission with allOf`() {
         check(
-            expectedIssues = "src/test/pkg/MyTest2.java:5: lint: Permission 'foo.bar.PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]",
+            expectedIssues = "src/test/pkg/MyTest2.java:6: lint: Permission 'foo.bar.PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]",
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -214,7 +214,7 @@
     @Test
     fun `Check SystemService -- must be system permission, not normal`() {
         check(
-            expectedIssues = "src/test/pkg/MyTest2.java:6: lint: Method 'test' must be protected with a system " +
+            expectedIssues = "src/test/pkg/MyTest2.java:7: lint: Method 'test' must be protected with a system " +
                 "permission; it currently allows non-system callers holding [foo.bar.PERMISSION1, " +
                 "foo.bar.PERMISSION2] [RequiresPermission]",
             includeSystemApiAnnotations = true,
@@ -255,9 +255,9 @@
     fun `Check SystemService -- missing manifest permissions`() {
         check(
             expectedIssues = """
-                src/test/pkg/MyTest2.java:5: lint: Permission 'Manifest.permission.MY_PERMISSION' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:5: lint: Permission 'Manifest.permission.MY_PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:5: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
+                src/test/pkg/MyTest2.java:6: lint: Permission 'Manifest.permission.MY_PERMISSION' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:6: lint: Permission 'Manifest.permission.MY_PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:6: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
                 """,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
@@ -286,8 +286,8 @@
         check(
             expectedIssues = """
                 TESTROOT/manifest.xml: error: Failed to parse TESTROOT/manifest.xml: The markup in the document preceding the root element must be well-formed. [ParseError]
-                src/test/pkg/MyTest2.java:6: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:6: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
+                src/test/pkg/MyTest2.java:7: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:7: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
                 """,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
diff --git a/src/test/java/com/android/tools/metalava/TestUtils.kt b/src/test/java/com/android/tools/metalava/TestUtils.kt
index b971040..5de97ea 100644
--- a/src/test/java/com/android/tools/metalava/TestUtils.kt
+++ b/src/test/java/com/android/tools/metalava/TestUtils.kt
@@ -18,11 +18,11 @@
 
 import com.android.tools.lint.checks.infrastructure.TestFile
 import com.android.tools.lint.checks.infrastructure.TestFiles
-import com.android.tools.metalava.model.ClassItem
-import com.android.tools.metalava.model.Codebase
-import com.android.tools.metalava.model.visitors.ItemVisitor
 import org.intellij.lang.annotations.Language
-import org.junit.Assume.assumeTrue
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+import java.io.File
 import kotlin.io.path.createTempDirectory
 
 fun java(to: String, @Language("JAVA") source: String): TestFile {
@@ -41,55 +41,47 @@
     return TestFiles.kotlin(to, source.trimIndent())
 }
 
-internal inline fun withCodebase(
-    vararg sources: TestFile,
-    useKtModel: Boolean = true,
-    action: (Codebase) -> Unit
-) {
-    // This is thread-safe as it adds a random suffix to the directory prefix
-    val tempDirectory = createTempDirectory("codebase").toFile()
-    try {
-        val codebase = parseSources(
-            sources = sources.map { it.createFile(tempDirectory) },
-            description = "Test Codebase",
-            useKtModel = useKtModel
-        )
-        try {
-            action(codebase)
-        } finally {
-            // This cleans up underlying services in a PSI codebase
-            codebase.dispose()
-        }
-    } finally {
-        // Have to assert here, since [deleteRecursively] returns a success/failure as a boolean
-        assert(tempDirectory.deleteRecursively()) { "Temporary directory not cleaned up" }
-    }
-}
+/** Marks tests to run against both Kotlin PSI and UAST based models */
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FUNCTION)
+annotation class TestKotlinPsi(
+    /** Set this to a bug ID to skip the Kotlin PSI run for temporarily broken tests */
+    val skipDueToBugId: Long = 0L
+)
 
-internal inline fun withClass(
-    @Language("kotlin") source: String,
-    useKtModel: Boolean = true,
-    action: (ClassItem) -> Unit
-) {
-    withCodebase(kotlin(source), useKtModel = useKtModel) { codebase ->
-        action(codebase.assumeSingleTopLevelClass())
-    }
-}
+/**
+ * Rule that runs tests annotated with [TestKotlinPsi] twice: first with the Kotlin PSI model
+ * [enabled] and then without to ensure consistent behavior between UAST and Kotlin PSI models.
+ */
+class KotlinPsiRule : TestRule {
+    var enabled: Boolean = false
+        private set
 
-fun Codebase.assumeSingleTopLevelClass(): ClassItem {
-    var count = 0
-    var result: ClassItem? = null
+    override fun apply(base: Statement, description: Description): Statement {
+        enabled = false
+        val annotation = description.getAnnotation(TestKotlinPsi::class.java)
 
-    this.accept(object : ItemVisitor() {
-        override fun visitClass(cls: ClassItem) {
-            if (cls.isTopLevelClass()) {
-                count++
-                result = cls
+        return if (annotation != null && annotation.skipDueToBugId == 0L) {
+            object : Statement() {
+                override fun evaluate() {
+                    enabled = true
+                    base.evaluate()
+                    enabled = false
+                    base.evaluate()
+                }
             }
+        } else {
+            base
         }
-    })
+    }
+}
 
-    assumeTrue("Expected one top level class, got $count", count == 1)
-
-    return result!!
+/** Creates a temporary directory and cleans up afterwards */
+inline fun tempDirectory(action: (File) -> Unit) {
+    val tempDirectory = createTempDirectory().toFile()
+    try {
+        action(tempDirectory)
+    } finally {
+        tempDirectory.deleteRecursively()
+    }
 }
diff --git a/src/test/java/com/android/tools/metalava/WithCodebaseTest.kt b/src/test/java/com/android/tools/metalava/WithCodebaseTest.kt
deleted file mode 100644
index d1617fa..0000000
--- a/src/test/java/com/android/tools/metalava/WithCodebaseTest.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava
-
-import com.android.tools.metalava.model.psi.PsiClassItem
-import kotlin.test.Test
-import kotlin.test.assertIs
-
-class WithCodebaseTest {
-    @Test
-    fun `UAST model works`() {
-        withCodebase(kotlin("data class Foo(val bar: Int)"), useKtModel = false) { codebase ->
-            assertIs<PsiClassItem>(codebase.findClass("Foo"))
-        }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt b/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt
index c466ebb..c9b3bff 100644
--- a/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt
@@ -42,8 +42,8 @@
             "@androidx.annotation.Nullable"
         )
         assertEquals("@androidx.annotation.Nullable", annotation.toSource())
-        assertEquals("androidx.annotation.Nullable", annotation.qualifiedName())
-        assertTrue(annotation.attributes().isEmpty())
+        assertEquals("androidx.annotation.Nullable", annotation.qualifiedName)
+        assertTrue(annotation.attributes.isEmpty())
     }
 
     @Test
@@ -53,8 +53,8 @@
             "@androidx.annotation.IntRange(from = 20, to = 40)"
         )
         assertEquals("@androidx.annotation.IntRange(from = 20, to = 40)", annotation.toSource())
-        assertEquals("androidx.annotation.IntRange", annotation.qualifiedName())
-        assertEquals(2, annotation.attributes().size)
+        assertEquals("androidx.annotation.IntRange", annotation.qualifiedName)
+        assertEquals(2, annotation.attributes.size)
         assertEquals("from", annotation.findAttribute("from")?.name)
         assertEquals("20", annotation.findAttribute("from")?.value.toString())
         assertEquals("to", annotation.findAttribute("to")?.name)
@@ -71,8 +71,8 @@
             "@androidx.annotation.IntDef({STYLE_NORMAL, STYLE_NO_TITLE, STYLE_NO_FRAME, STYLE_NO_INPUT})",
             annotation.toSource()
         )
-        assertEquals("androidx.annotation.IntDef", annotation.qualifiedName())
-        assertEquals(1, annotation.attributes().size)
+        assertEquals("androidx.annotation.IntDef", annotation.qualifiedName)
+        assertEquals(1, annotation.attributes.size)
         val attribute = annotation.findAttribute("value")
         assertNotNull(attribute)
         assertEquals("value", attribute?.name)
diff --git a/src/test/java/com/android/tools/metalava/model/kotlin/KotlinClassItemTest.kt b/src/test/java/com/android/tools/metalava/model/kotlin/KotlinClassItemTest.kt
deleted file mode 100644
index 0140894..0000000
--- a/src/test/java/com/android/tools/metalava/model/kotlin/KotlinClassItemTest.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 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 com.android.tools.metalava.model.kotlin
-
-import com.android.tools.metalava.kotlin
-import com.android.tools.metalava.withClass
-import com.android.tools.metalava.withCodebase
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-
-class KotlinClassItemTest {
-    @Test
-    fun simpleName() {
-        withClass("class Foo") { assertEquals("Foo", it.simpleName()) }
-    }
-
-    @Test
-    fun qualifiedName() {
-        withClass(
-            """
-                package androidx.pkg
-
-                class Foo
-            """
-        ) { assertEquals("androidx.pkg.Foo", it.qualifiedName()) }
-    }
-
-    @Test
-    fun isEnum() {
-        withCodebase(
-            kotlin("enum class MyEnum { VALUE }"),
-            kotlin("class NonEnum")
-        ) { codebase ->
-            assertTrue(codebase.findClass("MyEnum")!!.isEnum())
-            assertFalse(codebase.findClass("NonEnum")!!.isEnum())
-        }
-    }
-
-    @Test
-    fun containingPackage() {
-        withClass(
-            """
-                package androidx.pkg
-
-                class Foo
-            """
-        ) { assertEquals("androidx.pkg", it.containingPackage().qualifiedName()) }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiFieldItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiFieldItemTest.kt
new file mode 100644
index 0000000..caa83ee
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiFieldItemTest.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 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 com.android.tools.metalava.model.psi
+
+import com.android.tools.metalava.kotlin
+import kotlin.test.Test
+import kotlin.test.assertNotNull
+import kotlin.test.assertSame
+
+class PsiFieldItemTest {
+    @Test
+    fun `backing fields have properties`() {
+        testCodebase(kotlin("class Foo(val bar: Int)")) { codebase ->
+            val field = codebase.assertClass("Foo").fields().single()
+
+            assertNotNull(field.property)
+            assertSame(field, field.property?.backingField)
+        }
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiItemTest.kt
new file mode 100644
index 0000000..01521a7
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiItemTest.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 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 com.android.tools.metalava.model.psi
+
+import com.android.tools.metalava.java
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertNotNull
+
+class PsiItemTest {
+    @Test
+    fun `Documentation tags extraction`() {
+        testCodebase(
+            java(
+                """
+                    package test.pkg;
+
+                    /** Some javadoc */
+                    public class Test {
+                        public Test() {}
+
+                        /**
+                         * This method does foo.
+                         *
+                         * @param bar The bar to foo with
+                         *     the thing.
+                         * @param baz The baz to foo
+                         *     I think.
+                         * @return The result
+                         */
+                        public boolean foo(int bar, String baz) {
+                            return bar == 0 || baz.equals("foo");
+                        }
+                    }
+                """,
+            )
+        ) { codebase ->
+            val testClass = codebase.findClass("test.pkg.Test")
+            assertNotNull(testClass)
+            val method = testClass.methods().first { it.name().equals("foo") }
+            val barJavadoc = "@param bar The bar to foo with\n     *     the thing."
+            val bazJavadoc = "@param baz The baz to foo\n     *     I think."
+
+            assertEquals(barJavadoc, method.findTagDocumentation("param"))
+            assertEquals("@return The result", method.findTagDocumentation("return"))
+
+            assertEquals(barJavadoc, method.findTagDocumentation("param", "bar"))
+            assertEquals(bazJavadoc, method.findTagDocumentation("param", "baz"))
+
+            assertEquals("/**\n     * This method does foo.\n     *\n     * ", method.findMainDocumentation())
+        }
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiMethodItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiMethodItemTest.kt
new file mode 100644
index 0000000..390643f
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiMethodItemTest.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 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 com.android.tools.metalava.model.psi
+
+import com.android.tools.metalava.kotlin
+import org.junit.Test
+import kotlin.test.assertNotNull
+import kotlin.test.assertNull
+import kotlin.test.assertSame
+
+class PsiMethodItemTest {
+    @Test
+    fun `property accessors have properties`() {
+        testCodebase(kotlin("class Foo { var bar: Int = 0 }")) { codebase ->
+            val classItem = codebase.assertClass("Foo")
+            val getter = classItem.methods().single { it.name() == "getBar" }
+            val setter = classItem.methods().single { it.name() == "setBar" }
+
+            assertNotNull(getter.property)
+            assertNotNull(setter.property)
+
+            assertSame(getter.property, setter.property)
+            assertSame(getter, getter.property?.getter)
+            assertSame(setter, setter.property?.setter)
+        }
+    }
+
+    @Test
+    fun `destructuring functions do not have a property relationship`() {
+        testCodebase(kotlin("data class Foo(val bar: Int)")) { codebase ->
+            val classItem = codebase.assertClass("Foo")
+            val component1 = classItem.methods().single { it.name() == "component1" }
+
+            assertNull(component1.property)
+        }
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiModifierItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiModifierItemTest.kt
new file mode 100644
index 0000000..b5a9e8e
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiModifierItemTest.kt
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 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 com.android.tools.metalava.model.psi
+
+import com.android.tools.metalava.kotlin
+import com.android.tools.metalava.model.VisibilityLevel
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class PsiModifierItemTest {
+    @Test
+    fun `Kotlin implicit internal visibility inheritance`() {
+        testCodebase(
+            kotlin(
+                """
+                    open class Base {
+                        internal open fun method(): Int = 1
+                        internal open val property: Int = 2
+                    }
+
+                    class Inherited : Base() {
+                        override fun method(): Int = 3
+                        override val property = 4
+                    }
+                """
+            )
+        ) { codebase ->
+            val inherited = codebase.assertClass("Inherited")
+            val method = inherited.methods().first { it.name().startsWith("method") }
+            val property = inherited.properties().single()
+
+            assertEquals(VisibilityLevel.INTERNAL, method.modifiers.getVisibilityLevel())
+            assertEquals(VisibilityLevel.INTERNAL, property.modifiers.getVisibilityLevel())
+        }
+    }
+
+    @Test
+    fun `Kotlin class visibility modifiers`() {
+        testCodebase(
+            kotlin(
+                """
+                    internal class Internal
+                    public class Public
+                    class DefaultPublic
+                    abstract class Outer {
+                        private class Private
+                        protected class Protected
+                    }
+                """
+            )
+        ) { codebase ->
+            assertTrue(codebase.assertClass("Internal").isInternal)
+            assertTrue(codebase.assertClass("Public").isPublic)
+            assertTrue(codebase.assertClass("DefaultPublic").isPublic)
+            assertTrue(codebase.assertClass("Outer.Private").isPrivate)
+            assertTrue(codebase.assertClass("Outer.Protected").isProtected)
+        }
+    }
+
+    @Test
+    fun `Kotlin class abstract and final modifiers`() {
+        testCodebase(
+            kotlin(
+                """
+                    abstract class Abstract
+                    sealed class Sealed
+                    open class Open
+                    final class Final
+                    class FinalDefault
+                    interface Interface
+                    annotation class Annotation
+                """
+            )
+        ) { codebase ->
+            codebase.assertClass("Abstract").modifiers.let {
+                assertTrue(it.isAbstract())
+                assertFalse(it.isSealed())
+                assertFalse(it.isFinal())
+            }
+
+            codebase.assertClass("Sealed").modifiers.let {
+                assertTrue(it.isAbstract())
+                assertTrue(it.isSealed())
+                assertFalse(it.isFinal())
+            }
+
+            codebase.assertClass("Open").modifiers.let {
+                assertFalse(it.isAbstract())
+                assertFalse(it.isFinal())
+            }
+
+            codebase.assertClass("Final").modifiers.let {
+                assertFalse(it.isAbstract())
+                assertTrue(it.isFinal())
+            }
+
+            codebase.assertClass("FinalDefault").modifiers.let {
+                assertFalse(it.isAbstract())
+                assertTrue(it.isFinal())
+            }
+
+            codebase.assertClass("Interface").modifiers.let {
+                assertTrue(it.isAbstract())
+                assertFalse(it.isFinal())
+            }
+
+            codebase.assertClass("Annotation").modifiers.let {
+                assertTrue(it.isAbstract())
+                assertFalse(it.isFinal())
+            }
+        }
+    }
+
+    @Test
+    fun `Kotlin class type modifiers`() {
+        testCodebase(
+            kotlin(
+                """
+                    inline class Inline(val value: Int)
+                    value class Value(val value: Int)
+                    data class Data(val data: Int) {
+                        companion object {
+                            const val DATA = 0
+                        }
+                    }
+                    fun interface FunInterface {
+                        fun foo()
+                    }
+                """
+            )
+        ) { codebase ->
+            assertTrue(codebase.assertClass("Inline").modifiers.isInline())
+            assertTrue(codebase.assertClass("Value").modifiers.isValue())
+            assertTrue(codebase.assertClass("Data").modifiers.isData())
+            assertTrue(codebase.assertClass("Data.Companion").modifiers.isCompanion())
+            assertTrue(codebase.assertClass("FunInterface").modifiers.isFunctional())
+        }
+    }
+
+    @Test
+    fun `Kotlin class static modifiers`() {
+        testCodebase(
+            kotlin(
+                """
+                    class TopLevel {
+                        inner class Inner
+                        class Nested
+                        interface Interface
+                        annotation class Annotation
+                        object Object
+                    }
+                    object Object
+                """
+            )
+        ) { codebase ->
+
+            assertFalse(codebase.assertClass("TopLevel").modifiers.isStatic())
+            assertFalse(codebase.assertClass("TopLevel.Inner").modifiers.isStatic())
+            assertFalse(codebase.assertClass("Object").modifiers.isStatic())
+
+            assertTrue(codebase.assertClass("TopLevel.Nested").modifiers.isStatic())
+            assertTrue(codebase.assertClass("TopLevel.Interface").modifiers.isStatic())
+            assertTrue(codebase.assertClass("TopLevel.Annotation").modifiers.isStatic())
+            assertTrue(codebase.assertClass("TopLevel.Object").modifiers.isStatic())
+        }
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiParameterItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiParameterItemTest.kt
new file mode 100644
index 0000000..91faefb
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiParameterItemTest.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 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 com.android.tools.metalava.model.psi
+
+import com.android.tools.metalava.kotlin
+import kotlin.test.Test
+import kotlin.test.assertNotNull
+import kotlin.test.assertNull
+import kotlin.test.assertSame
+
+class PsiParameterItemTest {
+    @Test
+    fun `primary constructor parameters have properties`() {
+        testCodebase(kotlin("class Foo(val property: Int, parameter: Int)")) { codebase ->
+            val constructorItem = codebase.assertClass("Foo").constructors().single()
+            val propertyParameter = constructorItem.parameters().single { it.name() == "property" }
+            val regularParameter = constructorItem.parameters().single { it.name() == "parameter" }
+
+            assertNull(regularParameter.property)
+            assertNotNull(propertyParameter.property)
+            assertSame(propertyParameter, propertyParameter.property?.constructorParameter)
+        }
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiPropertyItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiPropertyItemTest.kt
new file mode 100644
index 0000000..9ac922a
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiPropertyItemTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 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 com.android.tools.metalava.model.psi
+
+import com.android.tools.metalava.kotlin
+import kotlin.test.Test
+import kotlin.test.assertContains
+import kotlin.test.assertEquals
+import kotlin.test.assertNotNull
+import kotlin.test.assertNull
+import kotlin.test.assertSame
+import kotlin.test.assertTrue
+
+class PsiPropertyItemTest {
+    @Test
+    fun `primary constructor properties have constructor parameters`() {
+        testCodebase(kotlin("class Foo(val myVal: Int)")) { codebase ->
+            val myVal = codebase.assertClass("Foo").properties().single()
+
+            assertNotNull(myVal.constructorParameter)
+            assertSame(myVal, myVal.constructorParameter?.property)
+        }
+    }
+
+    @Test
+    fun `properties have getters`() {
+        testCodebase(
+            kotlin(
+                """
+                    class Foo {
+                        val myVal: Int = 0
+                        var myVar: Int = 0
+                    }
+                """
+            )
+        ) { codebase ->
+            val properties = codebase.assertClass("Foo").properties()
+            val myVal = properties.single { it.name() == "myVal" }
+            val myVar = properties.single { it.name() == "myVar" }
+
+            assertNotNull(myVal.getter)
+            assertNotNull(myVar.getter)
+
+            assertEquals("getMyVal", myVal.getter?.name())
+            assertEquals("getMyVar", myVar.getter?.name())
+
+            assertSame(myVal, myVal.getter?.property)
+            assertSame(myVar, myVar.getter?.property)
+        }
+    }
+
+    @Test
+    fun `var properties have setters`() {
+        testCodebase(kotlin("class Foo { var myVar: Int = 0 }")) { codebase ->
+            val myVar = codebase.assertClass("Foo").properties().single()
+
+            assertNotNull(myVar.setter)
+            assertEquals("setMyVar", myVar.setter?.name())
+            assertSame(myVar, myVar.setter?.property)
+        }
+    }
+
+    @Test
+    fun `setter visibility`() {
+        testCodebase(
+            kotlin(
+                """
+                    class Foo {
+                        var internalSet: Int = 0
+                            internal set
+
+                        var privateSet: Int = 0
+                            private set
+
+                        var privateCustomSet: Int = 0
+                            private set(value) { field = value + 1 }
+                """
+            )
+        ) { codebase ->
+            val properties = codebase.assertClass("Foo").properties()
+            val internalSet = properties.single { it.name() == "internalSet" }
+            val privateSet = properties.single { it.name() == "privateSet" }
+            val privateCustomSet = properties.single { it.name() == "privateCustomSet" }
+
+            assertTrue(internalSet.isPublic)
+            assertTrue(internalSet.getter!!.isPublic)
+            assertTrue(internalSet.setter!!.isInternal)
+
+            assertTrue(privateSet.isPublic)
+            assertTrue(privateSet.getter!!.isPublic)
+            assertNull(privateSet.setter) // Private setter is replaced with direct field access
+
+            assertTrue(privateCustomSet.isPublic)
+            assertTrue(privateCustomSet.getter!!.isPublic)
+            assertTrue(privateCustomSet.setter!!.isPrivate)
+        }
+    }
+
+    @Test
+    fun `properties have backing fields`() {
+        testCodebase(
+            kotlin(
+                """
+                    class Foo(val withField: Int) {
+                        val withoutField: Int
+                            get() = 0
+                    }
+                """
+            )
+        ) { codebase ->
+            val properties = codebase.assertClass("Foo").properties()
+            val withField = properties.single { it.name() == "withField" }
+            val withoutField = properties.single { it.name() == "withoutField" }
+
+            assertNull(withoutField.backingField)
+
+            assertNotNull(withField.backingField)
+            assertEquals("withField", withField.backingField?.name())
+            assertSame(withField, withField.backingField?.property)
+        }
+    }
+
+    @Test
+    fun `properties have documentation`() {
+        testCodebase(
+            kotlin(
+                """
+                    class Foo(/** parameter doc */ val parameter: Int) {
+                        /** body doc */
+                        var body: Int = 0
+
+                        /** accessors property doc */
+                        var accessors: Int
+                            /** getter doc */
+                            get() = field + 1
+                            /** setter doc */
+                            set(value) = { field = value - 1 }
+                    }
+                """
+            )
+        ) { codebase ->
+            val properties = codebase.assertClass("Foo").properties()
+            val parameter = properties.single { it.name() == "parameter" }
+            val body = properties.single { it.name() == "body" }
+            val accessors = properties.single { it.name() == "accessors" }
+
+            assertContains(parameter.documentation, "parameter doc")
+            assertContains(body.documentation, "body doc")
+            assertContains(accessors.documentation, "accessors property doc")
+            assertContains(accessors.getter?.documentation.orEmpty(), "getter doc")
+            assertContains(accessors.setter?.documentation.orEmpty(), "setter doc")
+        }
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiTestUtils.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiTestUtils.kt
new file mode 100644
index 0000000..81058bf
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiTestUtils.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 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 com.android.tools.metalava.model.psi
+
+import com.android.SdkConstants
+import com.android.tools.lint.UastEnvironment
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.metalava.ENV_VAR_METALAVA_TESTS_RUNNING
+import com.android.tools.metalava.Options
+import com.android.tools.metalava.options
+import com.android.tools.metalava.parseSources
+import com.android.tools.metalava.tempDirectory
+import com.intellij.openapi.util.Disposer
+import java.io.File
+import kotlin.test.assertNotNull
+
+inline fun testCodebase(
+    vararg sources: TestFile,
+    action: (PsiBasedCodebase) -> Unit
+) {
+    // TODO(b/198440244): Remove parameterization
+    for (enableKotlinPsi in arrayOf(true, false)) {
+        tempDirectory { tempDirectory ->
+            val codebase = createTestCodebase(tempDirectory, enableKotlinPsi, *sources)
+            try {
+                action(codebase)
+            } finally {
+                destroyTestCodebase(codebase)
+            }
+        }
+    }
+}
+
+fun createTestCodebase(
+    directory: File,
+    enableKotlinPsi: Boolean,
+    vararg sources: TestFile
+): PsiBasedCodebase {
+    System.setProperty(ENV_VAR_METALAVA_TESTS_RUNNING, SdkConstants.VALUE_TRUE)
+    Disposer.setDebugMode(true)
+    options = Options(emptyArray())
+
+    return parseSources(
+        sources = sources.map { it.createFile(directory) },
+        description = "Test ${if (enableKotlinPsi) "Kotlin PSI" else "UAST"} Codebase",
+        enableKotlinPsi = enableKotlinPsi
+    )
+}
+
+fun destroyTestCodebase(codebase: PsiBasedCodebase) {
+    codebase.dispose()
+
+    UastEnvironment.disposeApplicationEnvironment()
+    Disposer.assertIsEmpty(true)
+}
+
+fun PsiBasedCodebase.assertClass(qualifiedName: String): PsiClassItem {
+    val classItem = this.findClass(qualifiedName)
+    assertNotNull(classItem) { "Expected $qualifiedName to be defined" }
+    return classItem
+}
diff --git a/src/test/java/com/android/tools/metalava/stub/StubsTest.kt b/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
index c19fb4f..819126d 100644
--- a/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
+++ b/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
@@ -30,6 +30,7 @@
 import com.android.tools.metalava.ARG_UPDATE_API
 import com.android.tools.metalava.DriverTest
 import com.android.tools.metalava.FileFormat
+import com.android.tools.metalava.TestKotlinPsi
 import com.android.tools.metalava.androidxNullableSource
 import com.android.tools.metalava.extractRoots
 import com.android.tools.metalava.gatherSources
@@ -1321,6 +1322,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Basic Kotlin class`() {
         checkStubs(
             sourceFiles = arrayOf(
@@ -4314,6 +4316,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Basic Kotlin stubs`() {
         check(
             extraArguments = arrayOf(
@@ -4392,6 +4395,7 @@
     }
 
     @Test
+    @TestKotlinPsi
     fun `Extends and implements multiple interfaces in Kotlin Stubs`() {
         check(
             extraArguments = arrayOf(
diff --git a/stub-annotations/src/main/java/android/annotation/SdkConstant.java b/stub-annotations/src/main/java/android/annotation/SdkConstant.java
new file mode 100644
index 0000000..0a53186
--- /dev/null
+++ b/stub-annotations/src/main/java/android/annotation/SdkConstant.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2008 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 android.annotation;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Indicates a constant field value should be exported to be used in the SDK tools.
+ * @hide
+ */
+@Target({ ElementType.FIELD })
+@Retention(RetentionPolicy.SOURCE)
+public @interface SdkConstant {
+    public static enum SdkConstantType {
+        ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE;
+    }
+
+    SdkConstantType value();
+}
diff --git a/stub-annotations/src/main/java/androidx/annotation/Discouraged.java b/stub-annotations/src/main/java/androidx/annotation/Discouraged.java
index 71dd4f0..dd5f190 100644
--- a/stub-annotations/src/main/java/androidx/annotation/Discouraged.java
+++ b/stub-annotations/src/main/java/androidx/annotation/Discouraged.java
@@ -34,5 +34,5 @@
      * Defines the message to display when an element marked with this annotation is used. An
      * alternative should be provided in the message.
      */
-    String message() default "";
+    String message();
 }