diff --git a/app_dart/bin/server.dart b/app_dart/bin/server.dart
index 0d10fec..aba7ac5 100644
--- a/app_dart/bin/server.dart
+++ b/app_dart/bin/server.dart
@@ -8,6 +8,7 @@
 import 'package:appengine/appengine.dart';
 import 'package:cocoon_service/cocoon_service.dart';
 import 'package:gcloud/db.dart';
+import 'package:mutex/mutex.dart';
 
 /// For local development, you might want to set this to true.
 const String _kCocoonUseInMemoryCache = 'COCOON_USE_IN_MEMORY_CACHE';
@@ -18,8 +19,9 @@
 
     final bool inMemoryCache = Platform.environment[_kCocoonUseInMemoryCache] == 'true';
     final CacheService cache = CacheService(inMemory: inMemoryCache);
+    final ReadWriteMutex readWriteMutex = ReadWriteMutex();
 
-    final Config config = Config(dbService, cache);
+    final Config config = Config(dbService, cache, readWriteMutex);
     final AuthenticationProvider authProvider = AuthenticationProvider(config: config);
     final AuthenticationProvider swarmingAuthProvider = SwarmingAuthenticationProvider(config: config);
     final BuildBucketClient buildBucketClient = BuildBucketClient(
diff --git a/app_dart/lib/src/service/config.dart b/app_dart/lib/src/service/config.dart
index 5b1a89f..2a77d09 100644
--- a/app_dart/lib/src/service/config.dart
+++ b/app_dart/lib/src/service/config.dart
@@ -15,6 +15,7 @@
 import 'package:graphql/client.dart';
 import 'package:http/http.dart' as http;
 import 'package:meta/meta.dart';
+import 'package:mutex/mutex.dart';
 import 'package:retry/retry.dart';
 
 import '../../cocoon_service.dart';
@@ -30,12 +31,14 @@
 const String kDefaultBranchName = 'master';
 
 class Config {
-  Config(this._db, this._cache);
+  Config(this._db, this._cache, this._mutex);
 
   final DatastoreDB _db;
 
   final CacheService _cache;
 
+  final ReadWriteMutex _mutex;
+
   /// List of Github presubmit supported repos.
   ///
   /// This adds support for the `waiting for tree to go green label` to the repo.
@@ -325,15 +328,23 @@
   }
 
   Future<String> generateGithubToken(gh.RepositorySlug slug) async {
-    // GitHub's secondary rate limits are run into very frequently when making auth tokens.
-    final Uint8List? cacheValue = await _cache.getOrCreate(
-      configCacheName,
-      'githubToken-${slug.fullName}',
-      createFn: () => _generateGithubToken(slug),
-      // Tokens are minted for 10 minutes
-      ttl: const Duration(minutes: 8),
-    );
-
+    Uint8List? cacheValue;
+    // This is a read-write lock that prevents multiple Github tokens from
+    // being generated simultaneously, which would cause a rate limit.
+    await _mutex.acquireWrite();
+    try {
+      // GitHub's secondary rate limits are run into very frequently when making auth tokens.
+      cacheValue = await _cache.getOrCreate(
+        configCacheName,
+        'githubToken-${slug.fullName}',
+        createFn: () => _generateGithubToken(slug),
+        // Tokens are minted for 10 minutes
+        ttl: const Duration(minutes: 8),
+      );
+    }
+    finally {
+      _mutex.release();
+    }
     return String.fromCharCodes(cacheValue!);
   }
 
diff --git a/app_dart/pubspec.lock b/app_dart/pubspec.lock
index 9de9a13..8e134f5 100644
--- a/app_dart/pubspec.lock
+++ b/app_dart/pubspec.lock
@@ -497,6 +497,14 @@
       url: "https://pub.dev"
     source: hosted
     version: "5.3.2"
+  mutex:
+    dependency: "direct main"
+    description:
+      name: mutex
+      sha256: "03116a4e46282a671b46c12de649d72c0ed18188ffe12a8d0fc63e83f4ad88f4"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.1"
   neat_cache:
     dependency: "direct main"
     description:
diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml
index dcd383e..a6eecbf 100644
--- a/app_dart/pubspec.yaml
+++ b/app_dart/pubspec.yaml
@@ -31,6 +31,7 @@
   logging: ^1.1.0
   meta: ^1.8.0
   mime: ^1.0.2
+  mutex: ^3.0.1
   neat_cache: ^2.0.2
   path: ^1.8.2
   process: ^4.2.4
diff --git a/app_dart/test/service/config_test.dart b/app_dart/test/service/config_test.dart
index c653139..0e0c425 100644
--- a/app_dart/test/service/config_test.dart
+++ b/app_dart/test/service/config_test.dart
@@ -6,19 +6,29 @@
 
 import 'package:cocoon_service/cocoon_service.dart';
 import 'package:github/github.dart';
+import 'package:mockito/mockito.dart';
+import 'package:mutex/mutex.dart';
 import 'package:test/test.dart';
 
 import '../src/datastore/fake_datastore.dart';
+import '../src/utilities/mocks.mocks.dart';
 
 void main() {
   group('Config', () {
     FakeDatastoreDB datastore;
     late CacheService cacheService;
     late Config config;
+    late ReadWriteMutex readWriteMutex;
+    late MockReadWriteMutex mockReadWriteMutex;
     setUp(() {
       datastore = FakeDatastoreDB();
       cacheService = CacheService(inMemory: true);
-      config = Config(datastore, cacheService);
+      readWriteMutex = ReadWriteMutex();
+      mockReadWriteMutex = MockReadWriteMutex();
+      config = Config(datastore, cacheService, mockReadWriteMutex);
+
+      when(mockReadWriteMutex.acquireWrite()).thenAnswer((realInvocation) => readWriteMutex.acquireWrite());
+      when(mockReadWriteMutex.release()).thenAnswer((realInvocation) => readWriteMutex.release());
     });
     test('githubAppInstallations when builder config does not exist', () async {
       const String configValue = '{"godofredoc/cocoon":{"installation_id":"123"}}';
@@ -46,6 +56,30 @@
       expect(githubToken, 'githubToken');
     });
 
+    test('generateGithubToken only tries to generate a github token one at a time', () async {
+      const String configValue = 'githubToken';
+      final Uint8List cachedValue = Uint8List.fromList(configValue.codeUnits);
+      await cacheService.set(
+        Config.configCacheName,
+        'githubToken-${Config.flutterSlug}',
+        cachedValue,
+      );
+
+      final futures = <Future<String>>[];
+      futures.add(config.generateGithubToken(Config.flutterSlug));
+      futures.add(config.generateGithubToken(Config.flutterSlug));
+
+      await Future.wait(futures);
+      verifyInOrder(
+        [
+          mockReadWriteMutex.acquireWrite(),
+          mockReadWriteMutex.release(),
+          mockReadWriteMutex.acquireWrite(),
+          mockReadWriteMutex.release()
+        ]
+      );
+    });
+
     test('Returns the right flutter gold alert', () {
       expect(
         config.flutterGoldAlertConstant(RepositorySlug.full('flutter/flutter')),
diff --git a/app_dart/test/src/utilities/mocks.dart b/app_dart/test/src/utilities/mocks.dart
index 87c0686..b1a6b8e 100644
--- a/app_dart/test/src/utilities/mocks.dart
+++ b/app_dart/test/src/utilities/mocks.dart
@@ -22,6 +22,7 @@
 import 'package:http/http.dart' as http;
 import 'package:http/testing.dart';
 import 'package:mockito/annotations.dart';
+import 'package:mutex/mutex.dart';
 import 'package:neat_cache/neat_cache.dart';
 import 'package:process/process.dart';
 
@@ -76,6 +77,7 @@
     LuciBuildService,
     ProcessManager,
     PullRequestsService,
+    ReadWriteMutex,
     RepositoriesService,
     TabledataResource,
     UsersService,
diff --git a/app_dart/test/src/utilities/mocks.mocks.dart b/app_dart/test/src/utilities/mocks.mocks.dart
index 0e33d34..d04c488 100644
--- a/app_dart/test/src/utilities/mocks.mocks.dart
+++ b/app_dart/test/src/utilities/mocks.mocks.dart
@@ -38,12 +38,13 @@
 import 'package:graphql/src/graphql_client.dart' as _i14;
 import 'package:http/http.dart' as _i2;
 import 'package:mockito/mockito.dart' as _i1;
+import 'package:mutex/mutex.dart' as _i39;
 import 'package:neat_cache/neat_cache.dart' as _i20;
 import 'package:process/src/interface/process_manager.dart' as _i38;
 import 'package:retry/retry.dart' as _i8;
 
 import '../../service/cache_service_test.dart' as _i26;
-import 'mocks.dart' as _i39;
+import 'mocks.dart' as _i40;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -86,7 +87,8 @@
         );
 }
 
-class _FakeAccessClientProvider_3 extends _i1.SmartFake implements _i5.AccessClientProvider {
+class _FakeAccessClientProvider_3 extends _i1.SmartFake
+    implements _i5.AccessClientProvider {
   _FakeAccessClientProvider_3(
     Object parent,
     Invocation parentInvocation,
@@ -96,7 +98,8 @@
         );
 }
 
-class _FakeTabledataResource_4 extends _i1.SmartFake implements _i6.TabledataResource {
+class _FakeTabledataResource_4 extends _i1.SmartFake
+    implements _i6.TabledataResource {
   _FakeTabledataResource_4(
     Object parent,
     Invocation parentInvocation,
@@ -146,7 +149,8 @@
         );
 }
 
-class _FakeSearchBuildsResponse_9 extends _i1.SmartFake implements _i9.SearchBuildsResponse {
+class _FakeSearchBuildsResponse_9 extends _i1.SmartFake
+    implements _i9.SearchBuildsResponse {
   _FakeSearchBuildsResponse_9(
     Object parent,
     Invocation parentInvocation,
@@ -166,7 +170,8 @@
         );
 }
 
-class _FakeListBuildersResponse_11 extends _i1.SmartFake implements _i9.ListBuildersResponse {
+class _FakeListBuildersResponse_11 extends _i1.SmartFake
+    implements _i9.ListBuildersResponse {
   _FakeListBuildersResponse_11(
     Object parent,
     Invocation parentInvocation,
@@ -226,7 +231,8 @@
         );
 }
 
-class _FakeGithubChecksUtil_17 extends _i1.SmartFake implements _i11.GithubChecksUtil {
+class _FakeGithubChecksUtil_17 extends _i1.SmartFake
+    implements _i11.GithubChecksUtil {
   _FakeGithubChecksUtil_17(
     Object parent,
     Invocation parentInvocation,
@@ -236,7 +242,8 @@
         );
 }
 
-class _FakeCheckRunConclusion_18 extends _i1.SmartFake implements _i10.CheckRunConclusion {
+class _FakeCheckRunConclusion_18 extends _i1.SmartFake
+    implements _i10.CheckRunConclusion {
   _FakeCheckRunConclusion_18(
     Object parent,
     Invocation parentInvocation,
@@ -246,7 +253,8 @@
         );
 }
 
-class _FakeCheckRunStatus_19 extends _i1.SmartFake implements _i10.CheckRunStatus {
+class _FakeCheckRunStatus_19 extends _i1.SmartFake
+    implements _i10.CheckRunStatus {
   _FakeCheckRunStatus_19(
     Object parent,
     Invocation parentInvocation,
@@ -346,7 +354,8 @@
         );
 }
 
-class _FakeDefaultPolicies_29 extends _i1.SmartFake implements _i12.DefaultPolicies {
+class _FakeDefaultPolicies_29 extends _i1.SmartFake
+    implements _i12.DefaultPolicies {
   _FakeDefaultPolicies_29(
     Object parent,
     Invocation parentInvocation,
@@ -386,7 +395,8 @@
         );
 }
 
-class _FakeGraphQLClient_33 extends _i1.SmartFake implements _i14.GraphQLClient {
+class _FakeGraphQLClient_33 extends _i1.SmartFake
+    implements _i14.GraphQLClient {
   _FakeGraphQLClient_33(
     Object parent,
     Invocation parentInvocation,
@@ -396,7 +406,8 @@
         );
 }
 
-class _FakeObservableQuery_34<TParsed> extends _i1.SmartFake implements _i12.ObservableQuery<TParsed> {
+class _FakeObservableQuery_34<TParsed> extends _i1.SmartFake
+    implements _i12.ObservableQuery<TParsed> {
   _FakeObservableQuery_34(
     Object parent,
     Invocation parentInvocation,
@@ -406,7 +417,8 @@
         );
 }
 
-class _FakeQueryResult_35<TParsed extends Object?> extends _i1.SmartFake implements _i12.QueryResult<TParsed> {
+class _FakeQueryResult_35<TParsed extends Object?> extends _i1.SmartFake
+    implements _i12.QueryResult<TParsed> {
   _FakeQueryResult_35(
     Object parent,
     Invocation parentInvocation,
@@ -426,7 +438,8 @@
         );
 }
 
-class _FakeHttpClientRequest_37 extends _i1.SmartFake implements _i15.HttpClientRequest {
+class _FakeHttpClientRequest_37 extends _i1.SmartFake
+    implements _i15.HttpClientRequest {
   _FakeHttpClientRequest_37(
     Object parent,
     Invocation parentInvocation,
@@ -456,7 +469,8 @@
         );
 }
 
-class _FakeHttpClientResponse_40 extends _i1.SmartFake implements _i15.HttpClientResponse {
+class _FakeHttpClientResponse_40 extends _i1.SmartFake
+    implements _i15.HttpClientResponse {
   _FakeHttpClientResponse_40(
     Object parent,
     Invocation parentInvocation,
@@ -486,7 +500,8 @@
         );
 }
 
-class _FakeStreamSubscription_43<T> extends _i1.SmartFake implements _i17.StreamSubscription<T> {
+class _FakeStreamSubscription_43<T> extends _i1.SmartFake
+    implements _i17.StreamSubscription<T> {
   _FakeStreamSubscription_43(
     Object parent,
     Invocation parentInvocation,
@@ -496,7 +511,8 @@
         );
 }
 
-class _FakeJobCancelResponse_44 extends _i1.SmartFake implements _i6.JobCancelResponse {
+class _FakeJobCancelResponse_44 extends _i1.SmartFake
+    implements _i6.JobCancelResponse {
   _FakeJobCancelResponse_44(
     Object parent,
     Invocation parentInvocation,
@@ -516,7 +532,8 @@
         );
 }
 
-class _FakeGetQueryResultsResponse_46 extends _i1.SmartFake implements _i6.GetQueryResultsResponse {
+class _FakeGetQueryResultsResponse_46 extends _i1.SmartFake
+    implements _i6.GetQueryResultsResponse {
   _FakeGetQueryResultsResponse_46(
     Object parent,
     Invocation parentInvocation,
@@ -546,7 +563,8 @@
         );
 }
 
-class _FakeBuildBucketClient_49 extends _i1.SmartFake implements _i18.BuildBucketClient {
+class _FakeBuildBucketClient_49 extends _i1.SmartFake
+    implements _i18.BuildBucketClient {
   _FakeBuildBucketClient_49(
     Object parent,
     Invocation parentInvocation,
@@ -576,7 +594,8 @@
         );
 }
 
-class _FakeProcessResult_52 extends _i1.SmartFake implements _i15.ProcessResult {
+class _FakeProcessResult_52 extends _i1.SmartFake
+    implements _i15.ProcessResult {
   _FakeProcessResult_52(
     Object parent,
     Invocation parentInvocation,
@@ -586,7 +605,8 @@
         );
 }
 
-class _FakePullRequestMerge_53 extends _i1.SmartFake implements _i10.PullRequestMerge {
+class _FakePullRequestMerge_53 extends _i1.SmartFake
+    implements _i10.PullRequestMerge {
   _FakePullRequestMerge_53(
     Object parent,
     Invocation parentInvocation,
@@ -596,7 +616,8 @@
         );
 }
 
-class _FakePullRequestComment_54 extends _i1.SmartFake implements _i10.PullRequestComment {
+class _FakePullRequestComment_54 extends _i1.SmartFake
+    implements _i10.PullRequestComment {
   _FakePullRequestComment_54(
     Object parent,
     Invocation parentInvocation,
@@ -606,7 +627,8 @@
         );
 }
 
-class _FakePullRequestReview_55 extends _i1.SmartFake implements _i10.PullRequestReview {
+class _FakePullRequestReview_55 extends _i1.SmartFake
+    implements _i10.PullRequestReview {
   _FakePullRequestReview_55(
     Object parent,
     Invocation parentInvocation,
@@ -626,7 +648,8 @@
         );
 }
 
-class _FakeLicenseDetails_57 extends _i1.SmartFake implements _i10.LicenseDetails {
+class _FakeLicenseDetails_57 extends _i1.SmartFake
+    implements _i10.LicenseDetails {
   _FakeLicenseDetails_57(
     Object parent,
     Invocation parentInvocation,
@@ -636,7 +659,8 @@
         );
 }
 
-class _FakeLanguageBreakdown_58 extends _i1.SmartFake implements _i10.LanguageBreakdown {
+class _FakeLanguageBreakdown_58 extends _i1.SmartFake
+    implements _i10.LanguageBreakdown {
   _FakeLanguageBreakdown_58(
     Object parent,
     Invocation parentInvocation,
@@ -656,7 +680,8 @@
         );
 }
 
-class _FakeCommitComment_60 extends _i1.SmartFake implements _i10.CommitComment {
+class _FakeCommitComment_60 extends _i1.SmartFake
+    implements _i10.CommitComment {
   _FakeCommitComment_60(
     Object parent,
     Invocation parentInvocation,
@@ -666,7 +691,8 @@
         );
 }
 
-class _FakeRepositoryCommit_61 extends _i1.SmartFake implements _i10.RepositoryCommit {
+class _FakeRepositoryCommit_61 extends _i1.SmartFake
+    implements _i10.RepositoryCommit {
   _FakeRepositoryCommit_61(
     Object parent,
     Invocation parentInvocation,
@@ -676,7 +702,8 @@
         );
 }
 
-class _FakeGitHubComparison_62 extends _i1.SmartFake implements _i10.GitHubComparison {
+class _FakeGitHubComparison_62 extends _i1.SmartFake
+    implements _i10.GitHubComparison {
   _FakeGitHubComparison_62(
     Object parent,
     Invocation parentInvocation,
@@ -696,7 +723,8 @@
         );
 }
 
-class _FakeRepositoryContents_64 extends _i1.SmartFake implements _i10.RepositoryContents {
+class _FakeRepositoryContents_64 extends _i1.SmartFake
+    implements _i10.RepositoryContents {
   _FakeRepositoryContents_64(
     Object parent,
     Invocation parentInvocation,
@@ -706,7 +734,8 @@
         );
 }
 
-class _FakeContentCreation_65 extends _i1.SmartFake implements _i10.ContentCreation {
+class _FakeContentCreation_65 extends _i1.SmartFake
+    implements _i10.ContentCreation {
   _FakeContentCreation_65(
     Object parent,
     Invocation parentInvocation,
@@ -736,7 +765,8 @@
         );
 }
 
-class _FakeRepositoryPages_68 extends _i1.SmartFake implements _i10.RepositoryPages {
+class _FakeRepositoryPages_68 extends _i1.SmartFake
+    implements _i10.RepositoryPages {
   _FakeRepositoryPages_68(
     Object parent,
     Invocation parentInvocation,
@@ -776,7 +806,8 @@
         );
 }
 
-class _FakeContributorParticipation_72 extends _i1.SmartFake implements _i10.ContributorParticipation {
+class _FakeContributorParticipation_72 extends _i1.SmartFake
+    implements _i10.ContributorParticipation {
   _FakeContributorParticipation_72(
     Object parent,
     Invocation parentInvocation,
@@ -786,7 +817,8 @@
         );
 }
 
-class _FakeRepositoryStatus_73 extends _i1.SmartFake implements _i10.RepositoryStatus {
+class _FakeRepositoryStatus_73 extends _i1.SmartFake
+    implements _i10.RepositoryStatus {
   _FakeRepositoryStatus_73(
     Object parent,
     Invocation parentInvocation,
@@ -796,7 +828,8 @@
         );
 }
 
-class _FakeCombinedRepositoryStatus_74 extends _i1.SmartFake implements _i10.CombinedRepositoryStatus {
+class _FakeCombinedRepositoryStatus_74 extends _i1.SmartFake
+    implements _i10.CombinedRepositoryStatus {
   _FakeCombinedRepositoryStatus_74(
     Object parent,
     Invocation parentInvocation,
@@ -816,7 +849,8 @@
         );
 }
 
-class _FakeTableDataInsertAllResponse_76 extends _i1.SmartFake implements _i6.TableDataInsertAllResponse {
+class _FakeTableDataInsertAllResponse_76 extends _i1.SmartFake
+    implements _i6.TableDataInsertAllResponse {
   _FakeTableDataInsertAllResponse_76(
     Object parent,
     Invocation parentInvocation,
@@ -876,7 +910,8 @@
         );
 }
 
-class _FakeActivityService_82 extends _i1.SmartFake implements _i10.ActivityService {
+class _FakeActivityService_82 extends _i1.SmartFake
+    implements _i10.ActivityService {
   _FakeActivityService_82(
     Object parent,
     Invocation parentInvocation,
@@ -886,7 +921,8 @@
         );
 }
 
-class _FakeAuthorizationsService_83 extends _i1.SmartFake implements _i10.AuthorizationsService {
+class _FakeAuthorizationsService_83 extends _i1.SmartFake
+    implements _i10.AuthorizationsService {
   _FakeAuthorizationsService_83(
     Object parent,
     Invocation parentInvocation,
@@ -916,7 +952,8 @@
         );
 }
 
-class _FakeIssuesService_86 extends _i1.SmartFake implements _i10.IssuesService {
+class _FakeIssuesService_86 extends _i1.SmartFake
+    implements _i10.IssuesService {
   _FakeIssuesService_86(
     Object parent,
     Invocation parentInvocation,
@@ -936,7 +973,8 @@
         );
 }
 
-class _FakeOrganizationsService_88 extends _i1.SmartFake implements _i10.OrganizationsService {
+class _FakeOrganizationsService_88 extends _i1.SmartFake
+    implements _i10.OrganizationsService {
   _FakeOrganizationsService_88(
     Object parent,
     Invocation parentInvocation,
@@ -946,7 +984,8 @@
         );
 }
 
-class _FakePullRequestsService_89 extends _i1.SmartFake implements _i10.PullRequestsService {
+class _FakePullRequestsService_89 extends _i1.SmartFake
+    implements _i10.PullRequestsService {
   _FakePullRequestsService_89(
     Object parent,
     Invocation parentInvocation,
@@ -956,7 +995,8 @@
         );
 }
 
-class _FakeRepositoriesService_90 extends _i1.SmartFake implements _i10.RepositoriesService {
+class _FakeRepositoriesService_90 extends _i1.SmartFake
+    implements _i10.RepositoriesService {
   _FakeRepositoriesService_90(
     Object parent,
     Invocation parentInvocation,
@@ -966,7 +1006,8 @@
         );
 }
 
-class _FakeSearchService_91 extends _i1.SmartFake implements _i10.SearchService {
+class _FakeSearchService_91 extends _i1.SmartFake
+    implements _i10.SearchService {
   _FakeSearchService_91(
     Object parent,
     Invocation parentInvocation,
@@ -976,7 +1017,8 @@
         );
 }
 
-class _FakeUrlShortenerService_92 extends _i1.SmartFake implements _i10.UrlShortenerService {
+class _FakeUrlShortenerService_92 extends _i1.SmartFake
+    implements _i10.UrlShortenerService {
   _FakeUrlShortenerService_92(
     Object parent,
     Invocation parentInvocation,
@@ -996,7 +1038,8 @@
         );
 }
 
-class _FakeChecksService_94 extends _i1.SmartFake implements _i10.ChecksService {
+class _FakeChecksService_94 extends _i1.SmartFake
+    implements _i10.ChecksService {
   _FakeChecksService_94(
     Object parent,
     Invocation parentInvocation,
@@ -1019,14 +1062,17 @@
 /// A class which mocks [AccessClientProvider].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockAccessClientProvider extends _i1.Mock implements _i5.AccessClientProvider {
+class MockAccessClientProvider extends _i1.Mock
+    implements _i5.AccessClientProvider {
   MockAccessClientProvider() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
   _i17.Future<_i2.Client> createAccessClient(
-          {List<String>? scopes = const [r'https://www.googleapis.com/auth/cloud-platform']}) =>
+          {List<String>? scopes = const [
+            r'https://www.googleapis.com/auth/cloud-platform'
+          ]}) =>
       (super.noSuchMethod(
         Invocation.method(
           #createAccessClient,
@@ -1047,7 +1093,8 @@
 /// A class which mocks [AccessTokenService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockAccessTokenService extends _i1.Mock implements _i21.AccessTokenService {
+class MockAccessTokenService extends _i1.Mock
+    implements _i21.AccessTokenService {
   MockAccessTokenService() {
     _i1.throwOnMissingStub(this);
   }
@@ -1098,7 +1145,8 @@
           #defaultTabledata,
           [],
         ),
-        returnValue: _i17.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
+        returnValue:
+            _i17.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
           this,
           Invocation.method(
             #defaultTabledata,
@@ -1135,7 +1183,8 @@
             #bucket: bucket,
           },
         ),
-        returnValue: _i17.Future<List<_i22.BuilderStatistic>>.value(<_i22.BuilderStatistic>[]),
+        returnValue: _i17.Future<List<_i22.BuilderStatistic>>.value(
+            <_i22.BuilderStatistic>[]),
       ) as _i17.Future<List<_i22.BuilderStatistic>>);
   @override
   _i17.Future<List<_i22.BuilderRecord>> listRecentBuildRecordsForBuilder(
@@ -1152,7 +1201,8 @@
             #limit: limit,
           },
         ),
-        returnValue: _i17.Future<List<_i22.BuilderRecord>>.value(<_i22.BuilderRecord>[]),
+        returnValue:
+            _i17.Future<List<_i22.BuilderRecord>>.value(<_i22.BuilderRecord>[]),
       ) as _i17.Future<List<_i22.BuilderRecord>>);
 }
 
@@ -1189,7 +1239,8 @@
         ),
       ) as _i8.RetryOptions);
   @override
-  _i17.Future<void> handleCreateRequest(_i24.CreateEvent? createEvent) => (super.noSuchMethod(
+  _i17.Future<void> handleCreateRequest(_i24.CreateEvent? createEvent) =>
+      (super.noSuchMethod(
         Invocation.method(
           #handleCreateRequest,
           [createEvent],
@@ -1220,7 +1271,8 @@
             #slug: slug,
           },
         ),
-        returnValue: _i17.Future<List<Map<String, String>>>.value(<Map<String, String>>[]),
+        returnValue: _i17.Future<List<Map<String, String>>>.value(
+            <Map<String, String>>[]),
       ) as _i17.Future<List<Map<String, String>>>);
 }
 
@@ -1254,7 +1306,8 @@
   @override
   _i17.Future<_i9.Build> scheduleBuild(
     _i9.ScheduleBuildRequest? request, {
-    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+    String? buildBucketUri =
+        r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1274,7 +1327,8 @@
   @override
   _i17.Future<_i9.SearchBuildsResponse> searchBuilds(
     _i9.SearchBuildsRequest? request, {
-    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+    String? buildBucketUri =
+        r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1282,7 +1336,8 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i17.Future<_i9.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_9(
+        returnValue: _i17.Future<_i9.SearchBuildsResponse>.value(
+            _FakeSearchBuildsResponse_9(
           this,
           Invocation.method(
             #searchBuilds,
@@ -1294,7 +1349,8 @@
   @override
   _i17.Future<_i9.BatchResponse> batch(
     _i9.BatchRequest? request, {
-    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+    String? buildBucketUri =
+        r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1314,7 +1370,8 @@
   @override
   _i17.Future<_i9.Build> cancelBuild(
     _i9.CancelBuildRequest? request, {
-    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+    String? buildBucketUri =
+        r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1334,7 +1391,8 @@
   @override
   _i17.Future<_i9.Build> getBuild(
     _i9.GetBuildRequest? request, {
-    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
+    String? buildBucketUri =
+        r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1354,7 +1412,8 @@
   @override
   _i17.Future<_i9.ListBuildersResponse> listBuilders(
     _i9.ListBuildersRequest? request, {
-    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builders',
+    String? buildBucketUri =
+        r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builders',
   }) =>
       (super.noSuchMethod(
         Invocation.method(
@@ -1362,7 +1421,8 @@
           [request],
           {#buildBucketUri: buildBucketUri},
         ),
-        returnValue: _i17.Future<_i9.ListBuildersResponse>.value(_FakeListBuildersResponse_11(
+        returnValue: _i17.Future<_i9.ListBuildersResponse>.value(
+            _FakeListBuildersResponse_11(
           this,
           Invocation.method(
             #listBuilders,
@@ -1659,7 +1719,8 @@
         )),
       ) as _i17.Future<_i10.Issue>);
   @override
-  _i17.Stream<_i10.User> listAssignees(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.User> listAssignees(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listAssignees,
           [slug],
@@ -1697,7 +1758,9 @@
         returnValue: _i17.Stream<_i10.IssueComment>.empty(),
       ) as _i17.Stream<_i10.IssueComment>);
   @override
-  _i17.Stream<_i10.IssueComment> listCommentsByRepo(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.IssueComment> listCommentsByRepo(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listCommentsByRepo,
           [slug],
@@ -1798,7 +1861,8 @@
         returnValue: _i17.Future<bool>.value(false),
       ) as _i17.Future<bool>);
   @override
-  _i17.Stream<_i10.IssueLabel> listLabels(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.IssueLabel> listLabels(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listLabels,
           [slug],
@@ -1928,7 +1992,8 @@
             labels,
           ],
         ),
-        returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
+        returnValue:
+            _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
       ) as _i17.Future<List<_i10.IssueLabel>>);
   @override
   _i17.Future<List<_i10.IssueLabel>> replaceLabelsForIssue(
@@ -1945,7 +2010,8 @@
             labels,
           ],
         ),
-        returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
+        returnValue:
+            _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
       ) as _i17.Future<List<_i10.IssueLabel>>);
   @override
   _i17.Future<bool> removeLabelForIssue(
@@ -1980,7 +2046,8 @@
         returnValue: _i17.Future<bool>.value(false),
       ) as _i17.Future<bool>);
   @override
-  _i17.Stream<_i10.Milestone> listMilestones(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.Milestone> listMilestones(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listMilestones,
           [slug],
@@ -2031,7 +2098,8 @@
 /// A class which mocks [GithubChecksService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGithubChecksService extends _i1.Mock implements _i28.GithubChecksService {
+class MockGithubChecksService extends _i1.Mock
+    implements _i28.GithubChecksService {
   MockGithubChecksService() {
     _i1.throwOnMissingStub(this);
   }
@@ -2061,7 +2129,8 @@
         ),
       ) as _i11.GithubChecksUtil);
   @override
-  set githubChecksUtil(_i11.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
+  set githubChecksUtil(_i11.GithubChecksUtil? _githubChecksUtil) =>
+      super.noSuchMethod(
         Invocation.setter(
           #githubChecksUtil,
           _githubChecksUtil,
@@ -2112,7 +2181,8 @@
         returnValue: '',
       ) as String);
   @override
-  _i10.CheckRunConclusion conclusionForResult(_i30.Result? result) => (super.noSuchMethod(
+  _i10.CheckRunConclusion conclusionForResult(_i30.Result? result) =>
+      (super.noSuchMethod(
         Invocation.method(
           #conclusionForResult,
           [result],
@@ -2126,7 +2196,8 @@
         ),
       ) as _i10.CheckRunConclusion);
   @override
-  _i10.CheckRunStatus statusForResult(_i30.Status? status) => (super.noSuchMethod(
+  _i10.CheckRunStatus statusForResult(_i30.Status? status) =>
+      (super.noSuchMethod(
         Invocation.method(
           #statusForResult,
           [status],
@@ -2162,7 +2233,8 @@
             checkSuiteEvent,
           ],
         ),
-        returnValue: _i17.Future<Map<String, _i10.CheckRun>>.value(<String, _i10.CheckRun>{}),
+        returnValue: _i17.Future<Map<String, _i10.CheckRun>>.value(
+            <String, _i10.CheckRun>{}),
       ) as _i17.Future<Map<String, _i10.CheckRun>>);
   @override
   _i17.Future<_i10.CheckSuite> getCheckSuite(
@@ -2312,7 +2384,8 @@
             lastCommitTimestampMills,
           ],
         ),
-        returnValue: _i17.Future<List<_i10.RepositoryCommit>>.value(<_i10.RepositoryCommit>[]),
+        returnValue: _i17.Future<List<_i10.RepositoryCommit>>.value(
+            <_i10.RepositoryCommit>[]),
       ) as _i17.Future<List<_i10.RepositoryCommit>>);
   @override
   _i17.Future<List<_i10.PullRequest>> listPullRequests(
@@ -2327,7 +2400,8 @@
             branch,
           ],
         ),
-        returnValue: _i17.Future<List<_i10.PullRequest>>.value(<_i10.PullRequest>[]),
+        returnValue:
+            _i17.Future<List<_i10.PullRequest>>.value(<_i10.PullRequest>[]),
       ) as _i17.Future<List<_i10.PullRequest>>);
   @override
   _i17.Future<_i10.PullRequest> createPullRequest(
@@ -2493,10 +2567,12 @@
             #labels: labels,
           },
         ),
-        returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
+        returnValue:
+            _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
       ) as _i17.Future<List<_i10.IssueLabel>>);
   @override
-  _i17.Future<List<String>> listFiles(_i10.PullRequest? pullRequest) => (super.noSuchMethod(
+  _i17.Future<List<String>> listFiles(_i10.PullRequest? pullRequest) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listFiles,
           [pullRequest],
@@ -2899,7 +2975,8 @@
         ),
       ) as _i12.DefaultPolicies);
   @override
-  set defaultPolicies(_i12.DefaultPolicies? _defaultPolicies) => super.noSuchMethod(
+  set defaultPolicies(_i12.DefaultPolicies? _defaultPolicies) =>
+      super.noSuchMethod(
         Invocation.setter(
           #defaultPolicies,
           _defaultPolicies,
@@ -2971,7 +3048,9 @@
         ),
       ) as _i14.GraphQLClient);
   @override
-  _i12.ObservableQuery<TParsed> watchQuery<TParsed>(_i12.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
+  _i12.ObservableQuery<TParsed> watchQuery<TParsed>(
+          _i12.WatchQueryOptions<TParsed>? options) =>
+      (super.noSuchMethod(
         Invocation.method(
           #watchQuery,
           [options],
@@ -2985,7 +3064,9 @@
         ),
       ) as _i12.ObservableQuery<TParsed>);
   @override
-  _i12.ObservableQuery<TParsed> watchMutation<TParsed>(_i12.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
+  _i12.ObservableQuery<TParsed> watchMutation<TParsed>(
+          _i12.WatchQueryOptions<TParsed>? options) =>
+      (super.noSuchMethod(
         Invocation.method(
           #watchMutation,
           [options],
@@ -2999,12 +3080,15 @@
         ),
       ) as _i12.ObservableQuery<TParsed>);
   @override
-  _i17.Future<_i12.QueryResult<TParsed>> query<TParsed>(_i12.QueryOptions<TParsed>? options) => (super.noSuchMethod(
+  _i17.Future<_i12.QueryResult<TParsed>> query<TParsed>(
+          _i12.QueryOptions<TParsed>? options) =>
+      (super.noSuchMethod(
         Invocation.method(
           #query,
           [options],
         ),
-        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(_FakeQueryResult_35<TParsed>(
+        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(
+            _FakeQueryResult_35<TParsed>(
           this,
           Invocation.method(
             #query,
@@ -3013,12 +3097,15 @@
         )),
       ) as _i17.Future<_i12.QueryResult<TParsed>>);
   @override
-  _i17.Future<_i12.QueryResult<TParsed>> mutate<TParsed>(_i12.MutationOptions<TParsed>? options) => (super.noSuchMethod(
+  _i17.Future<_i12.QueryResult<TParsed>> mutate<TParsed>(
+          _i12.MutationOptions<TParsed>? options) =>
+      (super.noSuchMethod(
         Invocation.method(
           #mutate,
           [options],
         ),
-        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(_FakeQueryResult_35<TParsed>(
+        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(
+            _FakeQueryResult_35<TParsed>(
           this,
           Invocation.method(
             #mutate,
@@ -3027,7 +3114,8 @@
         )),
       ) as _i17.Future<_i12.QueryResult<TParsed>>);
   @override
-  _i17.Stream<_i12.QueryResult<TParsed>> subscribe<TParsed>(_i12.SubscriptionOptions<TParsed>? options) =>
+  _i17.Stream<_i12.QueryResult<TParsed>> subscribe<TParsed>(
+          _i12.SubscriptionOptions<TParsed>? options) =>
       (super.noSuchMethod(
         Invocation.method(
           #subscribe,
@@ -3050,7 +3138,8 @@
             #previousResult: previousResult,
           },
         ),
-        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(_FakeQueryResult_35<TParsed>(
+        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(
+            _FakeQueryResult_35<TParsed>(
           this,
           Invocation.method(
             #fetchMore,
@@ -3117,7 +3206,8 @@
         returnValueForMissingStub: null,
       );
   @override
-  _i17.Future<List<_i12.QueryResult<Object?>?>>? resetStore({bool? refetchQueries = true}) =>
+  _i17.Future<List<_i12.QueryResult<Object?>?>>? resetStore(
+          {bool? refetchQueries = true}) =>
       (super.noSuchMethod(Invocation.method(
         #resetStore,
         [],
@@ -3280,7 +3370,8 @@
             path,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #open,
@@ -3306,7 +3397,8 @@
             url,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #openUrl,
@@ -3332,7 +3424,8 @@
             path,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #get,
@@ -3350,7 +3443,8 @@
           #getUrl,
           [url],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #getUrl,
@@ -3373,7 +3467,8 @@
             path,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #post,
@@ -3391,7 +3486,8 @@
           #postUrl,
           [url],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #postUrl,
@@ -3414,7 +3510,8 @@
             path,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #put,
@@ -3432,7 +3529,8 @@
           #putUrl,
           [url],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #putUrl,
@@ -3455,7 +3553,8 @@
             path,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #delete,
@@ -3468,12 +3567,14 @@
         )),
       ) as _i17.Future<_i15.HttpClientRequest>);
   @override
-  _i17.Future<_i15.HttpClientRequest> deleteUrl(Uri? url) => (super.noSuchMethod(
+  _i17.Future<_i15.HttpClientRequest> deleteUrl(Uri? url) =>
+      (super.noSuchMethod(
         Invocation.method(
           #deleteUrl,
           [url],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #deleteUrl,
@@ -3496,7 +3597,8 @@
             path,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #patch,
@@ -3514,7 +3616,8 @@
           #patchUrl,
           [url],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #patchUrl,
@@ -3537,7 +3640,8 @@
             path,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #head,
@@ -3555,7 +3659,8 @@
           #headUrl,
           [url],
         ),
-        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
+        returnValue:
+            _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
           this,
           Invocation.method(
             #headUrl,
@@ -3712,7 +3817,8 @@
   @override
   _i17.Future<_i15.HttpClientResponse> get done => (super.noSuchMethod(
         Invocation.getter(#done),
-        returnValue: _i17.Future<_i15.HttpClientResponse>.value(_FakeHttpClientResponse_40(
+        returnValue: _i17.Future<_i15.HttpClientResponse>.value(
+            _FakeHttpClientResponse_40(
           this,
           Invocation.getter(#done),
         )),
@@ -3739,7 +3845,8 @@
           #close,
           [],
         ),
-        returnValue: _i17.Future<_i15.HttpClientResponse>.value(_FakeHttpClientResponse_40(
+        returnValue: _i17.Future<_i15.HttpClientResponse>.value(
+            _FakeHttpClientResponse_40(
           this,
           Invocation.method(
             #close,
@@ -3825,7 +3932,8 @@
         returnValueForMissingStub: null,
       );
   @override
-  _i17.Future<dynamic> addStream(_i17.Stream<List<int>>? stream) => (super.noSuchMethod(
+  _i17.Future<dynamic> addStream(_i17.Stream<List<int>>? stream) =>
+      (super.noSuchMethod(
         Invocation.method(
           #addStream,
           [stream],
@@ -3845,7 +3953,8 @@
 /// A class which mocks [HttpClientResponse].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockHttpClientResponse extends _i1.Mock implements _i15.HttpClientResponse {
+class MockHttpClientResponse extends _i1.Mock
+    implements _i15.HttpClientResponse {
   MockHttpClientResponse() {
     _i1.throwOnMissingStub(this);
   }
@@ -3866,7 +3975,8 @@
         returnValue: 0,
       ) as int);
   @override
-  _i15.HttpClientResponseCompressionState get compressionState => (super.noSuchMethod(
+  _i15.HttpClientResponseCompressionState get compressionState =>
+      (super.noSuchMethod(
         Invocation.getter(#compressionState),
         returnValue: _i15.HttpClientResponseCompressionState.notCompressed,
       ) as _i15.HttpClientResponseCompressionState);
@@ -3943,7 +4053,8 @@
             followLoops,
           ],
         ),
-        returnValue: _i17.Future<_i15.HttpClientResponse>.value(_FakeHttpClientResponse_40(
+        returnValue: _i17.Future<_i15.HttpClientResponse>.value(
+            _FakeHttpClientResponse_40(
           this,
           Invocation.method(
             #redirect,
@@ -4016,7 +4127,8 @@
         ),
       ) as _i17.StreamSubscription<List<int>>);
   @override
-  _i17.Stream<List<int>> where(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i17.Stream<List<int>> where(bool Function(List<int>)? test) =>
+      (super.noSuchMethod(
         Invocation.method(
           #where,
           [test],
@@ -4032,7 +4144,8 @@
         returnValue: _i17.Stream<S>.empty(),
       ) as _i17.Stream<S>);
   @override
-  _i17.Stream<E> asyncMap<E>(_i17.FutureOr<E> Function(List<int>)? convert) => (super.noSuchMethod(
+  _i17.Stream<E> asyncMap<E>(_i17.FutureOr<E> Function(List<int>)? convert) =>
+      (super.noSuchMethod(
         Invocation.method(
           #asyncMap,
           [convert],
@@ -4040,7 +4153,8 @@
         returnValue: _i17.Stream<E>.empty(),
       ) as _i17.Stream<E>);
   @override
-  _i17.Stream<E> asyncExpand<E>(_i17.Stream<E>? Function(List<int>)? convert) => (super.noSuchMethod(
+  _i17.Stream<E> asyncExpand<E>(_i17.Stream<E>? Function(List<int>)? convert) =>
+      (super.noSuchMethod(
         Invocation.method(
           #asyncExpand,
           [convert],
@@ -4061,7 +4175,8 @@
         returnValue: _i17.Stream<List<int>>.empty(),
       ) as _i17.Stream<List<int>>);
   @override
-  _i17.Stream<S> expand<S>(Iterable<S> Function(List<int>)? convert) => (super.noSuchMethod(
+  _i17.Stream<S> expand<S>(Iterable<S> Function(List<int>)? convert) =>
+      (super.noSuchMethod(
         Invocation.method(
           #expand,
           [convert],
@@ -4069,7 +4184,8 @@
         returnValue: _i17.Stream<S>.empty(),
       ) as _i17.Stream<S>);
   @override
-  _i17.Future<dynamic> pipe(_i17.StreamConsumer<List<int>>? streamConsumer) => (super.noSuchMethod(
+  _i17.Future<dynamic> pipe(_i17.StreamConsumer<List<int>>? streamConsumer) =>
+      (super.noSuchMethod(
         Invocation.method(
           #pipe,
           [streamConsumer],
@@ -4077,7 +4193,9 @@
         returnValue: _i17.Future<dynamic>.value(),
       ) as _i17.Future<dynamic>);
   @override
-  _i17.Stream<S> transform<S>(_i17.StreamTransformer<List<int>, S>? streamTransformer) => (super.noSuchMethod(
+  _i17.Stream<S> transform<S>(
+          _i17.StreamTransformer<List<int>, S>? streamTransformer) =>
+      (super.noSuchMethod(
         Invocation.method(
           #transform,
           [streamTransformer],
@@ -4134,7 +4252,8 @@
         returnValue: _i17.Future<bool>.value(false),
       ) as _i17.Future<bool>);
   @override
-  _i17.Future<dynamic> forEach(void Function(List<int>)? action) => (super.noSuchMethod(
+  _i17.Future<dynamic> forEach(void Function(List<int>)? action) =>
+      (super.noSuchMethod(
         Invocation.method(
           #forEach,
           [action],
@@ -4142,7 +4261,8 @@
         returnValue: _i17.Future<dynamic>.value(),
       ) as _i17.Future<dynamic>);
   @override
-  _i17.Future<bool> every(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i17.Future<bool> every(bool Function(List<int>)? test) =>
+      (super.noSuchMethod(
         Invocation.method(
           #every,
           [test],
@@ -4198,7 +4318,8 @@
         returnValue: _i17.Stream<List<int>>.empty(),
       ) as _i17.Stream<List<int>>);
   @override
-  _i17.Stream<List<int>> takeWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i17.Stream<List<int>> takeWhile(bool Function(List<int>)? test) =>
+      (super.noSuchMethod(
         Invocation.method(
           #takeWhile,
           [test],
@@ -4214,7 +4335,8 @@
         returnValue: _i17.Stream<List<int>>.empty(),
       ) as _i17.Stream<List<int>>);
   @override
-  _i17.Stream<List<int>> skipWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
+  _i17.Stream<List<int>> skipWhile(bool Function(List<int>)? test) =>
+      (super.noSuchMethod(
         Invocation.method(
           #skipWhile,
           [test],
@@ -4324,7 +4446,8 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i17.Future<_i6.JobCancelResponse>.value(_FakeJobCancelResponse_44(
+        returnValue:
+            _i17.Future<_i6.JobCancelResponse>.value(_FakeJobCancelResponse_44(
           this,
           Invocation.method(
             #cancel,
@@ -4422,7 +4545,8 @@
             #$fields: $fields,
           },
         ),
-        returnValue: _i17.Future<_i6.GetQueryResultsResponse>.value(_FakeGetQueryResultsResponse_46(
+        returnValue: _i17.Future<_i6.GetQueryResultsResponse>.value(
+            _FakeGetQueryResultsResponse_46(
           this,
           Invocation.method(
             #getQueryResults,
@@ -4572,7 +4696,8 @@
         ),
       ) as _i18.BuildBucketClient);
   @override
-  set buildBucketClient(_i18.BuildBucketClient? _buildBucketClient) => super.noSuchMethod(
+  set buildBucketClient(_i18.BuildBucketClient? _buildBucketClient) =>
+      super.noSuchMethod(
         Invocation.setter(
           #buildBucketClient,
           _buildBucketClient,
@@ -4604,7 +4729,8 @@
         ),
       ) as _i11.GithubChecksUtil);
   @override
-  set githubChecksUtil(_i11.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
+  set githubChecksUtil(_i11.GithubChecksUtil? _githubChecksUtil) =>
+      super.noSuchMethod(
         Invocation.setter(
           #githubChecksUtil,
           _githubChecksUtil,
@@ -4648,7 +4774,8 @@
             max,
           ],
         ),
-        returnValue: _i17.Future<List<List<_i9.Request>>>.value(<List<_i9.Request>>[]),
+        returnValue:
+            _i17.Future<List<List<_i9.Request>>>.value(<List<_i9.Request>>[]),
       ) as _i17.Future<List<List<_i9.Request>>>);
   @override
   _i17.Future<Iterable<_i9.Build>> getTryBuilds(
@@ -4706,12 +4833,15 @@
         returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
       ) as _i17.Future<Iterable<_i9.Build>>);
   @override
-  _i17.Future<Map<String?, _i9.Build?>> tryBuildsForPullRequest(_i10.PullRequest? pullRequest) => (super.noSuchMethod(
+  _i17.Future<Map<String?, _i9.Build?>> tryBuildsForPullRequest(
+          _i10.PullRequest? pullRequest) =>
+      (super.noSuchMethod(
         Invocation.method(
           #tryBuildsForPullRequest,
           [pullRequest],
         ),
-        returnValue: _i17.Future<Map<String?, _i9.Build?>>.value(<String?, _i9.Build?>{}),
+        returnValue: _i17.Future<Map<String?, _i9.Build?>>.value(
+            <String?, _i9.Build?>{}),
       ) as _i17.Future<Map<String?, _i9.Build?>>);
   @override
   _i17.Future<List<_i32.Target>> scheduleTryBuilds({
@@ -4792,7 +4922,9 @@
         )),
       ) as _i17.Future<_i9.Build>);
   @override
-  _i17.Future<_i9.Build> rescheduleUsingCheckRunEvent(_i33.CheckRunEvent? checkRunEvent) => (super.noSuchMethod(
+  _i17.Future<_i9.Build> rescheduleUsingCheckRunEvent(
+          _i33.CheckRunEvent? checkRunEvent) =>
+      (super.noSuchMethod(
         Invocation.method(
           #rescheduleUsingCheckRunEvent,
           [checkRunEvent],
@@ -4969,7 +5101,8 @@
             #stderrEncoding: stderrEncoding,
           },
         ),
-        returnValue: _i17.Future<_i15.ProcessResult>.value(_FakeProcessResult_52(
+        returnValue:
+            _i17.Future<_i15.ProcessResult>.value(_FakeProcessResult_52(
           this,
           Invocation.method(
             #run,
@@ -5057,7 +5190,8 @@
 /// A class which mocks [PullRequestsService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockPullRequestsService extends _i1.Mock implements _i10.PullRequestsService {
+class MockPullRequestsService extends _i1.Mock
+    implements _i10.PullRequestsService {
   MockPullRequestsService() {
     _i1.throwOnMissingStub(this);
   }
@@ -5264,7 +5398,8 @@
             #requestSha: requestSha,
           },
         ),
-        returnValue: _i17.Future<_i10.PullRequestMerge>.value(_FakePullRequestMerge_53(
+        returnValue:
+            _i17.Future<_i10.PullRequestMerge>.value(_FakePullRequestMerge_53(
           this,
           Invocation.method(
             #merge,
@@ -5296,7 +5431,9 @@
         returnValue: _i17.Stream<_i10.PullRequestComment>.empty(),
       ) as _i17.Stream<_i10.PullRequestComment>);
   @override
-  _i17.Stream<_i10.PullRequestComment> listComments(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.PullRequestComment> listComments(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listComments,
           [slug],
@@ -5318,7 +5455,8 @@
             comment,
           ],
         ),
-        returnValue: _i17.Future<_i10.PullRequestComment>.value(_FakePullRequestComment_54(
+        returnValue: _i17.Future<_i10.PullRequestComment>.value(
+            _FakePullRequestComment_54(
           this,
           Invocation.method(
             #createComment,
@@ -5343,7 +5481,8 @@
             review,
           ],
         ),
-        returnValue: _i17.Future<_i10.PullRequestReview>.value(_FakePullRequestReview_55(
+        returnValue:
+            _i17.Future<_i10.PullRequestReview>.value(_FakePullRequestReview_55(
           this,
           Invocation.method(
             #createReview,
@@ -5356,10 +5495,78 @@
       ) as _i17.Future<_i10.PullRequestReview>);
 }
 
+/// A class which mocks [ReadWriteMutex].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockReadWriteMutex extends _i1.Mock implements _i39.ReadWriteMutex {
+  MockReadWriteMutex() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  bool get isLocked => (super.noSuchMethod(
+        Invocation.getter(#isLocked),
+        returnValue: false,
+      ) as bool);
+  @override
+  bool get isWriteLocked => (super.noSuchMethod(
+        Invocation.getter(#isWriteLocked),
+        returnValue: false,
+      ) as bool);
+  @override
+  bool get isReadLocked => (super.noSuchMethod(
+        Invocation.getter(#isReadLocked),
+        returnValue: false,
+      ) as bool);
+  @override
+  _i17.Future<dynamic> acquireRead() => (super.noSuchMethod(
+        Invocation.method(
+          #acquireRead,
+          [],
+        ),
+        returnValue: _i17.Future<dynamic>.value(),
+      ) as _i17.Future<dynamic>);
+  @override
+  _i17.Future<dynamic> acquireWrite() => (super.noSuchMethod(
+        Invocation.method(
+          #acquireWrite,
+          [],
+        ),
+        returnValue: _i17.Future<dynamic>.value(),
+      ) as _i17.Future<dynamic>);
+  @override
+  void release() => super.noSuchMethod(
+        Invocation.method(
+          #release,
+          [],
+        ),
+        returnValueForMissingStub: null,
+      );
+  @override
+  _i17.Future<T> protectRead<T>(_i17.Future<T> Function()? criticalSection) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #protectRead,
+          [criticalSection],
+        ),
+        returnValue: _i17.Future<T>.value(null),
+      ) as _i17.Future<T>);
+  @override
+  _i17.Future<T> protectWrite<T>(_i17.Future<T> Function()? criticalSection) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #protectWrite,
+          [criticalSection],
+        ),
+        returnValue: _i17.Future<T>.value(null),
+      ) as _i17.Future<T>);
+}
+
 /// A class which mocks [RepositoriesService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockRepositoriesService extends _i1.Mock implements _i10.RepositoriesService {
+class MockRepositoriesService extends _i1.Mock
+    implements _i10.RepositoriesService {
   MockRepositoriesService() {
     _i1.throwOnMissingStub(this);
   }
@@ -5459,12 +5666,14 @@
         )),
       ) as _i17.Future<_i10.Repository>);
   @override
-  _i17.Future<_i10.LicenseDetails> getLicense(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<_i10.LicenseDetails> getLicense(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #getLicense,
           [slug],
         ),
-        returnValue: _i17.Future<_i10.LicenseDetails>.value(_FakeLicenseDetails_57(
+        returnValue:
+            _i17.Future<_i10.LicenseDetails>.value(_FakeLicenseDetails_57(
           this,
           Invocation.method(
             #getLicense,
@@ -5473,7 +5682,8 @@
         )),
       ) as _i17.Future<_i10.LicenseDetails>);
   @override
-  _i17.Future<_i10.Repository> getRepository(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<_i10.Repository> getRepository(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #getRepository,
           [slug],
@@ -5487,7 +5697,9 @@
         )),
       ) as _i17.Future<_i10.Repository>);
   @override
-  _i17.Stream<_i10.Repository> getRepositories(List<_i10.RepositorySlug>? slugs) => (super.noSuchMethod(
+  _i17.Stream<_i10.Repository> getRepositories(
+          List<_i10.RepositorySlug>? slugs) =>
+      (super.noSuchMethod(
         Invocation.method(
           #getRepositories,
           [slugs],
@@ -5537,7 +5749,8 @@
         )),
       ) as _i17.Future<_i10.Repository>);
   @override
-  _i17.Future<bool> deleteRepository(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<bool> deleteRepository(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #deleteRepository,
           [slug],
@@ -5558,7 +5771,8 @@
         returnValue: _i17.Stream<_i10.Contributor>.empty(),
       ) as _i17.Stream<_i10.Contributor>);
   @override
-  _i17.Stream<_i10.Team> listTeams(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.Team> listTeams(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listTeams,
           [slug],
@@ -5566,12 +5780,15 @@
         returnValue: _i17.Stream<_i10.Team>.empty(),
       ) as _i17.Stream<_i10.Team>);
   @override
-  _i17.Future<_i10.LanguageBreakdown> listLanguages(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<_i10.LanguageBreakdown> listLanguages(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listLanguages,
           [slug],
         ),
-        returnValue: _i17.Future<_i10.LanguageBreakdown>.value(_FakeLanguageBreakdown_58(
+        returnValue:
+            _i17.Future<_i10.LanguageBreakdown>.value(_FakeLanguageBreakdown_58(
           this,
           Invocation.method(
             #listLanguages,
@@ -5599,7 +5816,8 @@
         returnValue: _i17.Stream<_i10.Tag>.empty(),
       ) as _i17.Stream<_i10.Tag>);
   @override
-  _i17.Stream<_i10.Branch> listBranches(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.Branch> listBranches(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listBranches,
           [slug],
@@ -5631,7 +5849,8 @@
         )),
       ) as _i17.Future<_i10.Branch>);
   @override
-  _i17.Stream<_i10.Collaborator> listCollaborators(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.Collaborator> listCollaborators(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listCollaborators,
           [slug],
@@ -5699,7 +5918,9 @@
         returnValue: _i17.Stream<_i10.CommitComment>.empty(),
       ) as _i17.Stream<_i10.CommitComment>);
   @override
-  _i17.Stream<_i10.CommitComment> listCommitComments(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.CommitComment> listCommitComments(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listCommitComments,
           [slug],
@@ -5729,7 +5950,8 @@
             #line: line,
           },
         ),
-        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
+        returnValue:
+            _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
           this,
           Invocation.method(
             #createCommitComment,
@@ -5757,7 +5979,8 @@
           [slug],
           {#id: id},
         ),
-        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
+        returnValue:
+            _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
           this,
           Invocation.method(
             #getCommitComment,
@@ -5781,7 +6004,8 @@
             #body: body,
           },
         ),
-        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
+        returnValue:
+            _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
           this,
           Invocation.method(
             #updateCommitComment,
@@ -5807,7 +6031,8 @@
         returnValue: _i17.Future<bool>.value(false),
       ) as _i17.Future<bool>);
   @override
-  _i17.Stream<_i10.RepositoryCommit> listCommits(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.RepositoryCommit> listCommits(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listCommits,
           [slug],
@@ -5827,7 +6052,8 @@
             sha,
           ],
         ),
-        returnValue: _i17.Future<_i10.RepositoryCommit>.value(_FakeRepositoryCommit_61(
+        returnValue:
+            _i17.Future<_i10.RepositoryCommit>.value(_FakeRepositoryCommit_61(
           this,
           Invocation.method(
             #getCommit,
@@ -5868,7 +6094,8 @@
             refHead,
           ],
         ),
-        returnValue: _i17.Future<_i10.GitHubComparison>.value(_FakeGitHubComparison_62(
+        returnValue:
+            _i17.Future<_i10.GitHubComparison>.value(_FakeGitHubComparison_62(
           this,
           Invocation.method(
             #compareCommits,
@@ -5915,7 +6142,8 @@
           ],
           {#ref: ref},
         ),
-        returnValue: _i17.Future<_i10.RepositoryContents>.value(_FakeRepositoryContents_64(
+        returnValue: _i17.Future<_i10.RepositoryContents>.value(
+            _FakeRepositoryContents_64(
           this,
           Invocation.method(
             #getContents,
@@ -5940,7 +6168,8 @@
             file,
           ],
         ),
-        returnValue: _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
+        returnValue:
+            _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
           this,
           Invocation.method(
             #createFile,
@@ -5972,7 +6201,8 @@
           ],
           {#branch: branch},
         ),
-        returnValue: _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
+        returnValue:
+            _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
           this,
           Invocation.method(
             #updateFile,
@@ -6006,7 +6236,8 @@
             branch,
           ],
         ),
-        returnValue: _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
+        returnValue:
+            _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
           this,
           Invocation.method(
             #deleteFile,
@@ -6038,7 +6269,8 @@
         returnValue: _i17.Future<String?>.value(),
       ) as _i17.Future<String?>);
   @override
-  _i17.Stream<_i10.Repository> listForks(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.Repository> listForks(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listForks,
           [slug],
@@ -6070,7 +6302,8 @@
         )),
       ) as _i17.Future<_i10.Repository>);
   @override
-  _i17.Stream<_i10.Hook> listHooks(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.Hook> listHooks(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listHooks,
           [slug],
@@ -6223,7 +6456,8 @@
         returnValue: _i17.Future<bool>.value(false),
       ) as _i17.Future<bool>);
   @override
-  _i17.Stream<_i10.PublicKey> listDeployKeys(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.PublicKey> listDeployKeys(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listDeployKeys,
           [slug],
@@ -6303,7 +6537,8 @@
             merge,
           ],
         ),
-        returnValue: _i17.Future<_i10.RepositoryCommit>.value(_FakeRepositoryCommit_61(
+        returnValue:
+            _i17.Future<_i10.RepositoryCommit>.value(_FakeRepositoryCommit_61(
           this,
           Invocation.method(
             #merge,
@@ -6315,12 +6550,14 @@
         )),
       ) as _i17.Future<_i10.RepositoryCommit>);
   @override
-  _i17.Future<_i10.RepositoryPages> getPagesInfo(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<_i10.RepositoryPages> getPagesInfo(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #getPagesInfo,
           [slug],
         ),
-        returnValue: _i17.Future<_i10.RepositoryPages>.value(_FakeRepositoryPages_68(
+        returnValue:
+            _i17.Future<_i10.RepositoryPages>.value(_FakeRepositoryPages_68(
           this,
           Invocation.method(
             #getPagesInfo,
@@ -6329,7 +6566,8 @@
         )),
       ) as _i17.Future<_i10.RepositoryPages>);
   @override
-  _i17.Stream<_i10.PageBuild> listPagesBuilds(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.PageBuild> listPagesBuilds(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listPagesBuilds,
           [slug],
@@ -6337,7 +6575,8 @@
         returnValue: _i17.Stream<_i10.PageBuild>.empty(),
       ) as _i17.Stream<_i10.PageBuild>);
   @override
-  _i17.Future<_i10.PageBuild> getLatestPagesBuild(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<_i10.PageBuild> getLatestPagesBuild(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #getLatestPagesBuild,
           [slug],
@@ -6351,7 +6590,8 @@
         )),
       ) as _i17.Future<_i10.PageBuild>);
   @override
-  _i17.Stream<_i10.Release> listReleases(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.Release> listReleases(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listReleases,
           [slug],
@@ -6359,7 +6599,8 @@
         returnValue: _i17.Stream<_i10.Release>.empty(),
       ) as _i17.Stream<_i10.Release>);
   @override
-  _i17.Future<_i10.Release> getLatestRelease(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<_i10.Release> getLatestRelease(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #getLatestRelease,
           [slug],
@@ -6612,18 +6853,24 @@
             createReleaseAssets,
           ],
         ),
-        returnValue: _i17.Future<List<_i10.ReleaseAsset>>.value(<_i10.ReleaseAsset>[]),
+        returnValue:
+            _i17.Future<List<_i10.ReleaseAsset>>.value(<_i10.ReleaseAsset>[]),
       ) as _i17.Future<List<_i10.ReleaseAsset>>);
   @override
-  _i17.Future<List<_i10.ContributorStatistics>> listContributorStats(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<List<_i10.ContributorStatistics>> listContributorStats(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listContributorStats,
           [slug],
         ),
-        returnValue: _i17.Future<List<_i10.ContributorStatistics>>.value(<_i10.ContributorStatistics>[]),
+        returnValue: _i17.Future<List<_i10.ContributorStatistics>>.value(
+            <_i10.ContributorStatistics>[]),
       ) as _i17.Future<List<_i10.ContributorStatistics>>);
   @override
-  _i17.Stream<_i10.YearCommitCountWeek> listCommitActivity(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.YearCommitCountWeek> listCommitActivity(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listCommitActivity,
           [slug],
@@ -6631,7 +6878,9 @@
         returnValue: _i17.Stream<_i10.YearCommitCountWeek>.empty(),
       ) as _i17.Stream<_i10.YearCommitCountWeek>);
   @override
-  _i17.Stream<_i10.WeeklyChangesCount> listCodeFrequency(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.WeeklyChangesCount> listCodeFrequency(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listCodeFrequency,
           [slug],
@@ -6639,12 +6888,15 @@
         returnValue: _i17.Stream<_i10.WeeklyChangesCount>.empty(),
       ) as _i17.Stream<_i10.WeeklyChangesCount>);
   @override
-  _i17.Future<_i10.ContributorParticipation> getParticipation(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Future<_i10.ContributorParticipation> getParticipation(
+          _i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #getParticipation,
           [slug],
         ),
-        returnValue: _i17.Future<_i10.ContributorParticipation>.value(_FakeContributorParticipation_72(
+        returnValue: _i17.Future<_i10.ContributorParticipation>.value(
+            _FakeContributorParticipation_72(
           this,
           Invocation.method(
             #getParticipation,
@@ -6653,7 +6905,8 @@
         )),
       ) as _i17.Future<_i10.ContributorParticipation>);
   @override
-  _i17.Stream<_i10.PunchcardEntry> listPunchcard(_i10.RepositorySlug? slug) => (super.noSuchMethod(
+  _i17.Stream<_i10.PunchcardEntry> listPunchcard(_i10.RepositorySlug? slug) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listPunchcard,
           [slug],
@@ -6690,7 +6943,8 @@
             request,
           ],
         ),
-        returnValue: _i17.Future<_i10.RepositoryStatus>.value(_FakeRepositoryStatus_73(
+        returnValue:
+            _i17.Future<_i10.RepositoryStatus>.value(_FakeRepositoryStatus_73(
           this,
           Invocation.method(
             #createStatus,
@@ -6715,7 +6969,8 @@
             ref,
           ],
         ),
-        returnValue: _i17.Future<_i10.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_74(
+        returnValue: _i17.Future<_i10.CombinedRepositoryStatus>.value(
+            _FakeCombinedRepositoryStatus_74(
           this,
           Invocation.method(
             #getCombinedStatus,
@@ -6727,7 +6982,9 @@
         )),
       ) as _i17.Future<_i10.CombinedRepositoryStatus>);
   @override
-  _i17.Future<_i10.ReleaseNotes> generateReleaseNotes(_i10.CreateReleaseNotes? crn) => (super.noSuchMethod(
+  _i17.Future<_i10.ReleaseNotes> generateReleaseNotes(
+          _i10.CreateReleaseNotes? crn) =>
+      (super.noSuchMethod(
         Invocation.method(
           #generateReleaseNotes,
           [crn],
@@ -6769,7 +7026,8 @@
           ],
           {#$fields: $fields},
         ),
-        returnValue: _i17.Future<_i6.TableDataInsertAllResponse>.value(_FakeTableDataInsertAllResponse_76(
+        returnValue: _i17.Future<_i6.TableDataInsertAllResponse>.value(
+            _FakeTableDataInsertAllResponse_76(
           this,
           Invocation.method(
             #insertAll,
@@ -6962,7 +7220,8 @@
         returnValue: _i17.Stream<_i10.UserEmail>.empty(),
       ) as _i17.Stream<_i10.UserEmail>);
   @override
-  _i17.Stream<_i10.UserEmail> addEmails(List<String>? emails) => (super.noSuchMethod(
+  _i17.Stream<_i10.UserEmail> addEmails(List<String>? emails) =>
+      (super.noSuchMethod(
         Invocation.method(
           #addEmails,
           [emails],
@@ -7041,7 +7300,8 @@
         returnValue: _i17.Stream<_i10.User>.empty(),
       ) as _i17.Stream<_i10.User>);
   @override
-  _i17.Stream<_i10.PublicKey> listPublicKeys([String? userLogin]) => (super.noSuchMethod(
+  _i17.Stream<_i10.PublicKey> listPublicKeys([String? userLogin]) =>
+      (super.noSuchMethod(
         Invocation.method(
           #listPublicKeys,
           [userLogin],
@@ -7049,7 +7309,8 @@
         returnValue: _i17.Stream<_i10.PublicKey>.empty(),
       ) as _i17.Stream<_i10.PublicKey>);
   @override
-  _i17.Future<_i10.PublicKey> createPublicKey(_i10.CreatePublicKey? key) => (super.noSuchMethod(
+  _i17.Future<_i10.PublicKey> createPublicKey(_i10.CreatePublicKey? key) =>
+      (super.noSuchMethod(
         Invocation.method(
           #createPublicKey,
           [key],
@@ -7101,7 +7362,8 @@
         ),
       ) as _i20.Cache<_i27.Uint8List>);
   @override
-  _i20.Cache<S> withCodec<S>(_i16.Codec<S, _i27.Uint8List>? codec) => (super.noSuchMethod(
+  _i20.Cache<S> withCodec<S>(_i16.Codec<S, _i27.Uint8List>? codec) =>
+      (super.noSuchMethod(
         Invocation.method(
           #withCodec,
           [codec],
@@ -7152,6 +7414,11 @@
         returnValue: '',
       ) as String);
   @override
+  String get version => (super.noSuchMethod(
+        Invocation.getter(#version),
+        returnValue: '',
+      ) as String);
+  @override
   _i2.Client get client => (super.noSuchMethod(
         Invocation.getter(#client),
         returnValue: _FakeClient_0(
@@ -7313,7 +7580,7 @@
             #preview: preview,
           },
         ),
-        returnValue: _i39.postJsonShim<S, T>(
+        returnValue: _i40.postJsonShim<S, T>(
           path,
           statusCode: statusCode,
           fail: fail,
