diff --git a/github-label-notifier/Dockerfile b/github-label-notifier/Dockerfile
index 85e18a5..acf905d 100644
--- a/github-label-notifier/Dockerfile
+++ b/github-label-notifier/Dockerfile
@@ -5,7 +5,6 @@
 # Resolve app dependencies.
 WORKDIR /app
 COPY functions/pubspec.* functions/
-COPY symbolizer symbolizer
 WORKDIR /app/functions
 RUN dart pub get
 
diff --git a/github-label-notifier/functions/bin/server.dart b/github-label-notifier/functions/bin/server.dart
index 05e4c47..6aca044 100644
--- a/github-label-notifier/functions/bin/server.dart
+++ b/github-label-notifier/functions/bin/server.dart
@@ -10,9 +10,6 @@
 import 'package:sendgrid_mailer/sendgrid_mailer.dart' as sendgrid;
 import 'package:shelf/shelf.dart';
 import 'package:shelf_router/shelf_router.dart';
-import 'package:symbolizer/model.dart';
-import 'package:symbolizer/parser.dart';
-import 'package:symbolizer/bot.dart';
 
 import 'package:github_label_notifier/github_utils.dart';
 import 'package:github_label_notifier/redirecting_http.dart';
@@ -178,19 +175,13 @@
 /// The handler will search the body of the open issue for specific keywords
 /// and send emails to all subscribers to a specific label.
 Future<void> onIssueOpened(Map<String, dynamic> event) async {
-  SymbolizationResult? symbolizedCrashes;
-
   final repositoryName = event['repository']['full_name'];
   print("opened issue $repositoryName");
   final subscription = await db.lookupKeywordSubscription(repositoryName);
   if (subscription == null) return;
-  if (subscription.keywords.contains('crash') &&
-      containsCrash(event['issue']['body'])) {
-    symbolizedCrashes = await _trySymbolize(event['issue']);
-  }
 
-  final match = (symbolizedCrashes is SymbolizationResultOk &&
-          symbolizedCrashes.results.isNotEmpty)
+  final match = (subscription.keywords.contains('crash') &&
+          _containsCrash(event['issue']['body']))
       ? 'crash'
       : subscription.match(event['issue']['body']);
   if (match == null) {
@@ -210,51 +201,6 @@
 
   final escape = htmlEscape.convert;
 
-  final symbolizedCrashesText = symbolizedCrashes
-          ?.when(
-              ok: (results) {
-                return [
-                  '',
-                  ...results.expand((r) => [
-                        if (r.symbolized != null)
-                          '# engine ${r.engineBuild!.engineHash} ${r.engineBuild!.variant.pretty} crash'
-                        else
-                          '# engine crash',
-                        for (var note in r.notes)
-                          if (note.message != null)
-                            '# ${noteMessage[note.kind]}: ${note.message}'
-                          else
-                            '# ${noteMessage[note.kind]}',
-                        r.symbolized ?? r.crash.frames.toString(),
-                      ]),
-                  ''
-                ];
-              },
-              error: (note) => null)
-          ?.join('\n') ??
-      '';
-
-  final symbolizedCrashesHtml = symbolizedCrashes
-          ?.when(
-            ok: (results) {
-              return results.expand((r) => [
-                    if (r.symbolized != null)
-                      '<p>engine ${r.engineBuild!.engineHash} ${r.engineBuild!.variant.pretty} crash</p>'
-                    else
-                      '<p>engine crash</p>',
-                    for (var note in r.notes)
-                      if (note.message != null)
-                        '<em>${noteMessage[note.kind]}: <pre>${escape(note.message!)}</pre></em>'
-                      else
-                        '<em>${noteMessage[note.kind]}</em>',
-                    '<pre>${escape(r.symbolized ?? r.crash.frames.toString())}</pre>',
-                  ]);
-            },
-            error: (note) => null,
-          )
-          ?.join('') ??
-      '';
-
   final personalizations = [
     for (final to in subscribers)
       sendgrid.Personalization([sendgrid.Address(to)])
@@ -270,7 +216,7 @@
 Reported by $issueReporterUsername
 
 Matches keyword: $match
-$symbolizedCrashesText
+
 You are getting this mail because you are subscribed to label ${subscription.label}.
 --
 Sent by dart-github-label-notifier.web.app
@@ -279,7 +225,6 @@
 <p><strong><a href="$issueUrl">${escape(issueTitle)}</a>&nbsp;(${escape(repositoryName)}#${escape(issueNumber.toString())})</strong></p>
 <p>Reported by <a href="$issueReporterUrl">${escape(issueReporterUsername)}</a></p>
 <p>Matches keyword: <b>$match</b></p>
-$symbolizedCrashesHtml
 <p>You are getting this mail because you are subscribed to label ${subscription.label}</p>
 <hr>
 <p>Sent by <a href="https://dart-github-label-notifier.web.app/">GitHub Label Notifier</a></p>
@@ -292,18 +237,7 @@
 }
 
 Future<void> onIssueCommentCreated(Map<String, dynamic> event) async {
-  final body = event['comment']['body'];
-
-  if (Bot.isCommand(body)) {
-    final response = await http.post(
-      Uri.http(symbolizerServer, 'command'),
-      body: jsonEncode(event),
-    );
-    if (response.statusCode != HttpStatus.ok) {
-      throw WebHookError(HttpStatus.internalServerError,
-          'Failed to process ${event['comment']['html_url']}: ${response.body}');
-    }
-  }
+  // Do nothing.
 }
 
 class WebHookError {
@@ -324,23 +258,6 @@
           HttpStatus.badRequest, 'Missing $header header value.'));
 }
 
-Future<SymbolizationResult> _trySymbolize(Map<String, dynamic> body) async {
-  try {
-    final response = await http
-        .post(
-          Uri.http(symbolizerServer, 'symbolize'),
-          body: jsonEncode(body),
-        )
-        .timeout(const Duration(seconds: 20));
-    return SymbolizationResult.fromJson(jsonDecode(response.body));
-  } catch (e, st) {
-    return SymbolizationResult.error(
-        error: SymbolizationNote(
-            kind: SymbolizationNoteKind.exceptionWhileSymbolizing,
-            message: '$e\n$st'));
-  }
-}
-
 Future<http.Response> Function(Uri url,
     {Object? body,
     Encoding? encoding,
@@ -351,3 +268,14 @@
     return http.post(newUrl, body: body, encoding: encoding, headers: headers);
   };
 }
+
+final _androidCrashMarker =
+    '*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***';
+
+final _iosCrashMarker = RegExp(
+    r'(Incident Identifier:\s+([A-F0-9]+-?)+)|(Exception Type:\s+EXC_CRASH)');
+
+/// Returns [true] if the given text is likely to contain a crash.
+bool _containsCrash(String text) {
+  return text.contains(_androidCrashMarker) || text.contains(_iosCrashMarker);
+}
diff --git a/github-label-notifier/functions/pubspec.lock b/github-label-notifier/functions/pubspec.lock
index 4de53d9..5ad9575 100644
--- a/github-label-notifier/functions/pubspec.lock
+++ b/github-label-notifier/functions/pubspec.lock
@@ -13,18 +13,18 @@
     dependency: transitive
     description:
       name: _fe_analyzer_shared
-      sha256: "0816708f5fbcacca324d811297153fe3c8e047beb5c6752e12292d2974c17045"
+      sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051
       url: "https://pub.dev"
     source: hosted
-    version: "62.0.0"
+    version: "64.0.0"
   analyzer:
     dependency: transitive
     description:
       name: analyzer
-      sha256: "21862995c9932cd082f89d72ae5f5e2c110d1a0204ad06e4ebaee8307b76b834"
+      sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893"
       url: "https://pub.dev"
     source: hosted
-    version: "6.0.0"
+    version: "6.2.0"
   args:
     dependency: transitive
     description:
@@ -33,14 +33,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "2.4.2"
-  asn1lib:
-    dependency: transitive
-    description:
-      name: asn1lib
-      sha256: b74e3842a52c61f8819a1ec8444b4de5419b41a7465e69d4aa681445377398b0
-      url: "https://pub.dev"
-    source: hosted
-    version: "1.4.1"
   async:
     dependency: "direct main"
     description:
@@ -73,14 +65,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "3.1.1"
-  corsac_jwt:
-    dependency: transitive
-    description:
-      name: corsac_jwt
-      sha256: f86d1a1ad7d4db5727ae5d68dfd4437cbcf62daabe920190fcd5425457f5f377
-      url: "https://pub.dev"
-    source: hosted
-    version: "1.0.0-nullsafety.1"
   coverage:
     dependency: transitive
     description:
@@ -97,14 +81,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "3.0.3"
-  dart_internal:
-    dependency: transitive
-    description:
-      name: dart_internal
-      sha256: dae3976f383beddcfcd07ad5291a422df2c8c0a8a03c52cda63ac7b4f26e0f4e
-      url: "https://pub.dev"
-    source: hosted
-    version: "0.2.8"
   file:
     dependency: transitive
     description:
@@ -113,14 +89,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "7.0.0"
-  freezed_annotation:
-    dependency: transitive
-    description:
-      name: freezed_annotation
-      sha256: aeac15850ef1b38ee368d4c53ba9a847e900bb2c53a4db3f6881cbb3cb684338
-      url: "https://pub.dev"
-    source: hosted
-    version: "2.2.0"
   frontend_server_client:
     dependency: transitive
     description:
@@ -137,14 +105,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "0.1.1"
-  github:
-    dependency: transitive
-    description:
-      name: github
-      sha256: "5640619ae3780877fe62b7837b41343350acc845c528f7b339c34c60745f2cdd"
-      url: "https://pub.dev"
-    source: hosted
-    version: "9.15.1"
   glob:
     dependency: transitive
     description:
@@ -217,14 +177,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "0.6.7"
-  json_annotation:
-    dependency: transitive
-    description:
-      name: json_annotation
-      sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
-      url: "https://pub.dev"
-    source: hosted
-    version: "4.8.1"
   lints:
     dependency: "direct dev"
     description:
@@ -289,22 +241,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "1.8.3"
-  pedantic:
-    dependency: transitive
-    description:
-      name: pedantic
-      sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602"
-      url: "https://pub.dev"
-    source: hosted
-    version: "1.11.1"
-  pointycastle:
-    dependency: transitive
-    description:
-      name: pointycastle
-      sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
-      url: "https://pub.dev"
-    source: hosted
-    version: "3.7.3"
   pool:
     dependency: transitive
     description:
@@ -321,14 +257,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "2.1.4"
-  rsa_pkcs:
-    dependency: transitive
-    description:
-      name: rsa_pkcs
-      sha256: "17a52b0c010319f0d4c7bcc635eb89e2efeaec44975b3fb45f850b350a2b0513"
-      url: "https://pub.dev"
-    source: hosted
-    version: "2.0.1"
   sendgrid_mailer:
     dependency: "direct main"
     description:
@@ -425,13 +353,6 @@
       url: "https://pub.dev"
     source: hosted
     version: "1.2.0"
-  symbolizer:
-    dependency: "direct main"
-    description:
-      path: "../symbolizer"
-      relative: true
-    source: path
-    version: "0.0.1"
   term_glyph:
     dependency: transitive
     description:
@@ -513,4 +434,4 @@
     source: hosted
     version: "3.1.2"
 sdks:
-  dart: ">=3.0.0 <3.2.0"
+  dart: ">=3.0.0 <4.0.0"
diff --git a/github-label-notifier/functions/pubspec.yaml b/github-label-notifier/functions/pubspec.yaml
index 3f1138f..ebbd60e 100644
--- a/github-label-notifier/functions/pubspec.yaml
+++ b/github-label-notifier/functions/pubspec.yaml
@@ -20,8 +20,6 @@
   shelf: ^1.4.0
   shelf_router: ^1.1.3
   test: any
-  symbolizer:
-    path: ../symbolizer
 
 dev_dependencies:
   lints: ^2.0.1
diff --git a/github-label-notifier/functions/test/integration_test.dart b/github-label-notifier/functions/test/integration_test.dart
index 453e62d..851d74c 100644
--- a/github-label-notifier/functions/test/integration_test.dart
+++ b/github-label-notifier/functions/test/integration_test.dart
@@ -8,7 +8,6 @@
 
 import 'package:googleapis/firestore/v1.dart';
 import 'package:sendgrid_mailer/sendgrid_mailer.dart';
-import 'package:symbolizer/model.dart';
 import 'package:test/test.dart';
 
 import 'package:github_label_notifier/firestore_helpers.dart';
@@ -54,83 +53,6 @@
   return server;
 }
 
-Future<HttpServer> createSymbolizerServer(List<String> commandLog) async {
-  // Start mock Symbolizer server at the address/port specified in
-  // SYMBOLIZER_SERVER environment variable.
-  final serverAddress = Platform.environment['SYMBOLIZER_SERVER'];
-  if (serverAddress == null) {
-    throw 'SENDGRID_MOCK_SERVER environment variable is not set';
-  }
-  final serverUri = Uri.parse('http://$serverAddress');
-  final server = await HttpServer.bind(serverUri.host, serverUri.port);
-  server.listen((request) async {
-    final body = await utf8.decodeStream(request);
-    switch (request.requestedUri.path) {
-      case '/symbolize':
-        // Reply with symbolized crash.
-        SymbolizationResult result;
-        print(body);
-        if (body.contains('TRIGGER_SYMBOLIZATION_ERROR')) {
-          result = SymbolizationResult.error(
-            error: SymbolizationNote(
-                kind: SymbolizationNoteKind.exceptionWhileParsing,
-                message: 'some detailed error'),
-          );
-        } else {
-          result = SymbolizationResult.ok(results: [
-            CrashSymbolizationResult(
-                crash: Crash(
-                    engineVariant:
-                        EngineVariant(arch: 'arm', os: 'ios', mode: 'debug'),
-                    format: 'native',
-                    frames: [
-                      CrashFrame.ios(
-                        no: '00',
-                        binary: 'BINARY',
-                        pc: 0x10042,
-                        symbol: '0x',
-                        offset: 42,
-                        location: '',
-                      )
-                    ]),
-                engineBuild: EngineBuild(
-                  engineHash: 'aaabbb',
-                  variant: EngineVariant(arch: 'arm', os: 'ios', mode: 'debug'),
-                ),
-                symbolized: 'SYMBOLIZED_STACK_HERE')
-          ]);
-        }
-        await (request.response
-              ..statusCode = HttpStatus.ok
-              ..reasonPhrase = 'OK'
-              ..headers.contentType = ContentType.text
-              ..write(jsonEncode(result)))
-            .close();
-        break;
-      case '/command':
-        commandLog.add(jsonDecode(body)['comment']['body']);
-
-        // Reply with 200 OK.
-        await (request.response
-              ..statusCode = HttpStatus.ok
-              ..reasonPhrase = 'OK'
-              ..headers.contentType = ContentType.text
-              ..write('OK'))
-            .close();
-        break;
-      default: // Reply with 404.
-        await (request.response
-              ..statusCode = HttpStatus.notFound
-              ..reasonPhrase = 'Not Found'
-              ..headers.contentType = ContentType.text
-              ..write('Not Found'))
-            .close();
-        break;
-    }
-  });
-  return server;
-}
-
 void main() async {
   if (!Platform.environment.containsKey('FIRESTORE_EMULATOR_HOST')) {
     throw 'This test must run in an emulated environment via test.sh script';
@@ -204,7 +126,6 @@
         '$keywordDatabase/dart-lang\$webhook-test');
 
     sendgridMockServer = await createSendgridMockServer(sendgridRequests);
-    symbolizerServer = await createSymbolizerServer(symbolizerCommands);
     createGithubLabelNotifier();
   });
 
@@ -216,9 +137,6 @@
   tearDownAll(() async {
     // Shutdown the mock SendGrid server.
     await sendgridMockServer.close();
-
-    // Shutdown the mock symbolizer.
-    await symbolizerServer.close();
   });
 
   // Helper to send a mock GitHub event to the locally running instance of the
@@ -473,35 +391,10 @@
     expect(rs.statusCode, equals(HttpStatus.ok));
     expect(sendgridRequests.length, equals(1));
     final request = sendgridRequests.first;
-    final plainTextBody = request.body['content']
-        .firstWhere((c) => c['type'] == 'text/plain')['value'];
-    expect(plainTextBody, contains('engine aaabbb ios-arm-debug crash'));
-    expect(plainTextBody, contains('SYMBOLIZED_STACK_HERE'));
-  });
-
-  test('ok - issue opened - crash - error during symbolization', () async {
-    final rs = await sendEvent(body: makeIssueOpenedEvent(body: '''
-I had Flutter engine c_r_a_s_h on me with the following message
-
-*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
-Such c_r_a_s_h
-Much information
-TRIGGER_SYMBOLIZATION_ERROR
-'''));
-    expect(rs.statusCode, equals(HttpStatus.ok));
-    expect(sendgridRequests.length, equals(0));
-  });
-
-  test('ok - issue comment - forward bot command', () async {
-    final command = '''@flutter-symbolizer-bot aaa bbb''';
-    final rs = await sendEvent(
-        event: 'issue_comment',
-        body: makeIssueCommentEvent(
-          commentBody: command,
-          authorAssociation: 'MEMBER',
-        ));
-    expect(rs.statusCode, equals(HttpStatus.ok));
-    expect(symbolizerCommands, equals([command]));
+    expect(
+        request.body['content']
+            .firstWhere((c) => c['type'] == 'text/plain')['value'],
+        contains('Matches keyword: crash'));
   });
 }
 
diff --git a/github-label-notifier/symbolizer/README-bot.md b/github-label-notifier/symbolizer/README-bot.md
deleted file mode 100644
index 277a8b3..0000000
--- a/github-label-notifier/symbolizer/README-bot.md
+++ /dev/null
@@ -1,110 +0,0 @@
-<!--
-This is flutter-symbolizer-bot README file. If you are making changes to
-this file update https://github.com/flutter-symbolizer-bot/flutter-symbolizer-bot/blob/main/README.md
-as well
--->
-
-### Hi there 👋
-
-I am a bot that can symbolize Flutter Engine crashes. If you have any bug
-reports or questions contact @mraleph
-
-👉 **I only answer to commands of public members of Flutter GitHub org!** To
-check whether your membership is public just open your profile in Incognito
-Window and check if Flutter org badge is visible. Read more about org membership
-privacy settings [here](https://docs.github.com/en/free-pro-team@latest/github/setting-up-and-managing-your-github-user-account/publicizing-or-hiding-organization-membership).
-
-I can automatically detect the following crashes:
-
-- Android crashes marked with `*** *** *** ... *** *** ***` line.
-- iOS crashes starting with `Incident Identifier: ...` line.
-
-For symbolization I would need to know engine commit hash and build mode. I
-support extracting engine version from `flutter doctor` output (with or
-without `-v`) and I can sometimes guess build mode (e.g. by using `Build ID`
-included into stack traces on Android).
-
-However often reports don't include all required information or don't use native
-format so you would need to provide me with additional hints, see
-[Commands](#commands) below.
-
-### Commands
-
-When you mention me in the comment you can include a number of
-_symbolization overrides_ which would fill in the gaps in information for me.
-
-```
-@flutter-symbolizer-bot [engine#<sha>|flutter#<commit>] [profile|release|debug] [x86|arm|arm64|x64]
-```
-
-**Important ⚠️**: `@flutter-symbolizer-bot` **MUST** be the very first thing
-in your comment.
-
-- `engine#<sha>` allows to specify which _engine commit_ I should use;
-- `flutter#<commit>` allows to specify which Flutter Framework commit I
-  should use (this is just another way of specifiying engine commit);
-- `profile|release|debug` tells me which _build mode_ I should use (iOS builds
-  only have `release` symbols available though);
-- `x86|arm|arm64|x64` tells me which _architecture_ I should use.
-
-You can point me to a specific comment by including the link to it:
-
-```
-@flutter-symbolizer-bot [link|this]
-```
-
-- `link`, which looks like
-  `https://github.com/flutter/flutter/issues/ISSUE#issue(comment)?-ID`, asks me
-   to look for crashes in the specific comment;
-- `this` asks me to symbolize content of
-  _the comment which contains the command_.
-
-If your backtrace comes from Crashlytics with lines that look like this:
-
-```
-4  Flutter                        0x106013134 (Missing)
-```
-
-You would need to tell me `@flutter-symbolizer-bot force ios [arm64|arm] [engine#<sha>|flutter#<commit>] link|this`:
-
-- `force ios` tells me to ignore native crash markers and simply look for lines
-  that match `ios` backtrace format;
-- `[arm64|arm]` gives me information about architecture, which is otherwise
-  missing from the report;
-- `engine#sha|flutter#commit` gives me engine version;
-- `link|this` specifies which comment to symbolize. Note ⚠️: because this is a
-  departure from native crash report formats you *must* tell me which comment
-  to symbolize manually
-
-If your backtrace has lines that look like this:
-
-```
-0x0000000105340708(Flutter + 0x002b4708)
-```
-
-You would need to tell me `@flutter-symbolizer-bot internal [arm64|arm] [engine#<sha>|flutter#<commit>] link|this`:
-
-- `internal` tells me to ignore native crash markers and look for lines that
-  match _internal_ backtrace format.
-
-### Note about Relative PCs
-
-To symbolize stack trace correctly I need to know PC relative to binary image
-load base. Native crash formats usually include this information:
-
-- On Android `pc` column actually contains relative PCs rather then absolute.
-  Though Android versions prior to Android 11 have issues with their unwinder
-  which makes these relative PCs skewed in different ways (see
-  [this bug](https://github.com/android/ndk/issues/1366) for more information).
-  I try my best to correct for these known issues;
-- On iOS I am looking for lines like this `Flutter + <rel-pc>` which gives me
-  necessary information.
-
-Some crash formats (Crashlytics) do not contain neither load base nor relative
-PCs. In this case I try to determine load base heuristically based on the set
-of return addresses available in the backtrace: I look through Flutter Engine
-binary for all call sites and then iterate through potential load bases to see
-if one of them makes all of PCs present in the backtrace fall onto callsites.
-The pattern of call sites in the binary is often unique enough for me to be
-able to determine a single possible load base based on 3-4 unique return
-addresses.
\ No newline at end of file
diff --git a/github-label-notifier/symbolizer/README.md b/github-label-notifier/symbolizer/README.md
index ea09771..f954c20 100644
--- a/github-label-notifier/symbolizer/README.md
+++ b/github-label-notifier/symbolizer/README.md
@@ -1,21 +1,81 @@
 This folder contains implementation of symbolization tooling capable of
-extracting Android and iOS crashes from plain text comments on GitHub and
-then automatically symbolize these crash reports using Flutter Engine symbols
-stored in the Cloud Storage.
+extracting Android and iOS crashes from plain text comments on GitHub or
+from local text files and then automatically symbolize these crash reports
+using Flutter Engine symbols stored in the Cloud Storage.
 
-# `bin/server.dart`
+# Using this locally
 
-Server exposing simple HTTP API to this functionality. It has two endpoints:
+```
+$ dart pub global activate -sgit https://github.com/dart-lang/dart_ci.git --git-path github-label-notifier/symbolizer/
+$ dart pub global run symbolizer:symbolize <file-or-uri> ["overrides"]
+$ dart pub global run symbolizer:symbolize --help
+```
 
-- `POST /symbolize` with GitHub's `issue` JSON payload runs symbolization on the
-  issue's body and returns result as a JSON serialized list of
-  `SymbolizationResult`.
-- `POST /command` with GitHub's [`issue_comment`](https://docs.github.com/en/free-pro-team@latest/developers/webhooks-and-events/webhook-events-and-payloads#issue_comment)
-  payload executes the given comment as a bot command (if it represents one).
+# Symbolization overrides
 
-Note: the server itself does not listen to GitHub events - instead there is a
-Cloud Function exposed as a GitHub WebHook which routes relevant
-`issue_comment` events to it.
+Not all information might be available in the stack trace itself. In this case
+_symbolization overrides_ can be used to fill in gaps. They have the following
+format:
+
+```
+[engine#<sha>|flutter#<commit>] [profile|release|debug] [x86|arm|arm64|x64]
+```
+
+- `engine#<sha>` - use symbols for specific _engine commit_;
+- `flutter#<commit>` use symbols for specific Flutter Framework commit
+  (this is just another way of specifiying engine commit);
+- `profile|release|debug` use symbols for specific _build mode_ (iOS builds
+  only have `release` symbols available though);
+- `x86|arm|arm64|x64` use symbols for specific _architecture_.
+
+If your backtrace comes from Crashlytics with lines that look like this:
+
+```
+4  Flutter                        0x106013134 (Missing)
+```
+
+You would need to use `force ios [arm64|arm] [engine#<sha>|flutter#<commit>]`
+overrides:
+
+- `force ios` instructs tooling to ignore native crash markers and simply look
+  for lines that match `ios` backtrace format;
+- `[arm64|arm]` gives information about architecture, which is otherwise
+  missing from the report;
+- `engine#sha|flutter#commit` gives engine version;
+
+If your backtrace has lines that look like this:
+
+```
+0x0000000105340708(Flutter + 0x002b4708)
+```
+
+You would need to use `internal [arm64|arm] [engine#<sha>|flutter#<commit>]`
+overrides:
+
+- `internal` instructs tooling to ignore native crash markers and look for
+  lines that match this special _internal_ backtrace format.
+
+### Note about Relative PCs
+
+To symbolize stack trace correctly symbolizer needs to know PC relative to
+binary image load base. Native crash formats usually include this information:
+
+- On Android `pc` column actually contains relative PCs rather then absolute.
+  Though Android versions prior to Android 11 have issues with their unwinder
+  which makes these relative PCs skewed in different ways (see
+  [this bug](https://github.com/android/ndk/issues/1366) for more information).
+  This package tries best to correct for these known issues;
+- On iOS crash parser is looking for lines like this `Flutter + <rel-pc>`
+  which gives it necessary information.
+
+Some crash formats (Crashlytics) do not contain neither load base nor relative
+PCs. In this case symbolizer will try to determine load base heuristically
+based on the set of return addresses available in the backtrace: it will look
+through Flutter Engine binary for all call sites and then iterate through
+potential load bases to see if one of them makes all of PCs present in the
+backtrace fall onto callsites. The pattern of call sites in the binary is often
+unique enough for the symbolizer to be able to determine a single possible load
+base based on 3-4 unique return addresses.
 
 # Scripts
 
@@ -26,30 +86,17 @@
 you don't hit GitHub's API quota limits for unauthorized users.
 
 ```console
-$ bin/configure.dart --github-token ... --sendgrid-token ... --failure-email ...
+$ bin/configure.dart --github-token ...
 ```
 
-## `bin/command.dart`
-
-```console
-$ bin/command.dart [--act] <issue-number> 'keywords*'
-```
-
-Execute the given string of keywords as a `@flutter-symbolizer-bot` command in
-context of the issue with the given `issue-number` number.
-
-By default would simply print `@flutter-symbolizer-bot` response to stdout.
-
-If `--act` is passed then bot would actually post a comment with its response
-to the issue using GitHub OAuth token from `.config.json`.
-
 ## `bin/symbolize.dart`
 
 ```console
-$ bin/symbolize.dart <input-file> 'keywords*'
+$ bin/symbolize.dart <input-file|URI> 'keywords*'
 ```
 
-Symbolize contents of the given file using overrides specified through keywords.
+Symbolize contents of the given file or GitHub comment or issue using overrides
+specified through keywords.
 
 # Development
 
@@ -61,7 +108,7 @@
 Run `bin/configure.dart` to create `.config.json`.
 
 ```
-bin/configure.dart --github-token ... --sendgrid-token ... --failure-email ...
+bin/configure.dart --github-token ...
 ```
 
 ## NDK tooling
@@ -80,13 +127,13 @@
 `model.dart` run:
 
 ```console
-$ pub run build_runner build
+$ dart run build_runner build
 ```
 
 # Testing
 
 ```console
-$ pub run test -j1 --no-chain-stack-traces
+$ dart test test -j1 --no-chain-stack-traces
 ```
 
 - `-j1` is needed to avoid racy access to symbols cache from multiple
@@ -97,24 +144,6 @@
 To update expectation files set `REGENERATE_EXPECTATIONS` environment
 variable to `true` (`export REGENERATE_EXPECTATIONS=true`).
 
-# Deployment
-
-Bot is running on `crash-symbolizer` Compute Engine instance and is kept
-alive by `superviserd`. The GCE instance is not directly reachable from
-the outside world. To deploy a new version run:
-
-```console
-$ GITHUB_TOKEN=... SENDGRID_TOKEN=... FAILURE_EMAIL=... ./deploy.sh
-```
-
-- `GITHUB_TOKEN` provides OAuth token for `flutter-symbolizer-bot` account;
-- `SENDGRID_TOKEN` provides SendGrid API token
-- `FAILURE_EMAIL` configures email that bot should report exceptions to.
-- Under certain conditions your machine might not be able to connect to
-  GCE instance. In this case you will need to proxy your deployment through
-  another machine that *can* connect to the instance. You can specify
-  this "proxy" machine via `DEPLOYMENT_PROXY`.
-
 ## SDK version
 
 We deploy the code in form of Kernel binary - which means your local SDK
diff --git a/github-label-notifier/symbolizer/bin/command.dart b/github-label-notifier/symbolizer/bin/command.dart
deleted file mode 100755
index 008d681..0000000
--- a/github-label-notifier/symbolizer/bin/command.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:github/github.dart';
-import 'package:logging/logging.dart';
-import 'package:sendgrid_mailer/sendgrid_mailer.dart';
-import 'package:symbolizer/bot.dart';
-import 'package:symbolizer/config.dart';
-import 'package:symbolizer/ndk.dart';
-import 'package:symbolizer/symbolizer.dart';
-import 'package:symbolizer/symbols.dart';
-
-const isDev = bool.fromEnvironment('DEV');
-
-final bindHostname = isDev
-    ? InternetAddress.loopbackIPv4
-    : 'crash-symbolizer.c.dart-ci.internal';
-
-final log = Logger('server');
-
-final config = loadConfigFromFile();
-
-final argParser = ArgParser(allowTrailingOptions: false)
-  ..addFlag(
-    'act',
-    help: 'Post comment on GitHub (by default '
-        'results are printed into stdout instead)',
-    negatable: false,
-    defaultsTo: false,
-  );
-
-Future<void> main(List<String> args) async {
-  final opts = argParser.parse(args);
-  if (opts.rest.length != 2) {
-    print('''Usage: command.dart [--act] <issue-number> <command>
-${argParser.usage}''');
-    exit(1);
-  }
-  final issueNumber = int.parse(opts.rest[0]);
-  final command = opts.rest[1];
-
-  Logger.root.level = Level.ALL;
-  Logger.root.onRecord.listen((record) {
-    print('${record.level.name}: ${record.time}: ${record.message}');
-  });
-
-  final mailer = Mailer(config.sendgridToken);
-  final ndk = Ndk();
-  final symbols = SymbolsCache(path: 'symbols-cache', ndk: ndk);
-  final github = GitHub(auth: Authentication.withToken(config.githubToken));
-
-  final symbolizer = Symbolizer(symbols: symbols, ndk: ndk, github: github);
-  final bot = Bot(
-    github: github,
-    symbolizer: symbolizer,
-    mailer: mailer,
-    failuresEmail: config.failureEmail,
-    dryRun: !opts['act'],
-  );
-
-  final repo = RepositorySlug('flutter', 'flutter');
-  await bot.executeCommand(
-    repo,
-    await github.issues.get(repo, issueNumber),
-    IssueComment(
-        body: '${Bot.accountMention} $command',
-        user: User(
-          login: Platform.environment['USER'],
-        )),
-    authorized: true,
-  );
-  github.dispose();
-}
diff --git a/github-label-notifier/symbolizer/bin/configure.dart b/github-label-notifier/symbolizer/bin/configure.dart
index 272de25..341c55f 100755
--- a/github-label-notifier/symbolizer/bin/configure.dart
+++ b/github-label-notifier/symbolizer/bin/configure.dart
@@ -13,17 +13,11 @@
   ..addOption('github-token',
       help: 'GitHub OAuth token',
       defaultsTo: Platform.environment['GITHUB_TOKEN'])
-  ..addOption('sendgrid-token',
-      help: 'SendGrid API token',
-      defaultsTo: Platform.environment['SENDGRID_TOKEN'])
-  ..addOption('failure-email',
-      help: 'Email for failure reports',
-      defaultsTo: Platform.environment['FAILURE_EMAIL'])
   ..addOption('output', help: 'Config to write', defaultsTo: '.config.json');
 
 void main(List<String> args) {
   final opts = parser.parse(args);
-  for (var opt in ['github-token', 'sendgrid-token', 'failure-email']) {
+  for (var opt in ['github-token']) {
     if (opts[opt].isEmpty) {
       throw 'Pass non-empty value via --$opt or through'
           ' ${opt.toUpperCase().replaceAll('-', '_')} environment variable';
@@ -32,8 +26,6 @@
 
   final config = ServerConfig(
     githubToken: opts['github-token'],
-    sendgridToken: opts['sendgrid-token'],
-    failureEmail: opts['failure-email'],
   );
   File(opts['output']).writeAsStringSync(jsonEncode(config));
 }
diff --git a/github-label-notifier/symbolizer/bin/server.dart b/github-label-notifier/symbolizer/bin/server.dart
deleted file mode 100755
index 050e622..0000000
--- a/github-label-notifier/symbolizer/bin/server.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:github/github.dart';
-import 'package:logging/logging.dart';
-import 'package:sendgrid_mailer/sendgrid_mailer.dart';
-import 'package:symbolizer/bot.dart';
-import 'package:symbolizer/config.dart';
-import 'package:symbolizer/ndk.dart';
-import 'package:symbolizer/symbolizer.dart';
-import 'package:symbolizer/symbols.dart';
-import 'package:symbolizer/server.dart';
-
-const isDev = bool.fromEnvironment('DEV');
-
-final bindHostname = isDev
-    ? InternetAddress.loopbackIPv4
-    : 'crash-symbolizer.c.dart-ci.internal';
-
-final log = Logger('server');
-
-final config = loadConfigFromFile();
-
-Future<void> main() async {
-  Logger.root.level = Level.ALL;
-  Logger.root.onRecord.listen((record) {
-    print('${record.level.name}: ${record.time}: ${record.message}');
-  });
-
-  final mailer = Mailer(config.sendgridToken);
-  final ndk = Ndk();
-  final symbols = SymbolsCache(path: 'symbols-cache', ndk: ndk);
-  final github = GitHub(auth: Authentication.withToken(config.githubToken));
-
-  final symbolizer = Symbolizer(symbols: symbols, ndk: ndk, github: github);
-  final bot = Bot(
-      github: github,
-      symbolizer: symbolizer,
-      mailer: mailer,
-      failuresEmail: config.failureEmail);
-
-  await serve(
-    bindHostname,
-    4040,
-    symbolizer: symbolizer,
-    bot: bot,
-  );
-}
diff --git a/github-label-notifier/symbolizer/bin/symbolize.dart b/github-label-notifier/symbolizer/bin/symbolize.dart
index 36911e4..df1669a 100755
--- a/github-label-notifier/symbolizer/bin/symbolize.dart
+++ b/github-label-notifier/symbolizer/bin/symbolize.dart
@@ -5,41 +5,218 @@
 
 /// Primitive CLI for the symbolizer. Usage:
 ///
-///    symbolize <input-file> [overrides]
+///    symbolize <input-file>|<github-uri> [overrides]
 ///
 
 import 'dart:io';
 
+import 'package:ansicolor/ansicolor.dart';
 import 'package:github/github.dart';
 import 'package:logging/logging.dart';
-import 'package:symbolizer/config.dart';
+import 'package:path/path.dart' as p;
+
+import 'package:symbolizer/model.dart';
 import 'package:symbolizer/ndk.dart';
 import 'package:symbolizer/symbolizer.dart';
 import 'package:symbolizer/symbols.dart';
-import 'package:symbolizer/bot.dart';
 
-final config = loadConfigFromFile();
+final githubIssueUriRe = RegExp(
+    r'https://github.com/(?<org>[-\w]+)/(?<repo>[-\w]+)/issues/(?<issue>\d+)(?<anchor>#issue(comment)?-\d+)?');
+
+Future<String> loadContent(GitHub github, String resource) async {
+  final match = githubIssueUriRe.firstMatch(resource);
+  if (match != null) {
+    final orgName = match.namedGroup('org')!;
+    final repoName = match.namedGroup('repo')!;
+    final issueNumber = int.parse(match.namedGroup('issue')!);
+    final anchor = match.namedGroup('anchor');
+
+    final int? commentId;
+    if (anchor != null && anchor.startsWith('#issuecomment-')) {
+      commentId = int.parse(anchor.split('-').last);
+    } else {
+      commentId = null;
+    }
+
+    final slug = RepositorySlug(orgName, repoName);
+    if (commentId != null) {
+      final comment = await github.issues.getComment(slug, commentId);
+      return comment.body ?? '';
+    } else {
+      final issue = await github.issues.get(slug, issueNumber);
+      return issue.body;
+    }
+  } else {
+    return File(resource).readAsString();
+  }
+}
 
 void main(List<String> args) async {
+  if (args.isEmpty ||
+      args.length > 2 ||
+      args.contains('-h') ||
+      args.contains('--help')) {
+    print('''
+Usage: symbolize <file-or-uri> ["<overrides>"]
+
+file-or-uri can be either a path to the local text file or a URI
+pointing to an issue or an issue comment on GitHub.
+
+Supported URI formats:
+* https://github.com/<org>/<repo>/issues/<issuenum>
+* https://github.com/<org>/<repo>/issues/<issuenum>#issue-<id>
+* https://github.com/<org>/<repo>/issues/<issuenum>#issuecomment-<id>
+
+Overrides argument can contain the following components:
+
+* engine#<sha> - use specific engine commit
+* flutter#<commit> - use specific flutter commit
+* profile|release|debug - use specific build mode
+* x86|arm|arm64|x64 - use specific engine architecture
+
+Additionally you can specify:
+
+* force ios - force symbolization of partial Mac OS / iOS / Crashlytics
+              reports which don't contain all necessary markers. This
+              forces symbolizer to look for frames like this:
+
+              4  Flutter                        0x106013134 (Missing)
+
+* internal - force symbolization of stacks which look like:
+
+             0x0000000105340708(Flutter + 0x002b4708)
+''');
+    exit(1);
+  }
+
   Logger.root.level = Level.ALL;
   Logger.root.onRecord.listen((record) {
     print('${record.level.name}: ${record.time}: ${record.message}');
   });
 
-  final ndk = Ndk();
-  final symbols = SymbolsCache(path: 'symbols-cache', ndk: ndk);
+  final llvmTools = LlvmTools.findTools();
+  if (llvmTools == null) {
+    print('''
+Failed to locate LLVM tools (llvm-{symbolizer,readobj,objdump}).
+
+Either install them globally so that they are available in the \$PATH or
+install Android NDK.
+''');
+    exit(1);
+  }
+
+  final ndk = Ndk(llvmTools: llvmTools);
+  final symbols = SymbolsCache(
+      path: p.join(Directory.systemTemp.path, 'symbols-cache'), ndk: ndk);
   final github = GitHub();
 
   final symbolizer = Symbolizer(symbols: symbols, ndk: ndk, github: github);
-  final input = File(args.first).readAsStringSync();
-
-  final command = args.length >= 2
-      ? Bot.parseCommand(0, '${Bot.accountMention} ${args.skip(1).join(' ')}')
-      : Bot.parseCommand(0, input);
 
   try {
-    print(await symbolizer.symbolize(input, overrides: command?.overrides));
+    final input = await loadContent(github, args.first);
+
+    final overrides = args.length >= 2
+        ? SymbolizationOverrides.tryParse(args.skip(1).join(' '))
+        : null;
+
+    _printResult(await symbolizer.symbolize(input, overrides: overrides));
   } finally {
     github.dispose();
   }
 }
+
+final errorPen = AnsiPen()..red();
+final notePen = AnsiPen()..gray();
+final successPen = AnsiPen()..green();
+final stackPen = AnsiPen()..black(bold: true);
+
+String _reindent(String str, {String padding = '  '}) {
+  return '  ${str.split('\n').join('\n$padding')}';
+}
+
+/// Pretty print the given [SymbolizationResult] to stdout.
+void _printResult(SymbolizationResult symbolized) async {
+  final buf = StringBuffer();
+
+  switch (symbolized) {
+    case SymbolizationResultOk(:final results):
+      for (var result in results) {
+        buf.write('''
+
+--------------------------------------------------------------------------------
+''');
+        bool success;
+        switch (result) {
+          case CrashSymbolizationResult(
+              :final symbolized?,
+              engineBuild: EngineBuild(
+                engineHash: final engineHash,
+                variant: EngineVariant(:final os, :final arch, :final mode)
+              )
+            ):
+            success = true;
+            buf.writeln(successPen(
+                'symbolized using symbols for $engineHash $os-$arch-$mode\n'));
+            buf.writeln(stackPen(_reindent(symbolized)));
+
+          default:
+            success = false;
+            buf.writeln(errorPen('Found crash but failed to symbolize it.\n'));
+            final addrSize = result.crash.frames
+                    .map((frame) => frame.pc == (frame.pc & 0xFFFFFFFF))
+                    .every((v) => v)
+                ? 8
+                : 16;
+
+            for (var frame in result.crash.frames) {
+              switch (frame) {
+                case AndroidCrashFrame(
+                    :final no,
+                    :final pc,
+                    :final binary,
+                    :final rest,
+                  ):
+                  buf.writeln(stackPen(
+                      '  #$no ${pc.toRadixString(16).padLeft(addrSize, '0')} $binary $rest'));
+
+                default:
+                  buf.writeln(stackPen('  ${frame.pc} ${frame.binary}'));
+              }
+            }
+            buf.writeln();
+        }
+
+        final pen = success ? notePen : errorPen;
+        for (var note in result.notes) {
+          buf.write(pen('${noteMessage[note.kind]}'));
+          final message = note.message;
+          if (message != null && message.isNotEmpty) {
+            buf.write(pen(':\n${_reindent(message)}'));
+          }
+          buf.write('');
+        }
+
+        buf.writeln('''
+
+--------------------------------------------------------------------------------
+''');
+      }
+    case SymbolizationResultError(error: final note):
+      buf.write('''
+
+--------------------------------------------------------------------------------
+''');
+      buf.write(errorPen('${noteMessage[note.kind]}'));
+      final message = note.message;
+      if (message != null && message.isNotEmpty) {
+        buf.write(errorPen(':\n${_reindent(message)}'));
+      }
+      buf.write('');
+      buf.writeln('''
+
+--------------------------------------------------------------------------------
+''');
+  }
+
+  print(buf);
+}
diff --git a/github-label-notifier/symbolizer/deploy.sh b/github-label-notifier/symbolizer/deploy.sh
deleted file mode 100755
index 31043cb..0000000
--- a/github-label-notifier/symbolizer/deploy.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/sh
-# Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-set -xe
-
-for BINARY in "llvm-symbolizer" "llvm-objdump" "llvm-readobj"; do
-  if [[ ! -f "tools/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/${BINARY}" ]]; then
-    echo "Missing linux-x86_64 build of ${BINARY}."
-    echo "Point get-tools-from-ndk.sh to Linux NDK to extract it."
-    exit 1
-  fi
-done
-
-DART_VERSION=$(dart --version 2>&1 | grep -o -e '\d*\.\d*.\d*')
-
-if [[ $DART_VERSION != "2.18.0" ]]; then
-  echo "Version mismatch with server version: $DART_VERSION expected 2.18.0"
-  exit 1
-fi
-
-# Run all tests
-pub run test --no-chain-stack-traces -j1
-
-rm -rf deploy
-mkdir -p deploy/symbolizer
-dart --snapshot-kind=kernel --snapshot=deploy/symbolizer/symbolizer.dill bin/server.dart
-cp -r tools deploy/symbolizer/tools
-dart bin/configure.dart --output=deploy/symbolizer/.config.json \
-                        --github-token=$GITHUB_TOKEN            \
-                        --sendgrid-token=$SENDGRID_TOKEN        \
-                        --failure-email=$FAILURE_EMAIL
-pushd deploy
-zip -r symbolizer.zip symbolizer
-rm -rf symbolizer
-popd
-
-cat <<EOT >deploy/deploy.sh
-#!/bin/sh
-
-set -ex
-
-DEPLOY_CMD='rm -rf symbolizer && unzip symbolizer.zip && sudo supervisorctl restart all'
-gcloud beta compute scp --zone "us-central1-a" --project "dart-ci" symbolizer.zip crash-symbolizer:~/
-gcloud beta compute ssh --zone "us-central1-a" --project "dart-ci" --command "\$DEPLOY_CMD" crash-symbolizer
-EOT
-chmod +x deploy/deploy.sh
-
-if [[ -z "$DEPLOYMENT_PROXY" ]]; then
-  cd deploy && ./deploy.sh
-else
-  scp deploy/symbolizer.zip $DEPLOYMENT_PROXY:/tmp/symbolizer.zip
-  scp deploy/deploy.sh $DEPLOYMENT_PROXY:/tmp/deploy.sh
-  ssh $DEPLOYMENT_PROXY 'cd /tmp && ./deploy.sh'
-fi
diff --git a/github-label-notifier/symbolizer/lib/bot.dart b/github-label-notifier/symbolizer/lib/bot.dart
deleted file mode 100644
index cdedb2a..0000000
--- a/github-label-notifier/symbolizer/lib/bot.dart
+++ /dev/null
@@ -1,525 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Implementation of @flutter-symbolizer-bot.
-///
-/// The bot is triggered by command comments starting with bot mention
-/// and followed by zero of more keywords.
-///
-/// See README-bot.md for bot command documentation.
-library symbolizer.bot;
-
-import 'dart:convert';
-
-import 'package:github/github.dart';
-import 'package:logging/logging.dart';
-import 'package:sendgrid_mailer/sendgrid_mailer.dart';
-
-import 'package:symbolizer/model.dart';
-import 'package:symbolizer/parser.dart';
-import 'package:symbolizer/symbolizer.dart';
-
-final _log = Logger(Bot.account);
-
-class Bot {
-  final GitHub github;
-  final Symbolizer symbolizer;
-  final Mailer? mailer;
-  final String? failuresEmail;
-  final bool dryRun;
-
-  Bot({
-    required this.github,
-    required this.symbolizer,
-    required this.mailer,
-    required this.failuresEmail,
-    this.dryRun = false,
-  });
-
-  static final account = 'flutter-symbolizer-bot';
-  static final accountMention = '@$account';
-
-  /// Returns [true] if the given [text] is potentially a command to the bot.
-  static bool isCommand(String text) {
-    return text.startsWith(Bot.accountMention);
-  }
-
-  /// Parse the given [text] as a command to the bot. See the library doc
-  /// comment at the beginning of the file for information about the command
-  /// format.
-  static BotCommand? parseCommand(int issueNumber, String text) {
-    final command = text.split('\n').first;
-    if (!isCommand(command)) {
-      return null;
-    }
-
-    final issueNumberStr = issueNumber.toString();
-
-    var symbolizeThis = false;
-    final Set<String> worklist = <String>{};
-    String? engineHash;
-    String? flutterVersion;
-    String? os;
-    String? arch;
-    String? mode;
-    String? format;
-    var force = false;
-
-    // Command is just a sequence of keywords which specify which comments
-    // to symbolize and which symbols to use.
-    for (var keyword in command.split(' ').skip(1)) {
-      switch (keyword) {
-        case 'this':
-          symbolizeThis = true;
-          break;
-        case 'x86':
-        case 'arm':
-        case 'arm64':
-        case 'x64':
-          arch = keyword;
-          break;
-        case 'debug':
-        case 'profile':
-        case 'release':
-          mode = keyword;
-          break;
-        case 'internal':
-          format = 'internal';
-          break;
-        case 'force':
-          force = true;
-          break;
-        case 'ios':
-          os = 'ios';
-          break;
-        default:
-          // Check if this keyword is a link to an comment on this issue.
-          var m = _commentLinkPattern.firstMatch(keyword);
-          if (m != null) {
-            if (m.namedGroup('issueNumber') == issueNumberStr) {
-              worklist.add(m.namedGroup('ref')!);
-            }
-            break;
-          }
-
-          // Check if this keyword is an engine hash.
-          m = _engineHashPattern.firstMatch(keyword);
-          if (m != null) {
-            engineHash = m.namedGroup('sha');
-            break;
-          }
-
-          m = _flutterHashOrVersionPattern.firstMatch(keyword);
-          if (m != null) {
-            flutterVersion = m.namedGroup('version');
-            break;
-          }
-          break;
-      }
-    }
-
-    return BotCommand(
-      symbolizeThis: symbolizeThis,
-      worklist: worklist,
-      overrides: SymbolizationOverrides(
-        arch: arch,
-        engineHash: engineHash,
-        flutterVersion: flutterVersion,
-        mode: mode,
-        os: os,
-        force: force,
-        format: format,
-      ),
-    );
-  }
-
-  /// Execute command contained in the given [commandComment] posted on the
-  /// [issue] in the repository [repo].
-  Future<void> executeCommand(
-    RepositorySlug repo,
-    Issue issue,
-    IssueComment commandComment, {
-    required bool authorized,
-  }) async {
-    if (!authorized) {
-      await github.issues.createComment(repo, issue.number, '''
-@${commandComment.user!.login} Sorry, only **public members of Flutter org** can trigger my services.
-
-Check your privacy settings as described [here](https://docs.github.com/en/free-pro-team@latest/github/setting-up-and-managing-your-github-user-account/publicizing-or-hiding-organization-membership).
-''');
-      return;
-    }
-
-    final command = parseCommand(issue.number, commandComment.body!);
-    if (command == null) {
-      return;
-    }
-
-    // Comments which potentially contain crashes by their id.
-    final worklist = <_Comment>{};
-    if (command.shouldProcessAll) {
-      worklist.addAll(await _processAllComments(repo, issue));
-    } else {
-      if (command.symbolizeThis) {
-        worklist.add(_Comment.fromComment(commandComment));
-      }
-
-      // Process worklist from the command and fetch comment bodies.
-      for (var ref in command.worklist) {
-        // ref has one of the following formats: issue-id or issuecomment-id
-        final c = ref.split('-');
-        final id = int.parse(c[1]);
-        if (c[0] == 'issue') {
-          worklist.add(_Comment.fromIssue(issue));
-        } else {
-          try {
-            final comment = await github.issues.getComment(repo, id);
-            worklist.add(_Comment.fromComment(comment));
-          } catch (e) {
-            // Ignore.
-          }
-        }
-      }
-    }
-
-    // Process comments from the worklist.
-    await _symbolizeGiven(
-        repo, issue, commandComment.user!, worklist, command.overrides);
-  }
-
-  /// Find all comments on the [issue] which potentially contain crashes
-  /// and were not previously symbolized by the bot.
-  Future<Set<_Comment>> _processAllComments(
-      RepositorySlug repo, Issue issue) async {
-    _log.info(
-        'Requested to symbolize all comments on ${repo.fullName}#${issue.number}');
-
-    // Dictionary of comments to symbolize by their id.
-    final worklist = <_Comment>{};
-    final alreadySymbolized = <int>{};
-
-    // Collect all comments which might contain crashes in the worklist
-    // and ids of already symbolized comments in the [alreadySymbolized] set.
-    if (containsCrash(issue.body)) {
-      worklist.add(_Comment.fromIssue(issue));
-    }
-    await for (var comment
-        in github.issues.listCommentsByIssue(repo, issue.number)) {
-      if (comment.user!.login == Bot.account) {
-        // From comments by the bot extract ids of already symbolized comments.
-        // Bot adds it to its comments as a JSON encoded object within
-        // HTML comment: <!-- {"symbolized": [id0, id1, ...]} -->
-        final m = _botInfoPattern.firstMatch(comment.body!);
-        if (m != null) {
-          final state = jsonDecode(m.namedGroup('json')!.trim());
-          if (state is Map<String, dynamic> &&
-              state.containsKey('symbolized')) {
-            alreadySymbolized
-                .addAll((state['symbolized'] as List<dynamic>).cast<int>());
-          }
-        }
-      } else if (containsCrash(comment.body!)) {
-        worklist.add(_Comment.fromComment(comment));
-      }
-    }
-
-    _log.info(
-        'Found comments with crashes ${worklist.ids}, and already symbolized $alreadySymbolized');
-    alreadySymbolized.forEach(worklist.remove);
-    return worklist;
-  }
-
-  /// Symbolize crashes from all comments in the [worklist] using the given
-  /// [overrides] and post response on the issue.
-  Future<void> _symbolizeGiven(
-      RepositorySlug repo,
-      Issue issue,
-      User commandUser,
-      Set<_Comment> worklist,
-      SymbolizationOverrides overrides) async {
-    _log.info('Symbolizing ${worklist.ids} with overrides {$overrides}');
-
-    // Symbolize all collected comments.
-    final Map<int, SymbolizationResult> symbolized =
-        <int, SymbolizationResult>{};
-    for (var comment in worklist) {
-      final result =
-          await symbolizer.symbolize(comment.body, overrides: overrides);
-      if (result is SymbolizationResultError ||
-          (result is SymbolizationResultOk && result.results.isNotEmpty)) {
-        symbolized[comment.id] = result;
-      }
-    }
-
-    if (symbolized.isEmpty) {
-      await github.issues.createComment(repo, issue.number, '''
-@${commandUser.login} No crash reports found. I used the following overrides
-when looking for reports
-
-```
-$overrides
-```
-
-Note that I can only find native Android and iOS crash reports automatically,
-you need to explicitly point me to crash reports in other supported formats.
-
-If the crash report is embedded into a log and prefixed with additional
-information I might not be able to automatically strip those prefixes.
-Currently I only support `flutter run -v`, `adb logcat` and device lab logs.
-
-See [my documentation](https://github.com/flutter-symbolizer-bot/flutter-symbolizer-bot/blob/main/README.md#commands) for more details on how to do that.
-''');
-      return;
-    }
-
-    // Post a comment containing all successfully symbolized crashes.
-    _postResultComment(repo, issue, worklist, symbolized);
-    _mailFailures(repo, issue, worklist, symbolized);
-  }
-
-  /// Post a comment on the issue commenting successfully symbolized crashes.
-  void _postResultComment(RepositorySlug repo, Issue issue,
-      Set<_Comment> comments, Map<int, SymbolizationResult> symbolized) async {
-    if (symbolized.isEmpty) {
-      return;
-    }
-
-    final successes = _getOnlySuccesses(comments, symbolized);
-    final failures = _getOnlyFailures(comments, symbolized);
-
-    final buf = StringBuffer();
-    for (var entry in successes.entries) {
-      for (var result in entry.value.results) {
-        buf.write('''
-crash from ${entry.key} symbolized using symbols for `${result.engineBuild!.engineHash}` `${result.engineBuild!.variant.os}-${result.engineBuild!.variant.arch}-${result.engineBuild!.variant.mode}`
-```
-${result.symbolized}
-```
-''');
-        for (var note in result.notes) {
-          buf.write('_(${noteMessage[note.kind]}');
-          final message = note.message;
-          if (message != null && message.isNotEmpty) {
-            buf.write(': ');
-            buf.write(message);
-          }
-          buf.write(')_');
-        }
-        buf.writeln();
-      }
-    }
-
-    if (failures.isNotEmpty) {
-      buf.writeln();
-      // GitHub allows <details> HTML elements
-      // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details
-      buf.writeln('''
-<details>
-<summary>There were failures processing the request</summary>
-''');
-
-      void appendNote(SymbolizationNote note) {
-        buf.write('* ${noteMessage[note.kind]}');
-        final message = note.message;
-        if (message != null && message.isNotEmpty) {
-          if (message.contains('\n')) {
-            buf.writeln(':');
-            buf.write('''
-```
-$message
-```'''
-                .indentBy('    '));
-          } else {
-            buf.writeln(': `$message`');
-          }
-        }
-        buf.writeln('');
-      }
-
-      for (var entry in failures.entries) {
-        entry.value.when(ok: (results) {
-          for (var result in results) {
-            buf.writeln('''
-When processing ${entry.key} I found crash
-
-```
-${result.crash}
-```
-
-but failed to symbolize it with the following notes:
-''');
-            result.notes.forEach(appendNote);
-          }
-        }, error: (note) {
-          buf.writeln('''
-When processing ${entry.key} I encountered the following error:
-''');
-          appendNote(note);
-        });
-      }
-
-      buf.writeln('''
-
-See [my documentation](https://github.com/flutter-symbolizer-bot/flutter-symbolizer-bot/blob/main/README.md#commands) for more details.
-</details>
-''');
-    }
-
-    // Append information about symbolized comments to the bot's comment so that
-    // we could skip them later.
-    final successIds = <int>{
-      for (var comment in comments)
-        if (successes.containsKey(comment.url)) comment.id
-    };
-    buf.writeln('<!-- ${jsonEncode({'symbolized': successIds.toList()})} -->');
-
-    if (dryRun) {
-      print(buf);
-    } else {
-      await github.issues.createComment(repo, issue.number, buf.toString());
-    }
-  }
-
-  /// Mail failures to the [failuresEmail] mail address.
-  void _mailFailures(RepositorySlug repo, Issue issue, Set<_Comment> comments,
-      Map<int, SymbolizationResult> symbolized) async {
-    if (failuresEmail == null) {
-      return;
-    }
-
-    final failures = _getOnlyFailures(comments, symbolized);
-    if (failures.isEmpty) {
-      return;
-    }
-
-    final escape = const HtmlEscape().convert;
-
-    final buf = StringBuffer();
-    buf.write('''<p>Hello &#x1f44b;</p>
-<p>I was asked to symbolize crashes from <a href="${issue.htmlUrl}">issue ${issue.number}</a>, but failed.</p>
-''');
-    for (var entry in failures.entries) {
-      entry.value.when(ok: (results) {
-        for (var result in results) {
-          buf.writeln('''
-<p>When processing <a href="${entry.key}">comment</a>, I found crash</p>
-<pre>${escape(result.crash.toString())}</pre>
-<p>but failed with the following notes:</p>
-''');
-          for (var note in result.notes) {
-            buf.writeln(
-                '${noteMessage[note.kind]} <pre>${escape(note.message ?? '')}');
-          }
-        }
-      }, error: (note) {
-        buf.writeln('''
-<p>When processing <a href="${entry.key}">comment</a>, I failed with the following error:</p>
-''');
-        buf.writeln(
-            '${noteMessage[note.kind]} <pre>${escape(note.message ?? '')}');
-      });
-    }
-
-    if (dryRun) {
-      print(buf);
-    } else {
-      await mailer!.send(
-        Email(
-          [
-            Personalization([Address(failuresEmail!)])
-          ],
-          Address('noreply@dart.dev'),
-          'symbolization errors for issue #${issue.number}',
-          content: [Content('text/html', buf.toString())],
-        ),
-      );
-    }
-  }
-
-  static final _botInfoPattern = RegExp(r'<!-- (?<json>.*) -->');
-  static final _commentLinkPattern = RegExp(
-      r'^https://github\.com/(?<fullName>[\-\w]+/[\-\w]+)/issues/(?<issueNumber>\d+)#(?<ref>issue(comment)?-\d+)$');
-  static final _engineHashPattern = RegExp(r'^engine#(?<sha>[a-f0-9]+)$');
-  static final _flutterHashOrVersionPattern =
-      RegExp(r'^flutter#v?(?<version>[a-f0-9\.]+)$');
-}
-
-extension on BotCommand {
-  /// [true] if the user requested to process all comments on the issue.
-  bool get shouldProcessAll => !symbolizeThis && worklist.isEmpty;
-}
-
-/// Class that represents a comment on the issue.
-///
-/// GitHub API does not treat issue body itself as a comment hence
-/// the need for separate wrapper.
-class _Comment {
-  final int id;
-  final String url;
-  final String body;
-
-  _Comment(this.id, this.url, this.body);
-
-  _Comment.fromComment(IssueComment comment)
-      : this(comment.id!, comment.htmlUrl!, comment.body!);
-
-  _Comment.fromIssue(Issue issue)
-      : this(issue.id, issue.commentLikeHtmlUrl, issue.body);
-
-  @override
-  bool operator ==(Object other) {
-    return other is _Comment && other.id == id;
-  }
-
-  @override
-  int get hashCode => id.hashCode;
-}
-
-extension on Issue {
-  String get commentLikeHtmlUrl => '$htmlUrl#issue-$id';
-}
-
-/// Filter multimap of symbolization results to get all successes.
-Map<String, SymbolizationResultOk> _getOnlySuccesses(
-    Set<_Comment> comments, Map<int, SymbolizationResult> results) {
-  return Map.fromEntries(comments
-      .map((comment) => MapEntry(comment.url, results[comment.id]!))
-      .where((e) => e.value is SymbolizationResultOk)
-      .map((e) => MapEntry(
-          e.key,
-          _applyFilter(
-              e.value as SymbolizationResultOk, (r) => r.symbolized != null)))
-      .where((e) => e.value.results.isNotEmpty));
-}
-
-/// Filter multimap of symbolization results to get all failures.
-Map<String, SymbolizationResult> _getOnlyFailures(
-    Set<_Comment> comments, Map<int, SymbolizationResult> results) {
-  return Map.fromEntries(comments
-      .map((comment) => MapEntry(comment.url, results[comment.id]!))
-      .map((e) {
-    final result = e.value;
-    return MapEntry(
-        e.key,
-        result is SymbolizationResultOk
-            ? _applyFilter(result, (r) => r.symbolized == null)
-            : result);
-  }).where((e) =>
-          e.value is SymbolizationResultError ||
-          (e.value as SymbolizationResultOk).results.isNotEmpty));
-}
-
-SymbolizationResultOk _applyFilter(SymbolizationResultOk result,
-    bool Function(CrashSymbolizationResult) predicate) {
-  return SymbolizationResultOk(
-      results: result.results.where(predicate).toList());
-}
-
-extension on String {
-  String indentBy(String indent) => indent + split('\n').join('\n$indent');
-}
-
-extension on Set<_Comment> {
-  Iterable<int> get ids => map((e) => e.id);
-}
diff --git a/github-label-notifier/symbolizer/lib/model.dart b/github-label-notifier/symbolizer/lib/model.dart
index afe9b69..7ab92bd 100644
--- a/github-label-notifier/symbolizer/lib/model.dart
+++ b/github-label-notifier/symbolizer/lib/model.dart
@@ -237,14 +237,80 @@
     String? format,
     String? os,
   }) = _SymbolizationOverrides;
+
+  /// Parse the given [overrides].
+  ///
+  /// See README.md for overrides documentation.
+  static SymbolizationOverrides? tryParse(String overrides) {
+    String? engineHash;
+    String? flutterVersion;
+    String? os;
+    String? arch;
+    String? mode;
+    String? format;
+    var force = false;
+
+    // Command is just a sequence of keywords which specify which comments
+    // to symbolize and which symbols to use.
+    for (var keyword in overrides.split(' ')) {
+      switch (keyword) {
+        case 'x86':
+        case 'arm':
+        case 'arm64':
+        case 'x64':
+          arch = keyword;
+          break;
+        case 'debug':
+        case 'profile':
+        case 'release':
+          mode = keyword;
+          break;
+        case 'internal':
+          format = 'internal';
+          break;
+        case 'force':
+          force = true;
+          break;
+        case 'ios':
+          os = 'ios';
+          break;
+        default:
+          // Check if this keyword is an engine hash.
+          var m = _engineHashPattern.firstMatch(keyword);
+          if (m != null) {
+            engineHash = m.namedGroup('sha');
+            break;
+          }
+
+          m = _flutterHashOrVersionPattern.firstMatch(keyword);
+          if (m != null) {
+            flutterVersion = m.namedGroup('version');
+            break;
+          }
+          break;
+      }
+    }
+
+    return SymbolizationOverrides(
+      arch: arch,
+      engineHash: engineHash,
+      flutterVersion: flutterVersion,
+      mode: mode,
+      os: os,
+      force: force,
+      format: format,
+    );
+  }
+
+  static final _engineHashPattern = RegExp(r'^engine#(?<sha>[a-f0-9]+)$');
+  static final _flutterHashOrVersionPattern =
+      RegExp(r'^flutter#v?(?<version>[a-f0-9\.]+)$');
 }
 
 @freezed
 class ServerConfig with _$ServerConfig {
   factory ServerConfig({
     required String githubToken,
-    required String sendgridToken,
-    required String failureEmail,
   }) = _ServerConfig;
 
   factory ServerConfig.fromJson(Map<String, dynamic> json) =>
diff --git a/github-label-notifier/symbolizer/lib/model.freezed.dart b/github-label-notifier/symbolizer/lib/model.freezed.dart
index ac03a3d..8571294 100644
--- a/github-label-notifier/symbolizer/lib/model.freezed.dart
+++ b/github-label-notifier/symbolizer/lib/model.freezed.dart
@@ -1,9 +1,9 @@
 // coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: type=lint
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
 
-part of symbolizer.model;
+part of 'model.dart';
 
 // **************************************************************************
 // FreezedGenerator
@@ -12,7 +12,7 @@
 T _$identity<T>(T value) => value;
 
 final _privateConstructorUsedError = UnsupportedError(
-    'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
+    'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
 
 EngineVariant _$EngineVariantFromJson(Map<String, dynamic> json) {
   return _EngineVariant.fromJson(json);
@@ -34,79 +34,81 @@
 abstract class $EngineVariantCopyWith<$Res> {
   factory $EngineVariantCopyWith(
           EngineVariant value, $Res Function(EngineVariant) then) =
-      _$EngineVariantCopyWithImpl<$Res>;
+      _$EngineVariantCopyWithImpl<$Res, EngineVariant>;
+  @useResult
   $Res call({String os, String? arch, String? mode});
 }
 
 /// @nodoc
-class _$EngineVariantCopyWithImpl<$Res>
+class _$EngineVariantCopyWithImpl<$Res, $Val extends EngineVariant>
     implements $EngineVariantCopyWith<$Res> {
   _$EngineVariantCopyWithImpl(this._value, this._then);
 
-  final EngineVariant _value;
   // ignore: unused_field
-  final $Res Function(EngineVariant) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? os = freezed,
+    Object? os = null,
     Object? arch = freezed,
     Object? mode = freezed,
   }) {
     return _then(_value.copyWith(
-      os: os == freezed
+      os: null == os
           ? _value.os
           : os // ignore: cast_nullable_to_non_nullable
               as String,
-      arch: arch == freezed
+      arch: freezed == arch
           ? _value.arch
           : arch // ignore: cast_nullable_to_non_nullable
               as String?,
-      mode: mode == freezed
+      mode: freezed == mode
           ? _value.mode
           : mode // ignore: cast_nullable_to_non_nullable
               as String?,
-    ));
+    ) as $Val);
   }
 }
 
 /// @nodoc
-abstract class _$$_EngineVariantCopyWith<$Res>
+abstract class _$$EngineVariantImplCopyWith<$Res>
     implements $EngineVariantCopyWith<$Res> {
-  factory _$$_EngineVariantCopyWith(
-          _$_EngineVariant value, $Res Function(_$_EngineVariant) then) =
-      __$$_EngineVariantCopyWithImpl<$Res>;
+  factory _$$EngineVariantImplCopyWith(
+          _$EngineVariantImpl value, $Res Function(_$EngineVariantImpl) then) =
+      __$$EngineVariantImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call({String os, String? arch, String? mode});
 }
 
 /// @nodoc
-class __$$_EngineVariantCopyWithImpl<$Res>
-    extends _$EngineVariantCopyWithImpl<$Res>
-    implements _$$_EngineVariantCopyWith<$Res> {
-  __$$_EngineVariantCopyWithImpl(
-      _$_EngineVariant _value, $Res Function(_$_EngineVariant) _then)
-      : super(_value, (v) => _then(v as _$_EngineVariant));
+class __$$EngineVariantImplCopyWithImpl<$Res>
+    extends _$EngineVariantCopyWithImpl<$Res, _$EngineVariantImpl>
+    implements _$$EngineVariantImplCopyWith<$Res> {
+  __$$EngineVariantImplCopyWithImpl(
+      _$EngineVariantImpl _value, $Res Function(_$EngineVariantImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_EngineVariant get _value => super._value as _$_EngineVariant;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? os = freezed,
+    Object? os = null,
     Object? arch = freezed,
     Object? mode = freezed,
   }) {
-    return _then(_$_EngineVariant(
-      os: os == freezed
+    return _then(_$EngineVariantImpl(
+      os: null == os
           ? _value.os
           : os // ignore: cast_nullable_to_non_nullable
               as String,
-      arch: arch == freezed
+      arch: freezed == arch
           ? _value.arch
           : arch // ignore: cast_nullable_to_non_nullable
               as String?,
-      mode: mode == freezed
+      mode: freezed == mode
           ? _value.mode
           : mode // ignore: cast_nullable_to_non_nullable
               as String?,
@@ -116,11 +118,12 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$_EngineVariant implements _EngineVariant {
-  _$_EngineVariant({required this.os, required this.arch, required this.mode});
+class _$EngineVariantImpl implements _EngineVariant {
+  _$EngineVariantImpl(
+      {required this.os, required this.arch, required this.mode});
 
-  factory _$_EngineVariant.fromJson(Map<String, dynamic> json) =>
-      _$$_EngineVariantFromJson(json);
+  factory _$EngineVariantImpl.fromJson(Map<String, dynamic> json) =>
+      _$$EngineVariantImplFromJson(json);
 
   @override
   final String os;
@@ -135,31 +138,28 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_EngineVariant &&
-            const DeepCollectionEquality().equals(other.os, os) &&
-            const DeepCollectionEquality().equals(other.arch, arch) &&
-            const DeepCollectionEquality().equals(other.mode, mode));
+            other is _$EngineVariantImpl &&
+            (identical(other.os, os) || other.os == os) &&
+            (identical(other.arch, arch) || other.arch == arch) &&
+            (identical(other.mode, mode) || other.mode == mode));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(os),
-      const DeepCollectionEquality().hash(arch),
-      const DeepCollectionEquality().hash(mode));
+  int get hashCode => Object.hash(runtimeType, os, arch, mode);
 
   @JsonKey(ignore: true)
   @override
-  _$$_EngineVariantCopyWith<_$_EngineVariant> get copyWith =>
-      __$$_EngineVariantCopyWithImpl<_$_EngineVariant>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$EngineVariantImplCopyWith<_$EngineVariantImpl> get copyWith =>
+      __$$EngineVariantImplCopyWithImpl<_$EngineVariantImpl>(this, _$identity);
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$_EngineVariantToJson(
+    return _$$EngineVariantImplToJson(
       this,
     );
   }
@@ -169,10 +169,10 @@
   factory _EngineVariant(
       {required final String os,
       required final String? arch,
-      required final String? mode}) = _$_EngineVariant;
+      required final String? mode}) = _$EngineVariantImpl;
 
   factory _EngineVariant.fromJson(Map<String, dynamic> json) =
-      _$_EngineVariant.fromJson;
+      _$EngineVariantImpl.fromJson;
 
   @override
   String get os;
@@ -182,7 +182,7 @@
   String? get mode;
   @override
   @JsonKey(ignore: true)
-  _$$_EngineVariantCopyWith<_$_EngineVariant> get copyWith =>
+  _$$EngineVariantImplCopyWith<_$EngineVariantImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
@@ -205,52 +205,58 @@
 abstract class $EngineBuildCopyWith<$Res> {
   factory $EngineBuildCopyWith(
           EngineBuild value, $Res Function(EngineBuild) then) =
-      _$EngineBuildCopyWithImpl<$Res>;
+      _$EngineBuildCopyWithImpl<$Res, EngineBuild>;
+  @useResult
   $Res call({String engineHash, EngineVariant variant});
 
   $EngineVariantCopyWith<$Res> get variant;
 }
 
 /// @nodoc
-class _$EngineBuildCopyWithImpl<$Res> implements $EngineBuildCopyWith<$Res> {
+class _$EngineBuildCopyWithImpl<$Res, $Val extends EngineBuild>
+    implements $EngineBuildCopyWith<$Res> {
   _$EngineBuildCopyWithImpl(this._value, this._then);
 
-  final EngineBuild _value;
   // ignore: unused_field
-  final $Res Function(EngineBuild) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? engineHash = freezed,
-    Object? variant = freezed,
+    Object? engineHash = null,
+    Object? variant = null,
   }) {
     return _then(_value.copyWith(
-      engineHash: engineHash == freezed
+      engineHash: null == engineHash
           ? _value.engineHash
           : engineHash // ignore: cast_nullable_to_non_nullable
               as String,
-      variant: variant == freezed
+      variant: null == variant
           ? _value.variant
           : variant // ignore: cast_nullable_to_non_nullable
               as EngineVariant,
-    ));
+    ) as $Val);
   }
 
   @override
+  @pragma('vm:prefer-inline')
   $EngineVariantCopyWith<$Res> get variant {
     return $EngineVariantCopyWith<$Res>(_value.variant, (value) {
-      return _then(_value.copyWith(variant: value));
+      return _then(_value.copyWith(variant: value) as $Val);
     });
   }
 }
 
 /// @nodoc
-abstract class _$$_EngineBuildCopyWith<$Res>
+abstract class _$$EngineBuildImplCopyWith<$Res>
     implements $EngineBuildCopyWith<$Res> {
-  factory _$$_EngineBuildCopyWith(
-          _$_EngineBuild value, $Res Function(_$_EngineBuild) then) =
-      __$$_EngineBuildCopyWithImpl<$Res>;
+  factory _$$EngineBuildImplCopyWith(
+          _$EngineBuildImpl value, $Res Function(_$EngineBuildImpl) then) =
+      __$$EngineBuildImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call({String engineHash, EngineVariant variant});
 
   @override
@@ -258,26 +264,25 @@
 }
 
 /// @nodoc
-class __$$_EngineBuildCopyWithImpl<$Res> extends _$EngineBuildCopyWithImpl<$Res>
-    implements _$$_EngineBuildCopyWith<$Res> {
-  __$$_EngineBuildCopyWithImpl(
-      _$_EngineBuild _value, $Res Function(_$_EngineBuild) _then)
-      : super(_value, (v) => _then(v as _$_EngineBuild));
+class __$$EngineBuildImplCopyWithImpl<$Res>
+    extends _$EngineBuildCopyWithImpl<$Res, _$EngineBuildImpl>
+    implements _$$EngineBuildImplCopyWith<$Res> {
+  __$$EngineBuildImplCopyWithImpl(
+      _$EngineBuildImpl _value, $Res Function(_$EngineBuildImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_EngineBuild get _value => super._value as _$_EngineBuild;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? engineHash = freezed,
-    Object? variant = freezed,
+    Object? engineHash = null,
+    Object? variant = null,
   }) {
-    return _then(_$_EngineBuild(
-      engineHash: engineHash == freezed
+    return _then(_$EngineBuildImpl(
+      engineHash: null == engineHash
           ? _value.engineHash
           : engineHash // ignore: cast_nullable_to_non_nullable
               as String,
-      variant: variant == freezed
+      variant: null == variant
           ? _value.variant
           : variant // ignore: cast_nullable_to_non_nullable
               as EngineVariant,
@@ -287,11 +292,11 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$_EngineBuild implements _EngineBuild {
-  _$_EngineBuild({required this.engineHash, required this.variant});
+class _$EngineBuildImpl implements _EngineBuild {
+  _$EngineBuildImpl({required this.engineHash, required this.variant});
 
-  factory _$_EngineBuild.fromJson(Map<String, dynamic> json) =>
-      _$$_EngineBuildFromJson(json);
+  factory _$EngineBuildImpl.fromJson(Map<String, dynamic> json) =>
+      _$$EngineBuildImplFromJson(json);
 
   @override
   final String engineHash;
@@ -304,30 +309,28 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_EngineBuild &&
-            const DeepCollectionEquality()
-                .equals(other.engineHash, engineHash) &&
-            const DeepCollectionEquality().equals(other.variant, variant));
+            other is _$EngineBuildImpl &&
+            (identical(other.engineHash, engineHash) ||
+                other.engineHash == engineHash) &&
+            (identical(other.variant, variant) || other.variant == variant));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(engineHash),
-      const DeepCollectionEquality().hash(variant));
+  int get hashCode => Object.hash(runtimeType, engineHash, variant);
 
   @JsonKey(ignore: true)
   @override
-  _$$_EngineBuildCopyWith<_$_EngineBuild> get copyWith =>
-      __$$_EngineBuildCopyWithImpl<_$_EngineBuild>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$EngineBuildImplCopyWith<_$EngineBuildImpl> get copyWith =>
+      __$$EngineBuildImplCopyWithImpl<_$EngineBuildImpl>(this, _$identity);
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$_EngineBuildToJson(
+    return _$$EngineBuildImplToJson(
       this,
     );
   }
@@ -336,10 +339,10 @@
 abstract class _EngineBuild implements EngineBuild {
   factory _EngineBuild(
       {required final String engineHash,
-      required final EngineVariant variant}) = _$_EngineBuild;
+      required final EngineVariant variant}) = _$EngineBuildImpl;
 
   factory _EngineBuild.fromJson(Map<String, dynamic> json) =
-      _$_EngineBuild.fromJson;
+      _$EngineBuildImpl.fromJson;
 
   @override
   String get engineHash;
@@ -347,7 +350,7 @@
   EngineVariant get variant;
   @override
   @JsonKey(ignore: true)
-  _$$_EngineBuildCopyWith<_$_EngineBuild> get copyWith =>
+  _$$EngineBuildImplCopyWith<_$EngineBuildImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
@@ -390,16 +393,16 @@
       throw _privateConstructorUsedError;
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(String no, String binary, int pc, String symbol,
+    TResult? Function(String no, String binary, int pc, String symbol,
             int? offset, String location)?
         ios,
-    TResult Function(
+    TResult? Function(
             String no, int pc, String binary, String rest, String? buildId)?
         android,
-    TResult Function(String no, int pc, String binary, int? offset,
+    TResult? Function(String no, int pc, String binary, int? offset,
             String? location, String? symbol)?
         custom,
-    TResult Function(int pc, String binary, int offset)? dartvm,
+    TResult? Function(int pc, String binary, int offset)? dartvm,
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
@@ -427,10 +430,10 @@
       throw _privateConstructorUsedError;
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(IosCrashFrame value)? ios,
-    TResult Function(AndroidCrashFrame value)? android,
-    TResult Function(CustomCrashFrame value)? custom,
-    TResult Function(DartvmCrashFrame value)? dartvm,
+    TResult? Function(IosCrashFrame value)? ios,
+    TResult? Function(AndroidCrashFrame value)? android,
+    TResult? Function(CustomCrashFrame value)? custom,
+    TResult? Function(DartvmCrashFrame value)? dartvm,
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
@@ -452,43 +455,48 @@
 abstract class $CrashFrameCopyWith<$Res> {
   factory $CrashFrameCopyWith(
           CrashFrame value, $Res Function(CrashFrame) then) =
-      _$CrashFrameCopyWithImpl<$Res>;
+      _$CrashFrameCopyWithImpl<$Res, CrashFrame>;
+  @useResult
   $Res call({String binary, int pc});
 }
 
 /// @nodoc
-class _$CrashFrameCopyWithImpl<$Res> implements $CrashFrameCopyWith<$Res> {
+class _$CrashFrameCopyWithImpl<$Res, $Val extends CrashFrame>
+    implements $CrashFrameCopyWith<$Res> {
   _$CrashFrameCopyWithImpl(this._value, this._then);
 
-  final CrashFrame _value;
   // ignore: unused_field
-  final $Res Function(CrashFrame) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? binary = freezed,
-    Object? pc = freezed,
+    Object? binary = null,
+    Object? pc = null,
   }) {
     return _then(_value.copyWith(
-      binary: binary == freezed
+      binary: null == binary
           ? _value.binary
           : binary // ignore: cast_nullable_to_non_nullable
               as String,
-      pc: pc == freezed
+      pc: null == pc
           ? _value.pc
           : pc // ignore: cast_nullable_to_non_nullable
               as int,
-    ));
+    ) as $Val);
   }
 }
 
 /// @nodoc
-abstract class _$$IosCrashFrameCopyWith<$Res>
+abstract class _$$IosCrashFrameImplCopyWith<$Res>
     implements $CrashFrameCopyWith<$Res> {
-  factory _$$IosCrashFrameCopyWith(
-          _$IosCrashFrame value, $Res Function(_$IosCrashFrame) then) =
-      __$$IosCrashFrameCopyWithImpl<$Res>;
+  factory _$$IosCrashFrameImplCopyWith(
+          _$IosCrashFrameImpl value, $Res Function(_$IosCrashFrameImpl) then) =
+      __$$IosCrashFrameImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call(
       {String no,
       String binary,
@@ -499,46 +507,45 @@
 }
 
 /// @nodoc
-class __$$IosCrashFrameCopyWithImpl<$Res> extends _$CrashFrameCopyWithImpl<$Res>
-    implements _$$IosCrashFrameCopyWith<$Res> {
-  __$$IosCrashFrameCopyWithImpl(
-      _$IosCrashFrame _value, $Res Function(_$IosCrashFrame) _then)
-      : super(_value, (v) => _then(v as _$IosCrashFrame));
+class __$$IosCrashFrameImplCopyWithImpl<$Res>
+    extends _$CrashFrameCopyWithImpl<$Res, _$IosCrashFrameImpl>
+    implements _$$IosCrashFrameImplCopyWith<$Res> {
+  __$$IosCrashFrameImplCopyWithImpl(
+      _$IosCrashFrameImpl _value, $Res Function(_$IosCrashFrameImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$IosCrashFrame get _value => super._value as _$IosCrashFrame;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? no = freezed,
-    Object? binary = freezed,
-    Object? pc = freezed,
-    Object? symbol = freezed,
+    Object? no = null,
+    Object? binary = null,
+    Object? pc = null,
+    Object? symbol = null,
     Object? offset = freezed,
-    Object? location = freezed,
+    Object? location = null,
   }) {
-    return _then(_$IosCrashFrame(
-      no: no == freezed
+    return _then(_$IosCrashFrameImpl(
+      no: null == no
           ? _value.no
           : no // ignore: cast_nullable_to_non_nullable
               as String,
-      binary: binary == freezed
+      binary: null == binary
           ? _value.binary
           : binary // ignore: cast_nullable_to_non_nullable
               as String,
-      pc: pc == freezed
+      pc: null == pc
           ? _value.pc
           : pc // ignore: cast_nullable_to_non_nullable
               as int,
-      symbol: symbol == freezed
+      symbol: null == symbol
           ? _value.symbol
           : symbol // ignore: cast_nullable_to_non_nullable
               as String,
-      offset: offset == freezed
+      offset: freezed == offset
           ? _value.offset
           : offset // ignore: cast_nullable_to_non_nullable
               as int?,
-      location: location == freezed
+      location: null == location
           ? _value.location
           : location // ignore: cast_nullable_to_non_nullable
               as String,
@@ -548,8 +555,8 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$IosCrashFrame implements IosCrashFrame {
-  _$IosCrashFrame(
+class _$IosCrashFrameImpl implements IosCrashFrame {
+  _$IosCrashFrameImpl(
       {required this.no,
       required this.binary,
       required this.pc,
@@ -559,8 +566,8 @@
       final String? $type})
       : $type = $type ?? 'ios';
 
-  factory _$IosCrashFrame.fromJson(Map<String, dynamic> json) =>
-      _$$IosCrashFrameFromJson(json);
+  factory _$IosCrashFrameImpl.fromJson(Map<String, dynamic> json) =>
+      _$$IosCrashFrameImplFromJson(json);
 
   @override
   final String no;
@@ -586,33 +593,29 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$IosCrashFrame &&
-            const DeepCollectionEquality().equals(other.no, no) &&
-            const DeepCollectionEquality().equals(other.binary, binary) &&
-            const DeepCollectionEquality().equals(other.pc, pc) &&
-            const DeepCollectionEquality().equals(other.symbol, symbol) &&
-            const DeepCollectionEquality().equals(other.offset, offset) &&
-            const DeepCollectionEquality().equals(other.location, location));
+            other is _$IosCrashFrameImpl &&
+            (identical(other.no, no) || other.no == no) &&
+            (identical(other.binary, binary) || other.binary == binary) &&
+            (identical(other.pc, pc) || other.pc == pc) &&
+            (identical(other.symbol, symbol) || other.symbol == symbol) &&
+            (identical(other.offset, offset) || other.offset == offset) &&
+            (identical(other.location, location) ||
+                other.location == location));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(no),
-      const DeepCollectionEquality().hash(binary),
-      const DeepCollectionEquality().hash(pc),
-      const DeepCollectionEquality().hash(symbol),
-      const DeepCollectionEquality().hash(offset),
-      const DeepCollectionEquality().hash(location));
+  int get hashCode =>
+      Object.hash(runtimeType, no, binary, pc, symbol, offset, location);
 
   @JsonKey(ignore: true)
   @override
-  _$$IosCrashFrameCopyWith<_$IosCrashFrame> get copyWith =>
-      __$$IosCrashFrameCopyWithImpl<_$IosCrashFrame>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$IosCrashFrameImplCopyWith<_$IosCrashFrameImpl> get copyWith =>
+      __$$IosCrashFrameImplCopyWithImpl<_$IosCrashFrameImpl>(this, _$identity);
 
   @override
   @optionalTypeArgs
@@ -634,16 +637,16 @@
   @override
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(String no, String binary, int pc, String symbol,
+    TResult? Function(String no, String binary, int pc, String symbol,
             int? offset, String location)?
         ios,
-    TResult Function(
+    TResult? Function(
             String no, int pc, String binary, String rest, String? buildId)?
         android,
-    TResult Function(String no, int pc, String binary, int? offset,
+    TResult? Function(String no, int pc, String binary, int? offset,
             String? location, String? symbol)?
         custom,
-    TResult Function(int pc, String binary, int offset)? dartvm,
+    TResult? Function(int pc, String binary, int offset)? dartvm,
   }) {
     return ios?.call(no, binary, pc, symbol, offset, location);
   }
@@ -683,10 +686,10 @@
   @override
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(IosCrashFrame value)? ios,
-    TResult Function(AndroidCrashFrame value)? android,
-    TResult Function(CustomCrashFrame value)? custom,
-    TResult Function(DartvmCrashFrame value)? dartvm,
+    TResult? Function(IosCrashFrame value)? ios,
+    TResult? Function(AndroidCrashFrame value)? android,
+    TResult? Function(CustomCrashFrame value)? custom,
+    TResult? Function(DartvmCrashFrame value)? dartvm,
   }) {
     return ios?.call(this);
   }
@@ -708,7 +711,7 @@
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$IosCrashFrameToJson(
+    return _$$IosCrashFrameImplToJson(
       this,
     );
   }
@@ -721,10 +724,10 @@
       required final int pc,
       required final String symbol,
       required final int? offset,
-      required final String location}) = _$IosCrashFrame;
+      required final String location}) = _$IosCrashFrameImpl;
 
   factory IosCrashFrame.fromJson(Map<String, dynamic> json) =
-      _$IosCrashFrame.fromJson;
+      _$IosCrashFrameImpl.fromJson;
 
   String get no;
   @override
@@ -738,57 +741,56 @@
   String get location;
   @override
   @JsonKey(ignore: true)
-  _$$IosCrashFrameCopyWith<_$IosCrashFrame> get copyWith =>
+  _$$IosCrashFrameImplCopyWith<_$IosCrashFrameImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
 /// @nodoc
-abstract class _$$AndroidCrashFrameCopyWith<$Res>
+abstract class _$$AndroidCrashFrameImplCopyWith<$Res>
     implements $CrashFrameCopyWith<$Res> {
-  factory _$$AndroidCrashFrameCopyWith(
-          _$AndroidCrashFrame value, $Res Function(_$AndroidCrashFrame) then) =
-      __$$AndroidCrashFrameCopyWithImpl<$Res>;
+  factory _$$AndroidCrashFrameImplCopyWith(_$AndroidCrashFrameImpl value,
+          $Res Function(_$AndroidCrashFrameImpl) then) =
+      __$$AndroidCrashFrameImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call({String no, int pc, String binary, String rest, String? buildId});
 }
 
 /// @nodoc
-class __$$AndroidCrashFrameCopyWithImpl<$Res>
-    extends _$CrashFrameCopyWithImpl<$Res>
-    implements _$$AndroidCrashFrameCopyWith<$Res> {
-  __$$AndroidCrashFrameCopyWithImpl(
-      _$AndroidCrashFrame _value, $Res Function(_$AndroidCrashFrame) _then)
-      : super(_value, (v) => _then(v as _$AndroidCrashFrame));
+class __$$AndroidCrashFrameImplCopyWithImpl<$Res>
+    extends _$CrashFrameCopyWithImpl<$Res, _$AndroidCrashFrameImpl>
+    implements _$$AndroidCrashFrameImplCopyWith<$Res> {
+  __$$AndroidCrashFrameImplCopyWithImpl(_$AndroidCrashFrameImpl _value,
+      $Res Function(_$AndroidCrashFrameImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$AndroidCrashFrame get _value => super._value as _$AndroidCrashFrame;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? no = freezed,
-    Object? pc = freezed,
-    Object? binary = freezed,
-    Object? rest = freezed,
+    Object? no = null,
+    Object? pc = null,
+    Object? binary = null,
+    Object? rest = null,
     Object? buildId = freezed,
   }) {
-    return _then(_$AndroidCrashFrame(
-      no: no == freezed
+    return _then(_$AndroidCrashFrameImpl(
+      no: null == no
           ? _value.no
           : no // ignore: cast_nullable_to_non_nullable
               as String,
-      pc: pc == freezed
+      pc: null == pc
           ? _value.pc
           : pc // ignore: cast_nullable_to_non_nullable
               as int,
-      binary: binary == freezed
+      binary: null == binary
           ? _value.binary
           : binary // ignore: cast_nullable_to_non_nullable
               as String,
-      rest: rest == freezed
+      rest: null == rest
           ? _value.rest
           : rest // ignore: cast_nullable_to_non_nullable
               as String,
-      buildId: buildId == freezed
+      buildId: freezed == buildId
           ? _value.buildId
           : buildId // ignore: cast_nullable_to_non_nullable
               as String?,
@@ -798,8 +800,8 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$AndroidCrashFrame implements AndroidCrashFrame {
-  _$AndroidCrashFrame(
+class _$AndroidCrashFrameImpl implements AndroidCrashFrame {
+  _$AndroidCrashFrameImpl(
       {required this.no,
       required this.pc,
       required this.binary,
@@ -808,8 +810,8 @@
       final String? $type})
       : $type = $type ?? 'android';
 
-  factory _$AndroidCrashFrame.fromJson(Map<String, dynamic> json) =>
-      _$$AndroidCrashFrameFromJson(json);
+  factory _$AndroidCrashFrameImpl.fromJson(Map<String, dynamic> json) =>
+      _$$AndroidCrashFrameImplFromJson(json);
 
   @override
   final String no;
@@ -833,31 +835,27 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$AndroidCrashFrame &&
-            const DeepCollectionEquality().equals(other.no, no) &&
-            const DeepCollectionEquality().equals(other.pc, pc) &&
-            const DeepCollectionEquality().equals(other.binary, binary) &&
-            const DeepCollectionEquality().equals(other.rest, rest) &&
-            const DeepCollectionEquality().equals(other.buildId, buildId));
+            other is _$AndroidCrashFrameImpl &&
+            (identical(other.no, no) || other.no == no) &&
+            (identical(other.pc, pc) || other.pc == pc) &&
+            (identical(other.binary, binary) || other.binary == binary) &&
+            (identical(other.rest, rest) || other.rest == rest) &&
+            (identical(other.buildId, buildId) || other.buildId == buildId));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(no),
-      const DeepCollectionEquality().hash(pc),
-      const DeepCollectionEquality().hash(binary),
-      const DeepCollectionEquality().hash(rest),
-      const DeepCollectionEquality().hash(buildId));
+  int get hashCode => Object.hash(runtimeType, no, pc, binary, rest, buildId);
 
   @JsonKey(ignore: true)
   @override
-  _$$AndroidCrashFrameCopyWith<_$AndroidCrashFrame> get copyWith =>
-      __$$AndroidCrashFrameCopyWithImpl<_$AndroidCrashFrame>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$AndroidCrashFrameImplCopyWith<_$AndroidCrashFrameImpl> get copyWith =>
+      __$$AndroidCrashFrameImplCopyWithImpl<_$AndroidCrashFrameImpl>(
+          this, _$identity);
 
   @override
   @optionalTypeArgs
@@ -879,16 +877,16 @@
   @override
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(String no, String binary, int pc, String symbol,
+    TResult? Function(String no, String binary, int pc, String symbol,
             int? offset, String location)?
         ios,
-    TResult Function(
+    TResult? Function(
             String no, int pc, String binary, String rest, String? buildId)?
         android,
-    TResult Function(String no, int pc, String binary, int? offset,
+    TResult? Function(String no, int pc, String binary, int? offset,
             String? location, String? symbol)?
         custom,
-    TResult Function(int pc, String binary, int offset)? dartvm,
+    TResult? Function(int pc, String binary, int offset)? dartvm,
   }) {
     return android?.call(no, pc, binary, rest, buildId);
   }
@@ -928,10 +926,10 @@
   @override
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(IosCrashFrame value)? ios,
-    TResult Function(AndroidCrashFrame value)? android,
-    TResult Function(CustomCrashFrame value)? custom,
-    TResult Function(DartvmCrashFrame value)? dartvm,
+    TResult? Function(IosCrashFrame value)? ios,
+    TResult? Function(AndroidCrashFrame value)? android,
+    TResult? Function(CustomCrashFrame value)? custom,
+    TResult? Function(DartvmCrashFrame value)? dartvm,
   }) {
     return android?.call(this);
   }
@@ -953,7 +951,7 @@
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$AndroidCrashFrameToJson(
+    return _$$AndroidCrashFrameImplToJson(
       this,
     );
   }
@@ -965,10 +963,10 @@
       required final int pc,
       required final String binary,
       required final String rest,
-      required final String? buildId}) = _$AndroidCrashFrame;
+      required final String? buildId}) = _$AndroidCrashFrameImpl;
 
   factory AndroidCrashFrame.fromJson(Map<String, dynamic> json) =
-      _$AndroidCrashFrame.fromJson;
+      _$AndroidCrashFrameImpl.fromJson;
 
   String get no;
   @override
@@ -981,17 +979,18 @@
   String? get buildId;
   @override
   @JsonKey(ignore: true)
-  _$$AndroidCrashFrameCopyWith<_$AndroidCrashFrame> get copyWith =>
+  _$$AndroidCrashFrameImplCopyWith<_$AndroidCrashFrameImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
 /// @nodoc
-abstract class _$$CustomCrashFrameCopyWith<$Res>
+abstract class _$$CustomCrashFrameImplCopyWith<$Res>
     implements $CrashFrameCopyWith<$Res> {
-  factory _$$CustomCrashFrameCopyWith(
-          _$CustomCrashFrame value, $Res Function(_$CustomCrashFrame) then) =
-      __$$CustomCrashFrameCopyWithImpl<$Res>;
+  factory _$$CustomCrashFrameImplCopyWith(_$CustomCrashFrameImpl value,
+          $Res Function(_$CustomCrashFrameImpl) then) =
+      __$$CustomCrashFrameImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call(
       {String no,
       int pc,
@@ -1002,47 +1001,45 @@
 }
 
 /// @nodoc
-class __$$CustomCrashFrameCopyWithImpl<$Res>
-    extends _$CrashFrameCopyWithImpl<$Res>
-    implements _$$CustomCrashFrameCopyWith<$Res> {
-  __$$CustomCrashFrameCopyWithImpl(
-      _$CustomCrashFrame _value, $Res Function(_$CustomCrashFrame) _then)
-      : super(_value, (v) => _then(v as _$CustomCrashFrame));
+class __$$CustomCrashFrameImplCopyWithImpl<$Res>
+    extends _$CrashFrameCopyWithImpl<$Res, _$CustomCrashFrameImpl>
+    implements _$$CustomCrashFrameImplCopyWith<$Res> {
+  __$$CustomCrashFrameImplCopyWithImpl(_$CustomCrashFrameImpl _value,
+      $Res Function(_$CustomCrashFrameImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$CustomCrashFrame get _value => super._value as _$CustomCrashFrame;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? no = freezed,
-    Object? pc = freezed,
-    Object? binary = freezed,
+    Object? no = null,
+    Object? pc = null,
+    Object? binary = null,
     Object? offset = freezed,
     Object? location = freezed,
     Object? symbol = freezed,
   }) {
-    return _then(_$CustomCrashFrame(
-      no: no == freezed
+    return _then(_$CustomCrashFrameImpl(
+      no: null == no
           ? _value.no
           : no // ignore: cast_nullable_to_non_nullable
               as String,
-      pc: pc == freezed
+      pc: null == pc
           ? _value.pc
           : pc // ignore: cast_nullable_to_non_nullable
               as int,
-      binary: binary == freezed
+      binary: null == binary
           ? _value.binary
           : binary // ignore: cast_nullable_to_non_nullable
               as String,
-      offset: offset == freezed
+      offset: freezed == offset
           ? _value.offset
           : offset // ignore: cast_nullable_to_non_nullable
               as int?,
-      location: location == freezed
+      location: freezed == location
           ? _value.location
           : location // ignore: cast_nullable_to_non_nullable
               as String?,
-      symbol: symbol == freezed
+      symbol: freezed == symbol
           ? _value.symbol
           : symbol // ignore: cast_nullable_to_non_nullable
               as String?,
@@ -1052,8 +1049,8 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$CustomCrashFrame implements CustomCrashFrame {
-  _$CustomCrashFrame(
+class _$CustomCrashFrameImpl implements CustomCrashFrame {
+  _$CustomCrashFrameImpl(
       {required this.no,
       required this.pc,
       required this.binary,
@@ -1063,8 +1060,8 @@
       final String? $type})
       : $type = $type ?? 'custom';
 
-  factory _$CustomCrashFrame.fromJson(Map<String, dynamic> json) =>
-      _$$CustomCrashFrameFromJson(json);
+  factory _$CustomCrashFrameImpl.fromJson(Map<String, dynamic> json) =>
+      _$$CustomCrashFrameImplFromJson(json);
 
   @override
   final String no;
@@ -1088,33 +1085,30 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$CustomCrashFrame &&
-            const DeepCollectionEquality().equals(other.no, no) &&
-            const DeepCollectionEquality().equals(other.pc, pc) &&
-            const DeepCollectionEquality().equals(other.binary, binary) &&
-            const DeepCollectionEquality().equals(other.offset, offset) &&
-            const DeepCollectionEquality().equals(other.location, location) &&
-            const DeepCollectionEquality().equals(other.symbol, symbol));
+            other is _$CustomCrashFrameImpl &&
+            (identical(other.no, no) || other.no == no) &&
+            (identical(other.pc, pc) || other.pc == pc) &&
+            (identical(other.binary, binary) || other.binary == binary) &&
+            (identical(other.offset, offset) || other.offset == offset) &&
+            (identical(other.location, location) ||
+                other.location == location) &&
+            (identical(other.symbol, symbol) || other.symbol == symbol));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(no),
-      const DeepCollectionEquality().hash(pc),
-      const DeepCollectionEquality().hash(binary),
-      const DeepCollectionEquality().hash(offset),
-      const DeepCollectionEquality().hash(location),
-      const DeepCollectionEquality().hash(symbol));
+  int get hashCode =>
+      Object.hash(runtimeType, no, pc, binary, offset, location, symbol);
 
   @JsonKey(ignore: true)
   @override
-  _$$CustomCrashFrameCopyWith<_$CustomCrashFrame> get copyWith =>
-      __$$CustomCrashFrameCopyWithImpl<_$CustomCrashFrame>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$CustomCrashFrameImplCopyWith<_$CustomCrashFrameImpl> get copyWith =>
+      __$$CustomCrashFrameImplCopyWithImpl<_$CustomCrashFrameImpl>(
+          this, _$identity);
 
   @override
   @optionalTypeArgs
@@ -1136,16 +1130,16 @@
   @override
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(String no, String binary, int pc, String symbol,
+    TResult? Function(String no, String binary, int pc, String symbol,
             int? offset, String location)?
         ios,
-    TResult Function(
+    TResult? Function(
             String no, int pc, String binary, String rest, String? buildId)?
         android,
-    TResult Function(String no, int pc, String binary, int? offset,
+    TResult? Function(String no, int pc, String binary, int? offset,
             String? location, String? symbol)?
         custom,
-    TResult Function(int pc, String binary, int offset)? dartvm,
+    TResult? Function(int pc, String binary, int offset)? dartvm,
   }) {
     return custom?.call(no, pc, binary, offset, location, symbol);
   }
@@ -1185,10 +1179,10 @@
   @override
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(IosCrashFrame value)? ios,
-    TResult Function(AndroidCrashFrame value)? android,
-    TResult Function(CustomCrashFrame value)? custom,
-    TResult Function(DartvmCrashFrame value)? dartvm,
+    TResult? Function(IosCrashFrame value)? ios,
+    TResult? Function(AndroidCrashFrame value)? android,
+    TResult? Function(CustomCrashFrame value)? custom,
+    TResult? Function(DartvmCrashFrame value)? dartvm,
   }) {
     return custom?.call(this);
   }
@@ -1210,7 +1204,7 @@
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$CustomCrashFrameToJson(
+    return _$$CustomCrashFrameImplToJson(
       this,
     );
   }
@@ -1223,10 +1217,10 @@
       required final String binary,
       required final int? offset,
       required final String? location,
-      required final String? symbol}) = _$CustomCrashFrame;
+      required final String? symbol}) = _$CustomCrashFrameImpl;
 
   factory CustomCrashFrame.fromJson(Map<String, dynamic> json) =
-      _$CustomCrashFrame.fromJson;
+      _$CustomCrashFrameImpl.fromJson;
 
   String get no;
   @override
@@ -1238,47 +1232,46 @@
   String? get symbol;
   @override
   @JsonKey(ignore: true)
-  _$$CustomCrashFrameCopyWith<_$CustomCrashFrame> get copyWith =>
+  _$$CustomCrashFrameImplCopyWith<_$CustomCrashFrameImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
 /// @nodoc
-abstract class _$$DartvmCrashFrameCopyWith<$Res>
+abstract class _$$DartvmCrashFrameImplCopyWith<$Res>
     implements $CrashFrameCopyWith<$Res> {
-  factory _$$DartvmCrashFrameCopyWith(
-          _$DartvmCrashFrame value, $Res Function(_$DartvmCrashFrame) then) =
-      __$$DartvmCrashFrameCopyWithImpl<$Res>;
+  factory _$$DartvmCrashFrameImplCopyWith(_$DartvmCrashFrameImpl value,
+          $Res Function(_$DartvmCrashFrameImpl) then) =
+      __$$DartvmCrashFrameImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call({int pc, String binary, int offset});
 }
 
 /// @nodoc
-class __$$DartvmCrashFrameCopyWithImpl<$Res>
-    extends _$CrashFrameCopyWithImpl<$Res>
-    implements _$$DartvmCrashFrameCopyWith<$Res> {
-  __$$DartvmCrashFrameCopyWithImpl(
-      _$DartvmCrashFrame _value, $Res Function(_$DartvmCrashFrame) _then)
-      : super(_value, (v) => _then(v as _$DartvmCrashFrame));
+class __$$DartvmCrashFrameImplCopyWithImpl<$Res>
+    extends _$CrashFrameCopyWithImpl<$Res, _$DartvmCrashFrameImpl>
+    implements _$$DartvmCrashFrameImplCopyWith<$Res> {
+  __$$DartvmCrashFrameImplCopyWithImpl(_$DartvmCrashFrameImpl _value,
+      $Res Function(_$DartvmCrashFrameImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$DartvmCrashFrame get _value => super._value as _$DartvmCrashFrame;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? pc = freezed,
-    Object? binary = freezed,
-    Object? offset = freezed,
+    Object? pc = null,
+    Object? binary = null,
+    Object? offset = null,
   }) {
-    return _then(_$DartvmCrashFrame(
-      pc: pc == freezed
+    return _then(_$DartvmCrashFrameImpl(
+      pc: null == pc
           ? _value.pc
           : pc // ignore: cast_nullable_to_non_nullable
               as int,
-      binary: binary == freezed
+      binary: null == binary
           ? _value.binary
           : binary // ignore: cast_nullable_to_non_nullable
               as String,
-      offset: offset == freezed
+      offset: null == offset
           ? _value.offset
           : offset // ignore: cast_nullable_to_non_nullable
               as int,
@@ -1288,16 +1281,16 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$DartvmCrashFrame implements DartvmCrashFrame {
-  _$DartvmCrashFrame(
+class _$DartvmCrashFrameImpl implements DartvmCrashFrame {
+  _$DartvmCrashFrameImpl(
       {required this.pc,
       required this.binary,
       required this.offset,
       final String? $type})
       : $type = $type ?? 'dartvm';
 
-  factory _$DartvmCrashFrame.fromJson(Map<String, dynamic> json) =>
-      _$$DartvmCrashFrameFromJson(json);
+  factory _$DartvmCrashFrameImpl.fromJson(Map<String, dynamic> json) =>
+      _$$DartvmCrashFrameImplFromJson(json);
 
   /// Absolute PC of the frame.
   @override
@@ -1320,27 +1313,25 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$DartvmCrashFrame &&
-            const DeepCollectionEquality().equals(other.pc, pc) &&
-            const DeepCollectionEquality().equals(other.binary, binary) &&
-            const DeepCollectionEquality().equals(other.offset, offset));
+            other is _$DartvmCrashFrameImpl &&
+            (identical(other.pc, pc) || other.pc == pc) &&
+            (identical(other.binary, binary) || other.binary == binary) &&
+            (identical(other.offset, offset) || other.offset == offset));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(pc),
-      const DeepCollectionEquality().hash(binary),
-      const DeepCollectionEquality().hash(offset));
+  int get hashCode => Object.hash(runtimeType, pc, binary, offset);
 
   @JsonKey(ignore: true)
   @override
-  _$$DartvmCrashFrameCopyWith<_$DartvmCrashFrame> get copyWith =>
-      __$$DartvmCrashFrameCopyWithImpl<_$DartvmCrashFrame>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$DartvmCrashFrameImplCopyWith<_$DartvmCrashFrameImpl> get copyWith =>
+      __$$DartvmCrashFrameImplCopyWithImpl<_$DartvmCrashFrameImpl>(
+          this, _$identity);
 
   @override
   @optionalTypeArgs
@@ -1362,16 +1353,16 @@
   @override
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(String no, String binary, int pc, String symbol,
+    TResult? Function(String no, String binary, int pc, String symbol,
             int? offset, String location)?
         ios,
-    TResult Function(
+    TResult? Function(
             String no, int pc, String binary, String rest, String? buildId)?
         android,
-    TResult Function(String no, int pc, String binary, int? offset,
+    TResult? Function(String no, int pc, String binary, int? offset,
             String? location, String? symbol)?
         custom,
-    TResult Function(int pc, String binary, int offset)? dartvm,
+    TResult? Function(int pc, String binary, int offset)? dartvm,
   }) {
     return dartvm?.call(pc, binary, offset);
   }
@@ -1411,10 +1402,10 @@
   @override
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(IosCrashFrame value)? ios,
-    TResult Function(AndroidCrashFrame value)? android,
-    TResult Function(CustomCrashFrame value)? custom,
-    TResult Function(DartvmCrashFrame value)? dartvm,
+    TResult? Function(IosCrashFrame value)? ios,
+    TResult? Function(AndroidCrashFrame value)? android,
+    TResult? Function(CustomCrashFrame value)? custom,
+    TResult? Function(DartvmCrashFrame value)? dartvm,
   }) {
     return dartvm?.call(this);
   }
@@ -1436,7 +1427,7 @@
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$DartvmCrashFrameToJson(
+    return _$$DartvmCrashFrameImplToJson(
       this,
     );
   }
@@ -1446,10 +1437,10 @@
   factory DartvmCrashFrame(
       {required final int pc,
       required final String binary,
-      required final int offset}) = _$DartvmCrashFrame;
+      required final int offset}) = _$DartvmCrashFrameImpl;
 
   factory DartvmCrashFrame.fromJson(Map<String, dynamic> json) =
-      _$DartvmCrashFrame.fromJson;
+      _$DartvmCrashFrameImpl.fromJson;
 
   @override
 
@@ -1464,7 +1455,7 @@
   int get offset;
   @override
   @JsonKey(ignore: true)
-  _$$DartvmCrashFrameCopyWith<_$DartvmCrashFrame> get copyWith =>
+  _$$DartvmCrashFrameImplCopyWith<_$DartvmCrashFrameImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
@@ -1487,7 +1478,8 @@
 /// @nodoc
 abstract class $CrashCopyWith<$Res> {
   factory $CrashCopyWith(Crash value, $Res Function(Crash) then) =
-      _$CrashCopyWithImpl<$Res>;
+      _$CrashCopyWithImpl<$Res, Crash>;
+  @useResult
   $Res call(
       {EngineVariant engineVariant,
       List<CrashFrame> frames,
@@ -1498,53 +1490,59 @@
 }
 
 /// @nodoc
-class _$CrashCopyWithImpl<$Res> implements $CrashCopyWith<$Res> {
+class _$CrashCopyWithImpl<$Res, $Val extends Crash>
+    implements $CrashCopyWith<$Res> {
   _$CrashCopyWithImpl(this._value, this._then);
 
-  final Crash _value;
   // ignore: unused_field
-  final $Res Function(Crash) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? engineVariant = freezed,
-    Object? frames = freezed,
-    Object? format = freezed,
+    Object? engineVariant = null,
+    Object? frames = null,
+    Object? format = null,
     Object? androidMajorVersion = freezed,
   }) {
     return _then(_value.copyWith(
-      engineVariant: engineVariant == freezed
+      engineVariant: null == engineVariant
           ? _value.engineVariant
           : engineVariant // ignore: cast_nullable_to_non_nullable
               as EngineVariant,
-      frames: frames == freezed
+      frames: null == frames
           ? _value.frames
           : frames // ignore: cast_nullable_to_non_nullable
               as List<CrashFrame>,
-      format: format == freezed
+      format: null == format
           ? _value.format
           : format // ignore: cast_nullable_to_non_nullable
               as String,
-      androidMajorVersion: androidMajorVersion == freezed
+      androidMajorVersion: freezed == androidMajorVersion
           ? _value.androidMajorVersion
           : androidMajorVersion // ignore: cast_nullable_to_non_nullable
               as int?,
-    ));
+    ) as $Val);
   }
 
   @override
+  @pragma('vm:prefer-inline')
   $EngineVariantCopyWith<$Res> get engineVariant {
     return $EngineVariantCopyWith<$Res>(_value.engineVariant, (value) {
-      return _then(_value.copyWith(engineVariant: value));
+      return _then(_value.copyWith(engineVariant: value) as $Val);
     });
   }
 }
 
 /// @nodoc
-abstract class _$$_CrashCopyWith<$Res> implements $CrashCopyWith<$Res> {
-  factory _$$_CrashCopyWith(_$_Crash value, $Res Function(_$_Crash) then) =
-      __$$_CrashCopyWithImpl<$Res>;
+abstract class _$$CrashImplCopyWith<$Res> implements $CrashCopyWith<$Res> {
+  factory _$$CrashImplCopyWith(
+          _$CrashImpl value, $Res Function(_$CrashImpl) then) =
+      __$$CrashImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call(
       {EngineVariant engineVariant,
       List<CrashFrame> frames,
@@ -1556,35 +1554,35 @@
 }
 
 /// @nodoc
-class __$$_CrashCopyWithImpl<$Res> extends _$CrashCopyWithImpl<$Res>
-    implements _$$_CrashCopyWith<$Res> {
-  __$$_CrashCopyWithImpl(_$_Crash _value, $Res Function(_$_Crash) _then)
-      : super(_value, (v) => _then(v as _$_Crash));
+class __$$CrashImplCopyWithImpl<$Res>
+    extends _$CrashCopyWithImpl<$Res, _$CrashImpl>
+    implements _$$CrashImplCopyWith<$Res> {
+  __$$CrashImplCopyWithImpl(
+      _$CrashImpl _value, $Res Function(_$CrashImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_Crash get _value => super._value as _$_Crash;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? engineVariant = freezed,
-    Object? frames = freezed,
-    Object? format = freezed,
+    Object? engineVariant = null,
+    Object? frames = null,
+    Object? format = null,
     Object? androidMajorVersion = freezed,
   }) {
-    return _then(_$_Crash(
-      engineVariant: engineVariant == freezed
+    return _then(_$CrashImpl(
+      engineVariant: null == engineVariant
           ? _value.engineVariant
           : engineVariant // ignore: cast_nullable_to_non_nullable
               as EngineVariant,
-      frames: frames == freezed
+      frames: null == frames
           ? _value._frames
           : frames // ignore: cast_nullable_to_non_nullable
               as List<CrashFrame>,
-      format: format == freezed
+      format: null == format
           ? _value.format
           : format // ignore: cast_nullable_to_non_nullable
               as String,
-      androidMajorVersion: androidMajorVersion == freezed
+      androidMajorVersion: freezed == androidMajorVersion
           ? _value.androidMajorVersion
           : androidMajorVersion // ignore: cast_nullable_to_non_nullable
               as int?,
@@ -1594,22 +1592,23 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$_Crash implements _Crash {
-  _$_Crash(
+class _$CrashImpl implements _Crash {
+  _$CrashImpl(
       {required this.engineVariant,
       required final List<CrashFrame> frames,
       required this.format,
       this.androidMajorVersion})
       : _frames = frames;
 
-  factory _$_Crash.fromJson(Map<String, dynamic> json) =>
-      _$$_CrashFromJson(json);
+  factory _$CrashImpl.fromJson(Map<String, dynamic> json) =>
+      _$$CrashImplFromJson(json);
 
   @override
   final EngineVariant engineVariant;
   final List<CrashFrame> _frames;
   @override
   List<CrashFrame> get frames {
+    if (_frames is EqualUnmodifiableListView) return _frames;
     // ignore: implicit_dynamic_type
     return EqualUnmodifiableListView(_frames);
   }
@@ -1625,35 +1624,36 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_Crash &&
-            const DeepCollectionEquality()
-                .equals(other.engineVariant, engineVariant) &&
+            other is _$CrashImpl &&
+            (identical(other.engineVariant, engineVariant) ||
+                other.engineVariant == engineVariant) &&
             const DeepCollectionEquality().equals(other._frames, _frames) &&
-            const DeepCollectionEquality().equals(other.format, format) &&
-            const DeepCollectionEquality()
-                .equals(other.androidMajorVersion, androidMajorVersion));
+            (identical(other.format, format) || other.format == format) &&
+            (identical(other.androidMajorVersion, androidMajorVersion) ||
+                other.androidMajorVersion == androidMajorVersion));
   }
 
   @JsonKey(ignore: true)
   @override
   int get hashCode => Object.hash(
       runtimeType,
-      const DeepCollectionEquality().hash(engineVariant),
+      engineVariant,
       const DeepCollectionEquality().hash(_frames),
-      const DeepCollectionEquality().hash(format),
-      const DeepCollectionEquality().hash(androidMajorVersion));
+      format,
+      androidMajorVersion);
 
   @JsonKey(ignore: true)
   @override
-  _$$_CrashCopyWith<_$_Crash> get copyWith =>
-      __$$_CrashCopyWithImpl<_$_Crash>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$CrashImplCopyWith<_$CrashImpl> get copyWith =>
+      __$$CrashImplCopyWithImpl<_$CrashImpl>(this, _$identity);
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$_CrashToJson(
+    return _$$CrashImplToJson(
       this,
     );
   }
@@ -1664,9 +1664,9 @@
       {required final EngineVariant engineVariant,
       required final List<CrashFrame> frames,
       required final String format,
-      final int? androidMajorVersion}) = _$_Crash;
+      final int? androidMajorVersion}) = _$CrashImpl;
 
-  factory _Crash.fromJson(Map<String, dynamic> json) = _$_Crash.fromJson;
+  factory _Crash.fromJson(Map<String, dynamic> json) = _$CrashImpl.fromJson;
 
   @override
   EngineVariant get engineVariant;
@@ -1678,7 +1678,7 @@
   int? get androidMajorVersion;
   @override
   @JsonKey(ignore: true)
-  _$$_CrashCopyWith<_$_Crash> get copyWith =>
+  _$$CrashImplCopyWith<_$CrashImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
@@ -1705,8 +1705,8 @@
       throw _privateConstructorUsedError;
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(List<CrashSymbolizationResult> results)? ok,
-    TResult Function(SymbolizationNote error)? error,
+    TResult? Function(List<CrashSymbolizationResult> results)? ok,
+    TResult? Function(SymbolizationNote error)? error,
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
@@ -1724,8 +1724,8 @@
       throw _privateConstructorUsedError;
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(SymbolizationResultOk value)? ok,
-    TResult Function(SymbolizationResultError value)? error,
+    TResult? Function(SymbolizationResultOk value)? ok,
+    TResult? Function(SymbolizationResultError value)? error,
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
@@ -1742,44 +1742,45 @@
 abstract class $SymbolizationResultCopyWith<$Res> {
   factory $SymbolizationResultCopyWith(
           SymbolizationResult value, $Res Function(SymbolizationResult) then) =
-      _$SymbolizationResultCopyWithImpl<$Res>;
+      _$SymbolizationResultCopyWithImpl<$Res, SymbolizationResult>;
 }
 
 /// @nodoc
-class _$SymbolizationResultCopyWithImpl<$Res>
+class _$SymbolizationResultCopyWithImpl<$Res, $Val extends SymbolizationResult>
     implements $SymbolizationResultCopyWith<$Res> {
   _$SymbolizationResultCopyWithImpl(this._value, this._then);
 
-  final SymbolizationResult _value;
   // ignore: unused_field
-  final $Res Function(SymbolizationResult) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 }
 
 /// @nodoc
-abstract class _$$SymbolizationResultOkCopyWith<$Res> {
-  factory _$$SymbolizationResultOkCopyWith(_$SymbolizationResultOk value,
-          $Res Function(_$SymbolizationResultOk) then) =
-      __$$SymbolizationResultOkCopyWithImpl<$Res>;
+abstract class _$$SymbolizationResultOkImplCopyWith<$Res> {
+  factory _$$SymbolizationResultOkImplCopyWith(
+          _$SymbolizationResultOkImpl value,
+          $Res Function(_$SymbolizationResultOkImpl) then) =
+      __$$SymbolizationResultOkImplCopyWithImpl<$Res>;
+  @useResult
   $Res call({List<CrashSymbolizationResult> results});
 }
 
 /// @nodoc
-class __$$SymbolizationResultOkCopyWithImpl<$Res>
-    extends _$SymbolizationResultCopyWithImpl<$Res>
-    implements _$$SymbolizationResultOkCopyWith<$Res> {
-  __$$SymbolizationResultOkCopyWithImpl(_$SymbolizationResultOk _value,
-      $Res Function(_$SymbolizationResultOk) _then)
-      : super(_value, (v) => _then(v as _$SymbolizationResultOk));
+class __$$SymbolizationResultOkImplCopyWithImpl<$Res>
+    extends _$SymbolizationResultCopyWithImpl<$Res, _$SymbolizationResultOkImpl>
+    implements _$$SymbolizationResultOkImplCopyWith<$Res> {
+  __$$SymbolizationResultOkImplCopyWithImpl(_$SymbolizationResultOkImpl _value,
+      $Res Function(_$SymbolizationResultOkImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$SymbolizationResultOk get _value => super._value as _$SymbolizationResultOk;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? results = freezed,
+    Object? results = null,
   }) {
-    return _then(_$SymbolizationResultOk(
-      results: results == freezed
+    return _then(_$SymbolizationResultOkImpl(
+      results: null == results
           ? _value._results
           : results // ignore: cast_nullable_to_non_nullable
               as List<CrashSymbolizationResult>,
@@ -1790,19 +1791,20 @@
 /// @nodoc
 
 @JsonSerializable(explicitToJson: true)
-class _$SymbolizationResultOk implements SymbolizationResultOk {
-  _$SymbolizationResultOk(
+class _$SymbolizationResultOkImpl implements SymbolizationResultOk {
+  _$SymbolizationResultOkImpl(
       {required final List<CrashSymbolizationResult> results,
       final String? $type})
       : _results = results,
         $type = $type ?? 'ok';
 
-  factory _$SymbolizationResultOk.fromJson(Map<String, dynamic> json) =>
-      _$$SymbolizationResultOkFromJson(json);
+  factory _$SymbolizationResultOkImpl.fromJson(Map<String, dynamic> json) =>
+      _$$SymbolizationResultOkImplFromJson(json);
 
   final List<CrashSymbolizationResult> _results;
   @override
   List<CrashSymbolizationResult> get results {
+    if (_results is EqualUnmodifiableListView) return _results;
     // ignore: implicit_dynamic_type
     return EqualUnmodifiableListView(_results);
   }
@@ -1816,10 +1818,10 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$SymbolizationResultOk &&
+            other is _$SymbolizationResultOkImpl &&
             const DeepCollectionEquality().equals(other._results, _results));
   }
 
@@ -1830,9 +1832,10 @@
 
   @JsonKey(ignore: true)
   @override
-  _$$SymbolizationResultOkCopyWith<_$SymbolizationResultOk> get copyWith =>
-      __$$SymbolizationResultOkCopyWithImpl<_$SymbolizationResultOk>(
-          this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$SymbolizationResultOkImplCopyWith<_$SymbolizationResultOkImpl>
+      get copyWith => __$$SymbolizationResultOkImplCopyWithImpl<
+          _$SymbolizationResultOkImpl>(this, _$identity);
 
   @override
   @optionalTypeArgs
@@ -1846,8 +1849,8 @@
   @override
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(List<CrashSymbolizationResult> results)? ok,
-    TResult Function(SymbolizationNote error)? error,
+    TResult? Function(List<CrashSymbolizationResult> results)? ok,
+    TResult? Function(SymbolizationNote error)? error,
   }) {
     return ok?.call(results);
   }
@@ -1877,8 +1880,8 @@
   @override
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(SymbolizationResultOk value)? ok,
-    TResult Function(SymbolizationResultError value)? error,
+    TResult? Function(SymbolizationResultOk value)? ok,
+    TResult? Function(SymbolizationResultError value)? error,
   }) {
     return ok?.call(this);
   }
@@ -1898,7 +1901,7 @@
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$SymbolizationResultOkToJson(
+    return _$$SymbolizationResultOkImplToJson(
       this,
     );
   }
@@ -1907,45 +1910,46 @@
 abstract class SymbolizationResultOk implements SymbolizationResult {
   factory SymbolizationResultOk(
           {required final List<CrashSymbolizationResult> results}) =
-      _$SymbolizationResultOk;
+      _$SymbolizationResultOkImpl;
 
   factory SymbolizationResultOk.fromJson(Map<String, dynamic> json) =
-      _$SymbolizationResultOk.fromJson;
+      _$SymbolizationResultOkImpl.fromJson;
 
   List<CrashSymbolizationResult> get results;
   @JsonKey(ignore: true)
-  _$$SymbolizationResultOkCopyWith<_$SymbolizationResultOk> get copyWith =>
-      throw _privateConstructorUsedError;
+  _$$SymbolizationResultOkImplCopyWith<_$SymbolizationResultOkImpl>
+      get copyWith => throw _privateConstructorUsedError;
 }
 
 /// @nodoc
-abstract class _$$SymbolizationResultErrorCopyWith<$Res> {
-  factory _$$SymbolizationResultErrorCopyWith(_$SymbolizationResultError value,
-          $Res Function(_$SymbolizationResultError) then) =
-      __$$SymbolizationResultErrorCopyWithImpl<$Res>;
+abstract class _$$SymbolizationResultErrorImplCopyWith<$Res> {
+  factory _$$SymbolizationResultErrorImplCopyWith(
+          _$SymbolizationResultErrorImpl value,
+          $Res Function(_$SymbolizationResultErrorImpl) then) =
+      __$$SymbolizationResultErrorImplCopyWithImpl<$Res>;
+  @useResult
   $Res call({SymbolizationNote error});
 
   $SymbolizationNoteCopyWith<$Res> get error;
 }
 
 /// @nodoc
-class __$$SymbolizationResultErrorCopyWithImpl<$Res>
-    extends _$SymbolizationResultCopyWithImpl<$Res>
-    implements _$$SymbolizationResultErrorCopyWith<$Res> {
-  __$$SymbolizationResultErrorCopyWithImpl(_$SymbolizationResultError _value,
-      $Res Function(_$SymbolizationResultError) _then)
-      : super(_value, (v) => _then(v as _$SymbolizationResultError));
+class __$$SymbolizationResultErrorImplCopyWithImpl<$Res>
+    extends _$SymbolizationResultCopyWithImpl<$Res,
+        _$SymbolizationResultErrorImpl>
+    implements _$$SymbolizationResultErrorImplCopyWith<$Res> {
+  __$$SymbolizationResultErrorImplCopyWithImpl(
+      _$SymbolizationResultErrorImpl _value,
+      $Res Function(_$SymbolizationResultErrorImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$SymbolizationResultError get _value =>
-      super._value as _$SymbolizationResultError;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? error = freezed,
+    Object? error = null,
   }) {
-    return _then(_$SymbolizationResultError(
-      error: error == freezed
+    return _then(_$SymbolizationResultErrorImpl(
+      error: null == error
           ? _value.error
           : error // ignore: cast_nullable_to_non_nullable
               as SymbolizationNote,
@@ -1953,6 +1957,7 @@
   }
 
   @override
+  @pragma('vm:prefer-inline')
   $SymbolizationNoteCopyWith<$Res> get error {
     return $SymbolizationNoteCopyWith<$Res>(_value.error, (value) {
       return _then(_value.copyWith(error: value));
@@ -1963,12 +1968,12 @@
 /// @nodoc
 
 @JsonSerializable(explicitToJson: true)
-class _$SymbolizationResultError implements SymbolizationResultError {
-  _$SymbolizationResultError({required this.error, final String? $type})
+class _$SymbolizationResultErrorImpl implements SymbolizationResultError {
+  _$SymbolizationResultErrorImpl({required this.error, final String? $type})
       : $type = $type ?? 'error';
 
-  factory _$SymbolizationResultError.fromJson(Map<String, dynamic> json) =>
-      _$$SymbolizationResultErrorFromJson(json);
+  factory _$SymbolizationResultErrorImpl.fromJson(Map<String, dynamic> json) =>
+      _$$SymbolizationResultErrorImplFromJson(json);
 
   @override
   final SymbolizationNote error;
@@ -1982,24 +1987,23 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$SymbolizationResultError &&
-            const DeepCollectionEquality().equals(other.error, error));
+            other is _$SymbolizationResultErrorImpl &&
+            (identical(other.error, error) || other.error == error));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode =>
-      Object.hash(runtimeType, const DeepCollectionEquality().hash(error));
+  int get hashCode => Object.hash(runtimeType, error);
 
   @JsonKey(ignore: true)
   @override
-  _$$SymbolizationResultErrorCopyWith<_$SymbolizationResultError>
-      get copyWith =>
-          __$$SymbolizationResultErrorCopyWithImpl<_$SymbolizationResultError>(
-              this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$SymbolizationResultErrorImplCopyWith<_$SymbolizationResultErrorImpl>
+      get copyWith => __$$SymbolizationResultErrorImplCopyWithImpl<
+          _$SymbolizationResultErrorImpl>(this, _$identity);
 
   @override
   @optionalTypeArgs
@@ -2013,8 +2017,8 @@
   @override
   @optionalTypeArgs
   TResult? whenOrNull<TResult extends Object?>({
-    TResult Function(List<CrashSymbolizationResult> results)? ok,
-    TResult Function(SymbolizationNote error)? error,
+    TResult? Function(List<CrashSymbolizationResult> results)? ok,
+    TResult? Function(SymbolizationNote error)? error,
   }) {
     return error?.call(this.error);
   }
@@ -2044,8 +2048,8 @@
   @override
   @optionalTypeArgs
   TResult? mapOrNull<TResult extends Object?>({
-    TResult Function(SymbolizationResultOk value)? ok,
-    TResult Function(SymbolizationResultError value)? error,
+    TResult? Function(SymbolizationResultOk value)? ok,
+    TResult? Function(SymbolizationResultError value)? error,
   }) {
     return error?.call(this);
   }
@@ -2065,7 +2069,7 @@
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$SymbolizationResultErrorToJson(
+    return _$$SymbolizationResultErrorImplToJson(
       this,
     );
   }
@@ -2073,14 +2077,14 @@
 
 abstract class SymbolizationResultError implements SymbolizationResult {
   factory SymbolizationResultError({required final SymbolizationNote error}) =
-      _$SymbolizationResultError;
+      _$SymbolizationResultErrorImpl;
 
   factory SymbolizationResultError.fromJson(Map<String, dynamic> json) =
-      _$SymbolizationResultError.fromJson;
+      _$SymbolizationResultErrorImpl.fromJson;
 
   SymbolizationNote get error;
   @JsonKey(ignore: true)
-  _$$SymbolizationResultErrorCopyWith<_$SymbolizationResultError>
+  _$$SymbolizationResultErrorImplCopyWith<_$SymbolizationResultErrorImpl>
       get copyWith => throw _privateConstructorUsedError;
 }
 
@@ -2108,7 +2112,8 @@
 abstract class $CrashSymbolizationResultCopyWith<$Res> {
   factory $CrashSymbolizationResultCopyWith(CrashSymbolizationResult value,
           $Res Function(CrashSymbolizationResult) then) =
-      _$CrashSymbolizationResultCopyWithImpl<$Res>;
+      _$CrashSymbolizationResultCopyWithImpl<$Res, CrashSymbolizationResult>;
+  @useResult
   $Res call(
       {Crash crash,
       EngineBuild? engineBuild,
@@ -2120,68 +2125,74 @@
 }
 
 /// @nodoc
-class _$CrashSymbolizationResultCopyWithImpl<$Res>
+class _$CrashSymbolizationResultCopyWithImpl<$Res,
+        $Val extends CrashSymbolizationResult>
     implements $CrashSymbolizationResultCopyWith<$Res> {
   _$CrashSymbolizationResultCopyWithImpl(this._value, this._then);
 
-  final CrashSymbolizationResult _value;
   // ignore: unused_field
-  final $Res Function(CrashSymbolizationResult) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? crash = freezed,
+    Object? crash = null,
     Object? engineBuild = freezed,
     Object? symbolized = freezed,
-    Object? notes = freezed,
+    Object? notes = null,
   }) {
     return _then(_value.copyWith(
-      crash: crash == freezed
+      crash: null == crash
           ? _value.crash
           : crash // ignore: cast_nullable_to_non_nullable
               as Crash,
-      engineBuild: engineBuild == freezed
+      engineBuild: freezed == engineBuild
           ? _value.engineBuild
           : engineBuild // ignore: cast_nullable_to_non_nullable
               as EngineBuild?,
-      symbolized: symbolized == freezed
+      symbolized: freezed == symbolized
           ? _value.symbolized
           : symbolized // ignore: cast_nullable_to_non_nullable
               as String?,
-      notes: notes == freezed
+      notes: null == notes
           ? _value.notes
           : notes // ignore: cast_nullable_to_non_nullable
               as List<SymbolizationNote>,
-    ));
+    ) as $Val);
   }
 
   @override
+  @pragma('vm:prefer-inline')
   $CrashCopyWith<$Res> get crash {
     return $CrashCopyWith<$Res>(_value.crash, (value) {
-      return _then(_value.copyWith(crash: value));
+      return _then(_value.copyWith(crash: value) as $Val);
     });
   }
 
   @override
+  @pragma('vm:prefer-inline')
   $EngineBuildCopyWith<$Res>? get engineBuild {
     if (_value.engineBuild == null) {
       return null;
     }
 
     return $EngineBuildCopyWith<$Res>(_value.engineBuild!, (value) {
-      return _then(_value.copyWith(engineBuild: value));
+      return _then(_value.copyWith(engineBuild: value) as $Val);
     });
   }
 }
 
 /// @nodoc
-abstract class _$$_CrashSymbolizationResultCopyWith<$Res>
+abstract class _$$CrashSymbolizationResultImplCopyWith<$Res>
     implements $CrashSymbolizationResultCopyWith<$Res> {
-  factory _$$_CrashSymbolizationResultCopyWith(
-          _$_CrashSymbolizationResult value,
-          $Res Function(_$_CrashSymbolizationResult) then) =
-      __$$_CrashSymbolizationResultCopyWithImpl<$Res>;
+  factory _$$CrashSymbolizationResultImplCopyWith(
+          _$CrashSymbolizationResultImpl value,
+          $Res Function(_$CrashSymbolizationResultImpl) then) =
+      __$$CrashSymbolizationResultImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call(
       {Crash crash,
       EngineBuild? engineBuild,
@@ -2195,38 +2206,37 @@
 }
 
 /// @nodoc
-class __$$_CrashSymbolizationResultCopyWithImpl<$Res>
-    extends _$CrashSymbolizationResultCopyWithImpl<$Res>
-    implements _$$_CrashSymbolizationResultCopyWith<$Res> {
-  __$$_CrashSymbolizationResultCopyWithImpl(_$_CrashSymbolizationResult _value,
-      $Res Function(_$_CrashSymbolizationResult) _then)
-      : super(_value, (v) => _then(v as _$_CrashSymbolizationResult));
+class __$$CrashSymbolizationResultImplCopyWithImpl<$Res>
+    extends _$CrashSymbolizationResultCopyWithImpl<$Res,
+        _$CrashSymbolizationResultImpl>
+    implements _$$CrashSymbolizationResultImplCopyWith<$Res> {
+  __$$CrashSymbolizationResultImplCopyWithImpl(
+      _$CrashSymbolizationResultImpl _value,
+      $Res Function(_$CrashSymbolizationResultImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_CrashSymbolizationResult get _value =>
-      super._value as _$_CrashSymbolizationResult;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? crash = freezed,
+    Object? crash = null,
     Object? engineBuild = freezed,
     Object? symbolized = freezed,
-    Object? notes = freezed,
+    Object? notes = null,
   }) {
-    return _then(_$_CrashSymbolizationResult(
-      crash: crash == freezed
+    return _then(_$CrashSymbolizationResultImpl(
+      crash: null == crash
           ? _value.crash
           : crash // ignore: cast_nullable_to_non_nullable
               as Crash,
-      engineBuild: engineBuild == freezed
+      engineBuild: freezed == engineBuild
           ? _value.engineBuild
           : engineBuild // ignore: cast_nullable_to_non_nullable
               as EngineBuild?,
-      symbolized: symbolized == freezed
+      symbolized: freezed == symbolized
           ? _value.symbolized
           : symbolized // ignore: cast_nullable_to_non_nullable
               as String?,
-      notes: notes == freezed
+      notes: null == notes
           ? _value._notes
           : notes // ignore: cast_nullable_to_non_nullable
               as List<SymbolizationNote>,
@@ -2237,16 +2247,16 @@
 /// @nodoc
 
 @JsonSerializable(explicitToJson: true)
-class _$_CrashSymbolizationResult implements _CrashSymbolizationResult {
-  _$_CrashSymbolizationResult(
+class _$CrashSymbolizationResultImpl implements _CrashSymbolizationResult {
+  _$CrashSymbolizationResultImpl(
       {required this.crash,
       required this.engineBuild,
       required this.symbolized,
       final List<SymbolizationNote> notes = const []})
       : _notes = notes;
 
-  factory _$_CrashSymbolizationResult.fromJson(Map<String, dynamic> json) =>
-      _$$_CrashSymbolizationResultFromJson(json);
+  factory _$CrashSymbolizationResultImpl.fromJson(Map<String, dynamic> json) =>
+      _$$CrashSymbolizationResultImplFromJson(json);
 
   @override
   final Crash crash;
@@ -2260,6 +2270,7 @@
   @override
   @JsonKey()
   List<SymbolizationNote> get notes {
+    if (_notes is EqualUnmodifiableListView) return _notes;
     // ignore: implicit_dynamic_type
     return EqualUnmodifiableListView(_notes);
   }
@@ -2270,36 +2281,33 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_CrashSymbolizationResult &&
-            const DeepCollectionEquality().equals(other.crash, crash) &&
-            const DeepCollectionEquality()
-                .equals(other.engineBuild, engineBuild) &&
-            const DeepCollectionEquality()
-                .equals(other.symbolized, symbolized) &&
+            other is _$CrashSymbolizationResultImpl &&
+            (identical(other.crash, crash) || other.crash == crash) &&
+            (identical(other.engineBuild, engineBuild) ||
+                other.engineBuild == engineBuild) &&
+            (identical(other.symbolized, symbolized) ||
+                other.symbolized == symbolized) &&
             const DeepCollectionEquality().equals(other._notes, _notes));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(crash),
-      const DeepCollectionEquality().hash(engineBuild),
-      const DeepCollectionEquality().hash(symbolized),
+  int get hashCode => Object.hash(runtimeType, crash, engineBuild, symbolized,
       const DeepCollectionEquality().hash(_notes));
 
   @JsonKey(ignore: true)
   @override
-  _$$_CrashSymbolizationResultCopyWith<_$_CrashSymbolizationResult>
-      get copyWith => __$$_CrashSymbolizationResultCopyWithImpl<
-          _$_CrashSymbolizationResult>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$CrashSymbolizationResultImplCopyWith<_$CrashSymbolizationResultImpl>
+      get copyWith => __$$CrashSymbolizationResultImplCopyWithImpl<
+          _$CrashSymbolizationResultImpl>(this, _$identity);
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$_CrashSymbolizationResultToJson(
+    return _$$CrashSymbolizationResultImplToJson(
       this,
     );
   }
@@ -2310,10 +2318,10 @@
       {required final Crash crash,
       required final EngineBuild? engineBuild,
       required final String? symbolized,
-      final List<SymbolizationNote> notes}) = _$_CrashSymbolizationResult;
+      final List<SymbolizationNote> notes}) = _$CrashSymbolizationResultImpl;
 
   factory _CrashSymbolizationResult.fromJson(Map<String, dynamic> json) =
-      _$_CrashSymbolizationResult.fromJson;
+      _$CrashSymbolizationResultImpl.fromJson;
 
   @override
   Crash get crash;
@@ -2327,7 +2335,7 @@
   List<SymbolizationNote> get notes;
   @override
   @JsonKey(ignore: true)
-  _$$_CrashSymbolizationResultCopyWith<_$_CrashSymbolizationResult>
+  _$$CrashSymbolizationResultImplCopyWith<_$CrashSymbolizationResultImpl>
       get copyWith => throw _privateConstructorUsedError;
 }
 
@@ -2350,69 +2358,71 @@
 abstract class $SymbolizationNoteCopyWith<$Res> {
   factory $SymbolizationNoteCopyWith(
           SymbolizationNote value, $Res Function(SymbolizationNote) then) =
-      _$SymbolizationNoteCopyWithImpl<$Res>;
+      _$SymbolizationNoteCopyWithImpl<$Res, SymbolizationNote>;
+  @useResult
   $Res call({SymbolizationNoteKind kind, String? message});
 }
 
 /// @nodoc
-class _$SymbolizationNoteCopyWithImpl<$Res>
+class _$SymbolizationNoteCopyWithImpl<$Res, $Val extends SymbolizationNote>
     implements $SymbolizationNoteCopyWith<$Res> {
   _$SymbolizationNoteCopyWithImpl(this._value, this._then);
 
-  final SymbolizationNote _value;
   // ignore: unused_field
-  final $Res Function(SymbolizationNote) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? kind = freezed,
+    Object? kind = null,
     Object? message = freezed,
   }) {
     return _then(_value.copyWith(
-      kind: kind == freezed
+      kind: null == kind
           ? _value.kind
           : kind // ignore: cast_nullable_to_non_nullable
               as SymbolizationNoteKind,
-      message: message == freezed
+      message: freezed == message
           ? _value.message
           : message // ignore: cast_nullable_to_non_nullable
               as String?,
-    ));
+    ) as $Val);
   }
 }
 
 /// @nodoc
-abstract class _$$_SymbolizationNoteCopyWith<$Res>
+abstract class _$$SymbolizationNoteImplCopyWith<$Res>
     implements $SymbolizationNoteCopyWith<$Res> {
-  factory _$$_SymbolizationNoteCopyWith(_$_SymbolizationNote value,
-          $Res Function(_$_SymbolizationNote) then) =
-      __$$_SymbolizationNoteCopyWithImpl<$Res>;
+  factory _$$SymbolizationNoteImplCopyWith(_$SymbolizationNoteImpl value,
+          $Res Function(_$SymbolizationNoteImpl) then) =
+      __$$SymbolizationNoteImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call({SymbolizationNoteKind kind, String? message});
 }
 
 /// @nodoc
-class __$$_SymbolizationNoteCopyWithImpl<$Res>
-    extends _$SymbolizationNoteCopyWithImpl<$Res>
-    implements _$$_SymbolizationNoteCopyWith<$Res> {
-  __$$_SymbolizationNoteCopyWithImpl(
-      _$_SymbolizationNote _value, $Res Function(_$_SymbolizationNote) _then)
-      : super(_value, (v) => _then(v as _$_SymbolizationNote));
+class __$$SymbolizationNoteImplCopyWithImpl<$Res>
+    extends _$SymbolizationNoteCopyWithImpl<$Res, _$SymbolizationNoteImpl>
+    implements _$$SymbolizationNoteImplCopyWith<$Res> {
+  __$$SymbolizationNoteImplCopyWithImpl(_$SymbolizationNoteImpl _value,
+      $Res Function(_$SymbolizationNoteImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_SymbolizationNote get _value => super._value as _$_SymbolizationNote;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? kind = freezed,
+    Object? kind = null,
     Object? message = freezed,
   }) {
-    return _then(_$_SymbolizationNote(
-      kind: kind == freezed
+    return _then(_$SymbolizationNoteImpl(
+      kind: null == kind
           ? _value.kind
           : kind // ignore: cast_nullable_to_non_nullable
               as SymbolizationNoteKind,
-      message: message == freezed
+      message: freezed == message
           ? _value.message
           : message // ignore: cast_nullable_to_non_nullable
               as String?,
@@ -2422,11 +2432,11 @@
 
 /// @nodoc
 @JsonSerializable()
-class _$_SymbolizationNote implements _SymbolizationNote {
-  _$_SymbolizationNote({required this.kind, this.message});
+class _$SymbolizationNoteImpl implements _SymbolizationNote {
+  _$SymbolizationNoteImpl({required this.kind, this.message});
 
-  factory _$_SymbolizationNote.fromJson(Map<String, dynamic> json) =>
-      _$$_SymbolizationNoteFromJson(json);
+  factory _$SymbolizationNoteImpl.fromJson(Map<String, dynamic> json) =>
+      _$$SymbolizationNoteImplFromJson(json);
 
   @override
   final SymbolizationNoteKind kind;
@@ -2439,30 +2449,28 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_SymbolizationNote &&
-            const DeepCollectionEquality().equals(other.kind, kind) &&
-            const DeepCollectionEquality().equals(other.message, message));
+            other is _$SymbolizationNoteImpl &&
+            (identical(other.kind, kind) || other.kind == kind) &&
+            (identical(other.message, message) || other.message == message));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(kind),
-      const DeepCollectionEquality().hash(message));
+  int get hashCode => Object.hash(runtimeType, kind, message);
 
   @JsonKey(ignore: true)
   @override
-  _$$_SymbolizationNoteCopyWith<_$_SymbolizationNote> get copyWith =>
-      __$$_SymbolizationNoteCopyWithImpl<_$_SymbolizationNote>(
+  @pragma('vm:prefer-inline')
+  _$$SymbolizationNoteImplCopyWith<_$SymbolizationNoteImpl> get copyWith =>
+      __$$SymbolizationNoteImplCopyWithImpl<_$SymbolizationNoteImpl>(
           this, _$identity);
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$_SymbolizationNoteToJson(
+    return _$$SymbolizationNoteImplToJson(
       this,
     );
   }
@@ -2471,10 +2479,10 @@
 abstract class _SymbolizationNote implements SymbolizationNote {
   factory _SymbolizationNote(
       {required final SymbolizationNoteKind kind,
-      final String? message}) = _$_SymbolizationNote;
+      final String? message}) = _$SymbolizationNoteImpl;
 
   factory _SymbolizationNote.fromJson(Map<String, dynamic> json) =
-      _$_SymbolizationNote.fromJson;
+      _$SymbolizationNoteImpl.fromJson;
 
   @override
   SymbolizationNoteKind get kind;
@@ -2482,7 +2490,7 @@
   String? get message;
   @override
   @JsonKey(ignore: true)
-  _$$_SymbolizationNoteCopyWith<_$_SymbolizationNote> get copyWith =>
+  _$$SymbolizationNoteImplCopyWith<_$SymbolizationNoteImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
@@ -2509,7 +2517,8 @@
 abstract class $BotCommandCopyWith<$Res> {
   factory $BotCommandCopyWith(
           BotCommand value, $Res Function(BotCommand) then) =
-      _$BotCommandCopyWithImpl<$Res>;
+      _$BotCommandCopyWithImpl<$Res, BotCommand>;
+  @useResult
   $Res call(
       {SymbolizationOverrides overrides,
       bool symbolizeThis,
@@ -2519,50 +2528,55 @@
 }
 
 /// @nodoc
-class _$BotCommandCopyWithImpl<$Res> implements $BotCommandCopyWith<$Res> {
+class _$BotCommandCopyWithImpl<$Res, $Val extends BotCommand>
+    implements $BotCommandCopyWith<$Res> {
   _$BotCommandCopyWithImpl(this._value, this._then);
 
-  final BotCommand _value;
   // ignore: unused_field
-  final $Res Function(BotCommand) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? overrides = freezed,
-    Object? symbolizeThis = freezed,
-    Object? worklist = freezed,
+    Object? overrides = null,
+    Object? symbolizeThis = null,
+    Object? worklist = null,
   }) {
     return _then(_value.copyWith(
-      overrides: overrides == freezed
+      overrides: null == overrides
           ? _value.overrides
           : overrides // ignore: cast_nullable_to_non_nullable
               as SymbolizationOverrides,
-      symbolizeThis: symbolizeThis == freezed
+      symbolizeThis: null == symbolizeThis
           ? _value.symbolizeThis
           : symbolizeThis // ignore: cast_nullable_to_non_nullable
               as bool,
-      worklist: worklist == freezed
+      worklist: null == worklist
           ? _value.worklist
           : worklist // ignore: cast_nullable_to_non_nullable
               as Set<String>,
-    ));
+    ) as $Val);
   }
 
   @override
+  @pragma('vm:prefer-inline')
   $SymbolizationOverridesCopyWith<$Res> get overrides {
     return $SymbolizationOverridesCopyWith<$Res>(_value.overrides, (value) {
-      return _then(_value.copyWith(overrides: value));
+      return _then(_value.copyWith(overrides: value) as $Val);
     });
   }
 }
 
 /// @nodoc
-abstract class _$$_BotCommandCopyWith<$Res>
+abstract class _$$BotCommandImplCopyWith<$Res>
     implements $BotCommandCopyWith<$Res> {
-  factory _$$_BotCommandCopyWith(
-          _$_BotCommand value, $Res Function(_$_BotCommand) then) =
-      __$$_BotCommandCopyWithImpl<$Res>;
+  factory _$$BotCommandImplCopyWith(
+          _$BotCommandImpl value, $Res Function(_$BotCommandImpl) then) =
+      __$$BotCommandImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call(
       {SymbolizationOverrides overrides,
       bool symbolizeThis,
@@ -2573,31 +2587,30 @@
 }
 
 /// @nodoc
-class __$$_BotCommandCopyWithImpl<$Res> extends _$BotCommandCopyWithImpl<$Res>
-    implements _$$_BotCommandCopyWith<$Res> {
-  __$$_BotCommandCopyWithImpl(
-      _$_BotCommand _value, $Res Function(_$_BotCommand) _then)
-      : super(_value, (v) => _then(v as _$_BotCommand));
+class __$$BotCommandImplCopyWithImpl<$Res>
+    extends _$BotCommandCopyWithImpl<$Res, _$BotCommandImpl>
+    implements _$$BotCommandImplCopyWith<$Res> {
+  __$$BotCommandImplCopyWithImpl(
+      _$BotCommandImpl _value, $Res Function(_$BotCommandImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_BotCommand get _value => super._value as _$_BotCommand;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? overrides = freezed,
-    Object? symbolizeThis = freezed,
-    Object? worklist = freezed,
+    Object? overrides = null,
+    Object? symbolizeThis = null,
+    Object? worklist = null,
   }) {
-    return _then(_$_BotCommand(
-      overrides: overrides == freezed
+    return _then(_$BotCommandImpl(
+      overrides: null == overrides
           ? _value.overrides
           : overrides // ignore: cast_nullable_to_non_nullable
               as SymbolizationOverrides,
-      symbolizeThis: symbolizeThis == freezed
+      symbolizeThis: null == symbolizeThis
           ? _value.symbolizeThis
           : symbolizeThis // ignore: cast_nullable_to_non_nullable
               as bool,
-      worklist: worklist == freezed
+      worklist: null == worklist
           ? _value._worklist
           : worklist // ignore: cast_nullable_to_non_nullable
               as Set<String>,
@@ -2607,8 +2620,8 @@
 
 /// @nodoc
 
-class _$_BotCommand implements _BotCommand {
-  _$_BotCommand(
+class _$BotCommandImpl implements _BotCommand {
+  _$BotCommandImpl(
       {required this.overrides,
       required this.symbolizeThis,
       required final Set<String> worklist})
@@ -2632,6 +2645,7 @@
   /// is either in `issue-id` or in `issuecomment-id` format.
   @override
   Set<String> get worklist {
+    if (_worklist is EqualUnmodifiableSetView) return _worklist;
     // ignore: implicit_dynamic_type
     return EqualUnmodifiableSetView(_worklist);
   }
@@ -2642,34 +2656,33 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_BotCommand &&
-            const DeepCollectionEquality().equals(other.overrides, overrides) &&
-            const DeepCollectionEquality()
-                .equals(other.symbolizeThis, symbolizeThis) &&
+            other is _$BotCommandImpl &&
+            (identical(other.overrides, overrides) ||
+                other.overrides == overrides) &&
+            (identical(other.symbolizeThis, symbolizeThis) ||
+                other.symbolizeThis == symbolizeThis) &&
             const DeepCollectionEquality().equals(other._worklist, _worklist));
   }
 
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(overrides),
-      const DeepCollectionEquality().hash(symbolizeThis),
+  int get hashCode => Object.hash(runtimeType, overrides, symbolizeThis,
       const DeepCollectionEquality().hash(_worklist));
 
   @JsonKey(ignore: true)
   @override
-  _$$_BotCommandCopyWith<_$_BotCommand> get copyWith =>
-      __$$_BotCommandCopyWithImpl<_$_BotCommand>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$BotCommandImplCopyWith<_$BotCommandImpl> get copyWith =>
+      __$$BotCommandImplCopyWithImpl<_$BotCommandImpl>(this, _$identity);
 }
 
 abstract class _BotCommand implements BotCommand {
   factory _BotCommand(
       {required final SymbolizationOverrides overrides,
       required final bool symbolizeThis,
-      required final Set<String> worklist}) = _$_BotCommand;
+      required final Set<String> worklist}) = _$BotCommandImpl;
 
   @override
 
@@ -2688,7 +2701,7 @@
   Set<String> get worklist;
   @override
   @JsonKey(ignore: true)
-  _$$_BotCommandCopyWith<_$_BotCommand> get copyWith =>
+  _$$BotCommandImplCopyWith<_$BotCommandImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
 
@@ -2711,7 +2724,8 @@
 abstract class $SymbolizationOverridesCopyWith<$Res> {
   factory $SymbolizationOverridesCopyWith(SymbolizationOverrides value,
           $Res Function(SymbolizationOverrides) then) =
-      _$SymbolizationOverridesCopyWithImpl<$Res>;
+      _$SymbolizationOverridesCopyWithImpl<$Res, SymbolizationOverrides>;
+  @useResult
   $Res call(
       {String? engineHash,
       String? flutterVersion,
@@ -2723,64 +2737,69 @@
 }
 
 /// @nodoc
-class _$SymbolizationOverridesCopyWithImpl<$Res>
+class _$SymbolizationOverridesCopyWithImpl<$Res,
+        $Val extends SymbolizationOverrides>
     implements $SymbolizationOverridesCopyWith<$Res> {
   _$SymbolizationOverridesCopyWithImpl(this._value, this._then);
 
-  final SymbolizationOverrides _value;
   // ignore: unused_field
-  final $Res Function(SymbolizationOverrides) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
     Object? engineHash = freezed,
     Object? flutterVersion = freezed,
     Object? arch = freezed,
     Object? mode = freezed,
-    Object? force = freezed,
+    Object? force = null,
     Object? format = freezed,
     Object? os = freezed,
   }) {
     return _then(_value.copyWith(
-      engineHash: engineHash == freezed
+      engineHash: freezed == engineHash
           ? _value.engineHash
           : engineHash // ignore: cast_nullable_to_non_nullable
               as String?,
-      flutterVersion: flutterVersion == freezed
+      flutterVersion: freezed == flutterVersion
           ? _value.flutterVersion
           : flutterVersion // ignore: cast_nullable_to_non_nullable
               as String?,
-      arch: arch == freezed
+      arch: freezed == arch
           ? _value.arch
           : arch // ignore: cast_nullable_to_non_nullable
               as String?,
-      mode: mode == freezed
+      mode: freezed == mode
           ? _value.mode
           : mode // ignore: cast_nullable_to_non_nullable
               as String?,
-      force: force == freezed
+      force: null == force
           ? _value.force
           : force // ignore: cast_nullable_to_non_nullable
               as bool,
-      format: format == freezed
+      format: freezed == format
           ? _value.format
           : format // ignore: cast_nullable_to_non_nullable
               as String?,
-      os: os == freezed
+      os: freezed == os
           ? _value.os
           : os // ignore: cast_nullable_to_non_nullable
               as String?,
-    ));
+    ) as $Val);
   }
 }
 
 /// @nodoc
-abstract class _$$_SymbolizationOverridesCopyWith<$Res>
+abstract class _$$SymbolizationOverridesImplCopyWith<$Res>
     implements $SymbolizationOverridesCopyWith<$Res> {
-  factory _$$_SymbolizationOverridesCopyWith(_$_SymbolizationOverrides value,
-          $Res Function(_$_SymbolizationOverrides) then) =
-      __$$_SymbolizationOverridesCopyWithImpl<$Res>;
+  factory _$$SymbolizationOverridesImplCopyWith(
+          _$SymbolizationOverridesImpl value,
+          $Res Function(_$SymbolizationOverridesImpl) then) =
+      __$$SymbolizationOverridesImplCopyWithImpl<$Res>;
   @override
+  @useResult
   $Res call(
       {String? engineHash,
       String? flutterVersion,
@@ -2792,53 +2811,52 @@
 }
 
 /// @nodoc
-class __$$_SymbolizationOverridesCopyWithImpl<$Res>
-    extends _$SymbolizationOverridesCopyWithImpl<$Res>
-    implements _$$_SymbolizationOverridesCopyWith<$Res> {
-  __$$_SymbolizationOverridesCopyWithImpl(_$_SymbolizationOverrides _value,
-      $Res Function(_$_SymbolizationOverrides) _then)
-      : super(_value, (v) => _then(v as _$_SymbolizationOverrides));
+class __$$SymbolizationOverridesImplCopyWithImpl<$Res>
+    extends _$SymbolizationOverridesCopyWithImpl<$Res,
+        _$SymbolizationOverridesImpl>
+    implements _$$SymbolizationOverridesImplCopyWith<$Res> {
+  __$$SymbolizationOverridesImplCopyWithImpl(
+      _$SymbolizationOverridesImpl _value,
+      $Res Function(_$SymbolizationOverridesImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_SymbolizationOverrides get _value =>
-      super._value as _$_SymbolizationOverrides;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
     Object? engineHash = freezed,
     Object? flutterVersion = freezed,
     Object? arch = freezed,
     Object? mode = freezed,
-    Object? force = freezed,
+    Object? force = null,
     Object? format = freezed,
     Object? os = freezed,
   }) {
-    return _then(_$_SymbolizationOverrides(
-      engineHash: engineHash == freezed
+    return _then(_$SymbolizationOverridesImpl(
+      engineHash: freezed == engineHash
           ? _value.engineHash
           : engineHash // ignore: cast_nullable_to_non_nullable
               as String?,
-      flutterVersion: flutterVersion == freezed
+      flutterVersion: freezed == flutterVersion
           ? _value.flutterVersion
           : flutterVersion // ignore: cast_nullable_to_non_nullable
               as String?,
-      arch: arch == freezed
+      arch: freezed == arch
           ? _value.arch
           : arch // ignore: cast_nullable_to_non_nullable
               as String?,
-      mode: mode == freezed
+      mode: freezed == mode
           ? _value.mode
           : mode // ignore: cast_nullable_to_non_nullable
               as String?,
-      force: force == freezed
+      force: null == force
           ? _value.force
           : force // ignore: cast_nullable_to_non_nullable
               as bool,
-      format: format == freezed
+      format: freezed == format
           ? _value.format
           : format // ignore: cast_nullable_to_non_nullable
               as String?,
-      os: os == freezed
+      os: freezed == os
           ? _value.os
           : os // ignore: cast_nullable_to_non_nullable
               as String?,
@@ -2848,8 +2866,8 @@
 
 /// @nodoc
 
-class _$_SymbolizationOverrides implements _SymbolizationOverrides {
-  _$_SymbolizationOverrides(
+class _$SymbolizationOverridesImpl implements _SymbolizationOverrides {
+  _$SymbolizationOverridesImpl(
       {this.engineHash,
       this.flutterVersion,
       this.arch,
@@ -2880,37 +2898,31 @@
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_SymbolizationOverrides &&
-            const DeepCollectionEquality()
-                .equals(other.engineHash, engineHash) &&
-            const DeepCollectionEquality()
-                .equals(other.flutterVersion, flutterVersion) &&
-            const DeepCollectionEquality().equals(other.arch, arch) &&
-            const DeepCollectionEquality().equals(other.mode, mode) &&
-            const DeepCollectionEquality().equals(other.force, force) &&
-            const DeepCollectionEquality().equals(other.format, format) &&
-            const DeepCollectionEquality().equals(other.os, os));
+            other is _$SymbolizationOverridesImpl &&
+            (identical(other.engineHash, engineHash) ||
+                other.engineHash == engineHash) &&
+            (identical(other.flutterVersion, flutterVersion) ||
+                other.flutterVersion == flutterVersion) &&
+            (identical(other.arch, arch) || other.arch == arch) &&
+            (identical(other.mode, mode) || other.mode == mode) &&
+            (identical(other.force, force) || other.force == force) &&
+            (identical(other.format, format) || other.format == format) &&
+            (identical(other.os, os) || other.os == os));
   }
 
   @override
   int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(engineHash),
-      const DeepCollectionEquality().hash(flutterVersion),
-      const DeepCollectionEquality().hash(arch),
-      const DeepCollectionEquality().hash(mode),
-      const DeepCollectionEquality().hash(force),
-      const DeepCollectionEquality().hash(format),
-      const DeepCollectionEquality().hash(os));
+      runtimeType, engineHash, flutterVersion, arch, mode, force, format, os);
 
   @JsonKey(ignore: true)
   @override
-  _$$_SymbolizationOverridesCopyWith<_$_SymbolizationOverrides> get copyWith =>
-      __$$_SymbolizationOverridesCopyWithImpl<_$_SymbolizationOverrides>(
-          this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$SymbolizationOverridesImplCopyWith<_$SymbolizationOverridesImpl>
+      get copyWith => __$$SymbolizationOverridesImplCopyWithImpl<
+          _$SymbolizationOverridesImpl>(this, _$identity);
 }
 
 abstract class _SymbolizationOverrides implements SymbolizationOverrides {
@@ -2921,7 +2933,7 @@
       final String? mode,
       final bool force,
       final String? format,
-      final String? os}) = _$_SymbolizationOverrides;
+      final String? os}) = _$SymbolizationOverridesImpl;
 
   @override
   String? get engineHash;
@@ -2939,8 +2951,8 @@
   String? get os;
   @override
   @JsonKey(ignore: true)
-  _$$_SymbolizationOverridesCopyWith<_$_SymbolizationOverrides> get copyWith =>
-      throw _privateConstructorUsedError;
+  _$$SymbolizationOverridesImplCopyWith<_$SymbolizationOverridesImpl>
+      get copyWith => throw _privateConstructorUsedError;
 }
 
 ServerConfig _$ServerConfigFromJson(Map<String, dynamic> json) {
@@ -2950,8 +2962,6 @@
 /// @nodoc
 mixin _$ServerConfig {
   String get githubToken => throw _privateConstructorUsedError;
-  String get sendgridToken => throw _privateConstructorUsedError;
-  String get failureEmail => throw _privateConstructorUsedError;
 
   Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
   @JsonKey(ignore: true)
@@ -2963,159 +2973,122 @@
 abstract class $ServerConfigCopyWith<$Res> {
   factory $ServerConfigCopyWith(
           ServerConfig value, $Res Function(ServerConfig) then) =
-      _$ServerConfigCopyWithImpl<$Res>;
-  $Res call({String githubToken, String sendgridToken, String failureEmail});
+      _$ServerConfigCopyWithImpl<$Res, ServerConfig>;
+  @useResult
+  $Res call({String githubToken});
 }
 
 /// @nodoc
-class _$ServerConfigCopyWithImpl<$Res> implements $ServerConfigCopyWith<$Res> {
+class _$ServerConfigCopyWithImpl<$Res, $Val extends ServerConfig>
+    implements $ServerConfigCopyWith<$Res> {
   _$ServerConfigCopyWithImpl(this._value, this._then);
 
-  final ServerConfig _value;
   // ignore: unused_field
-  final $Res Function(ServerConfig) _then;
+  final $Val _value;
+  // ignore: unused_field
+  final $Res Function($Val) _then;
 
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? githubToken = freezed,
-    Object? sendgridToken = freezed,
-    Object? failureEmail = freezed,
+    Object? githubToken = null,
   }) {
     return _then(_value.copyWith(
-      githubToken: githubToken == freezed
+      githubToken: null == githubToken
           ? _value.githubToken
           : githubToken // ignore: cast_nullable_to_non_nullable
               as String,
-      sendgridToken: sendgridToken == freezed
-          ? _value.sendgridToken
-          : sendgridToken // ignore: cast_nullable_to_non_nullable
-              as String,
-      failureEmail: failureEmail == freezed
-          ? _value.failureEmail
-          : failureEmail // ignore: cast_nullable_to_non_nullable
-              as String,
-    ));
+    ) as $Val);
   }
 }
 
 /// @nodoc
-abstract class _$$_ServerConfigCopyWith<$Res>
+abstract class _$$ServerConfigImplCopyWith<$Res>
     implements $ServerConfigCopyWith<$Res> {
-  factory _$$_ServerConfigCopyWith(
-          _$_ServerConfig value, $Res Function(_$_ServerConfig) then) =
-      __$$_ServerConfigCopyWithImpl<$Res>;
+  factory _$$ServerConfigImplCopyWith(
+          _$ServerConfigImpl value, $Res Function(_$ServerConfigImpl) then) =
+      __$$ServerConfigImplCopyWithImpl<$Res>;
   @override
-  $Res call({String githubToken, String sendgridToken, String failureEmail});
+  @useResult
+  $Res call({String githubToken});
 }
 
 /// @nodoc
-class __$$_ServerConfigCopyWithImpl<$Res>
-    extends _$ServerConfigCopyWithImpl<$Res>
-    implements _$$_ServerConfigCopyWith<$Res> {
-  __$$_ServerConfigCopyWithImpl(
-      _$_ServerConfig _value, $Res Function(_$_ServerConfig) _then)
-      : super(_value, (v) => _then(v as _$_ServerConfig));
+class __$$ServerConfigImplCopyWithImpl<$Res>
+    extends _$ServerConfigCopyWithImpl<$Res, _$ServerConfigImpl>
+    implements _$$ServerConfigImplCopyWith<$Res> {
+  __$$ServerConfigImplCopyWithImpl(
+      _$ServerConfigImpl _value, $Res Function(_$ServerConfigImpl) _then)
+      : super(_value, _then);
 
-  @override
-  _$_ServerConfig get _value => super._value as _$_ServerConfig;
-
+  @pragma('vm:prefer-inline')
   @override
   $Res call({
-    Object? githubToken = freezed,
-    Object? sendgridToken = freezed,
-    Object? failureEmail = freezed,
+    Object? githubToken = null,
   }) {
-    return _then(_$_ServerConfig(
-      githubToken: githubToken == freezed
+    return _then(_$ServerConfigImpl(
+      githubToken: null == githubToken
           ? _value.githubToken
           : githubToken // ignore: cast_nullable_to_non_nullable
               as String,
-      sendgridToken: sendgridToken == freezed
-          ? _value.sendgridToken
-          : sendgridToken // ignore: cast_nullable_to_non_nullable
-              as String,
-      failureEmail: failureEmail == freezed
-          ? _value.failureEmail
-          : failureEmail // ignore: cast_nullable_to_non_nullable
-              as String,
     ));
   }
 }
 
 /// @nodoc
 @JsonSerializable()
-class _$_ServerConfig implements _ServerConfig {
-  _$_ServerConfig(
-      {required this.githubToken,
-      required this.sendgridToken,
-      required this.failureEmail});
+class _$ServerConfigImpl implements _ServerConfig {
+  _$ServerConfigImpl({required this.githubToken});
 
-  factory _$_ServerConfig.fromJson(Map<String, dynamic> json) =>
-      _$$_ServerConfigFromJson(json);
+  factory _$ServerConfigImpl.fromJson(Map<String, dynamic> json) =>
+      _$$ServerConfigImplFromJson(json);
 
   @override
   final String githubToken;
-  @override
-  final String sendgridToken;
-  @override
-  final String failureEmail;
 
   @override
   String toString() {
-    return 'ServerConfig(githubToken: $githubToken, sendgridToken: $sendgridToken, failureEmail: $failureEmail)';
+    return 'ServerConfig(githubToken: $githubToken)';
   }
 
   @override
-  bool operator ==(dynamic other) {
+  bool operator ==(Object other) {
     return identical(this, other) ||
         (other.runtimeType == runtimeType &&
-            other is _$_ServerConfig &&
-            const DeepCollectionEquality()
-                .equals(other.githubToken, githubToken) &&
-            const DeepCollectionEquality()
-                .equals(other.sendgridToken, sendgridToken) &&
-            const DeepCollectionEquality()
-                .equals(other.failureEmail, failureEmail));
+            other is _$ServerConfigImpl &&
+            (identical(other.githubToken, githubToken) ||
+                other.githubToken == githubToken));
   }
 
   @JsonKey(ignore: true)
   @override
-  int get hashCode => Object.hash(
-      runtimeType,
-      const DeepCollectionEquality().hash(githubToken),
-      const DeepCollectionEquality().hash(sendgridToken),
-      const DeepCollectionEquality().hash(failureEmail));
+  int get hashCode => Object.hash(runtimeType, githubToken);
 
   @JsonKey(ignore: true)
   @override
-  _$$_ServerConfigCopyWith<_$_ServerConfig> get copyWith =>
-      __$$_ServerConfigCopyWithImpl<_$_ServerConfig>(this, _$identity);
+  @pragma('vm:prefer-inline')
+  _$$ServerConfigImplCopyWith<_$ServerConfigImpl> get copyWith =>
+      __$$ServerConfigImplCopyWithImpl<_$ServerConfigImpl>(this, _$identity);
 
   @override
   Map<String, dynamic> toJson() {
-    return _$$_ServerConfigToJson(
+    return _$$ServerConfigImplToJson(
       this,
     );
   }
 }
 
 abstract class _ServerConfig implements ServerConfig {
-  factory _ServerConfig(
-      {required final String githubToken,
-      required final String sendgridToken,
-      required final String failureEmail}) = _$_ServerConfig;
+  factory _ServerConfig({required final String githubToken}) =
+      _$ServerConfigImpl;
 
   factory _ServerConfig.fromJson(Map<String, dynamic> json) =
-      _$_ServerConfig.fromJson;
+      _$ServerConfigImpl.fromJson;
 
   @override
   String get githubToken;
   @override
-  String get sendgridToken;
-  @override
-  String get failureEmail;
-  @override
   @JsonKey(ignore: true)
-  _$$_ServerConfigCopyWith<_$_ServerConfig> get copyWith =>
+  _$$ServerConfigImplCopyWith<_$ServerConfigImpl> get copyWith =>
       throw _privateConstructorUsedError;
 }
diff --git a/github-label-notifier/symbolizer/lib/model.g.dart b/github-label-notifier/symbolizer/lib/model.g.dart
index bb1e749..33f04cd 100644
--- a/github-label-notifier/symbolizer/lib/model.g.dart
+++ b/github-label-notifier/symbolizer/lib/model.g.dart
@@ -1,39 +1,39 @@
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
-part of symbolizer.model;
+part of 'model.dart';
 
 // **************************************************************************
 // JsonSerializableGenerator
 // **************************************************************************
 
-_$_EngineVariant _$$_EngineVariantFromJson(Map<String, dynamic> json) =>
-    _$_EngineVariant(
+_$EngineVariantImpl _$$EngineVariantImplFromJson(Map<String, dynamic> json) =>
+    _$EngineVariantImpl(
       os: json['os'] as String,
       arch: json['arch'] as String?,
       mode: json['mode'] as String?,
     );
 
-Map<String, dynamic> _$$_EngineVariantToJson(_$_EngineVariant instance) =>
+Map<String, dynamic> _$$EngineVariantImplToJson(_$EngineVariantImpl instance) =>
     <String, dynamic>{
       'os': instance.os,
       'arch': instance.arch,
       'mode': instance.mode,
     };
 
-_$_EngineBuild _$$_EngineBuildFromJson(Map<String, dynamic> json) =>
-    _$_EngineBuild(
+_$EngineBuildImpl _$$EngineBuildImplFromJson(Map<String, dynamic> json) =>
+    _$EngineBuildImpl(
       engineHash: json['engineHash'] as String,
       variant: EngineVariant.fromJson(json['variant'] as Map<String, dynamic>),
     );
 
-Map<String, dynamic> _$$_EngineBuildToJson(_$_EngineBuild instance) =>
+Map<String, dynamic> _$$EngineBuildImplToJson(_$EngineBuildImpl instance) =>
     <String, dynamic>{
       'engineHash': instance.engineHash,
       'variant': instance.variant,
     };
 
-_$IosCrashFrame _$$IosCrashFrameFromJson(Map<String, dynamic> json) =>
-    _$IosCrashFrame(
+_$IosCrashFrameImpl _$$IosCrashFrameImplFromJson(Map<String, dynamic> json) =>
+    _$IosCrashFrameImpl(
       no: json['no'] as String,
       binary: json['binary'] as String,
       pc: json['pc'] as int,
@@ -43,7 +43,7 @@
       $type: json['runtimeType'] as String?,
     );
 
-Map<String, dynamic> _$$IosCrashFrameToJson(_$IosCrashFrame instance) =>
+Map<String, dynamic> _$$IosCrashFrameImplToJson(_$IosCrashFrameImpl instance) =>
     <String, dynamic>{
       'no': instance.no,
       'binary': instance.binary,
@@ -54,8 +54,9 @@
       'runtimeType': instance.$type,
     };
 
-_$AndroidCrashFrame _$$AndroidCrashFrameFromJson(Map<String, dynamic> json) =>
-    _$AndroidCrashFrame(
+_$AndroidCrashFrameImpl _$$AndroidCrashFrameImplFromJson(
+        Map<String, dynamic> json) =>
+    _$AndroidCrashFrameImpl(
       no: json['no'] as String,
       pc: json['pc'] as int,
       binary: json['binary'] as String,
@@ -64,7 +65,8 @@
       $type: json['runtimeType'] as String?,
     );
 
-Map<String, dynamic> _$$AndroidCrashFrameToJson(_$AndroidCrashFrame instance) =>
+Map<String, dynamic> _$$AndroidCrashFrameImplToJson(
+        _$AndroidCrashFrameImpl instance) =>
     <String, dynamic>{
       'no': instance.no,
       'pc': instance.pc,
@@ -74,8 +76,9 @@
       'runtimeType': instance.$type,
     };
 
-_$CustomCrashFrame _$$CustomCrashFrameFromJson(Map<String, dynamic> json) =>
-    _$CustomCrashFrame(
+_$CustomCrashFrameImpl _$$CustomCrashFrameImplFromJson(
+        Map<String, dynamic> json) =>
+    _$CustomCrashFrameImpl(
       no: json['no'] as String,
       pc: json['pc'] as int,
       binary: json['binary'] as String,
@@ -85,7 +88,8 @@
       $type: json['runtimeType'] as String?,
     );
 
-Map<String, dynamic> _$$CustomCrashFrameToJson(_$CustomCrashFrame instance) =>
+Map<String, dynamic> _$$CustomCrashFrameImplToJson(
+        _$CustomCrashFrameImpl instance) =>
     <String, dynamic>{
       'no': instance.no,
       'pc': instance.pc,
@@ -96,15 +100,17 @@
       'runtimeType': instance.$type,
     };
 
-_$DartvmCrashFrame _$$DartvmCrashFrameFromJson(Map<String, dynamic> json) =>
-    _$DartvmCrashFrame(
+_$DartvmCrashFrameImpl _$$DartvmCrashFrameImplFromJson(
+        Map<String, dynamic> json) =>
+    _$DartvmCrashFrameImpl(
       pc: json['pc'] as int,
       binary: json['binary'] as String,
       offset: json['offset'] as int,
       $type: json['runtimeType'] as String?,
     );
 
-Map<String, dynamic> _$$DartvmCrashFrameToJson(_$DartvmCrashFrame instance) =>
+Map<String, dynamic> _$$DartvmCrashFrameImplToJson(
+        _$DartvmCrashFrameImpl instance) =>
     <String, dynamic>{
       'pc': instance.pc,
       'binary': instance.binary,
@@ -112,7 +118,7 @@
       'runtimeType': instance.$type,
     };
 
-_$_Crash _$$_CrashFromJson(Map<String, dynamic> json) => _$_Crash(
+_$CrashImpl _$$CrashImplFromJson(Map<String, dynamic> json) => _$CrashImpl(
       engineVariant:
           EngineVariant.fromJson(json['engineVariant'] as Map<String, dynamic>),
       frames: (json['frames'] as List<dynamic>)
@@ -122,16 +128,17 @@
       androidMajorVersion: json['androidMajorVersion'] as int?,
     );
 
-Map<String, dynamic> _$$_CrashToJson(_$_Crash instance) => <String, dynamic>{
+Map<String, dynamic> _$$CrashImplToJson(_$CrashImpl instance) =>
+    <String, dynamic>{
       'engineVariant': instance.engineVariant,
       'frames': instance.frames,
       'format': instance.format,
       'androidMajorVersion': instance.androidMajorVersion,
     };
 
-_$SymbolizationResultOk _$$SymbolizationResultOkFromJson(
+_$SymbolizationResultOkImpl _$$SymbolizationResultOkImplFromJson(
         Map<String, dynamic> json) =>
-    _$SymbolizationResultOk(
+    _$SymbolizationResultOkImpl(
       results: (json['results'] as List<dynamic>)
           .map((e) =>
               CrashSymbolizationResult.fromJson(e as Map<String, dynamic>))
@@ -139,30 +146,30 @@
       $type: json['runtimeType'] as String?,
     );
 
-Map<String, dynamic> _$$SymbolizationResultOkToJson(
-        _$SymbolizationResultOk instance) =>
+Map<String, dynamic> _$$SymbolizationResultOkImplToJson(
+        _$SymbolizationResultOkImpl instance) =>
     <String, dynamic>{
       'results': instance.results.map((e) => e.toJson()).toList(),
       'runtimeType': instance.$type,
     };
 
-_$SymbolizationResultError _$$SymbolizationResultErrorFromJson(
+_$SymbolizationResultErrorImpl _$$SymbolizationResultErrorImplFromJson(
         Map<String, dynamic> json) =>
-    _$SymbolizationResultError(
+    _$SymbolizationResultErrorImpl(
       error: SymbolizationNote.fromJson(json['error'] as Map<String, dynamic>),
       $type: json['runtimeType'] as String?,
     );
 
-Map<String, dynamic> _$$SymbolizationResultErrorToJson(
-        _$SymbolizationResultError instance) =>
+Map<String, dynamic> _$$SymbolizationResultErrorImplToJson(
+        _$SymbolizationResultErrorImpl instance) =>
     <String, dynamic>{
       'error': instance.error.toJson(),
       'runtimeType': instance.$type,
     };
 
-_$_CrashSymbolizationResult _$$_CrashSymbolizationResultFromJson(
+_$CrashSymbolizationResultImpl _$$CrashSymbolizationResultImplFromJson(
         Map<String, dynamic> json) =>
-    _$_CrashSymbolizationResult(
+    _$CrashSymbolizationResultImpl(
       crash: Crash.fromJson(json['crash'] as Map<String, dynamic>),
       engineBuild: json['engineBuild'] == null
           ? null
@@ -175,8 +182,8 @@
           const [],
     );
 
-Map<String, dynamic> _$$_CrashSymbolizationResultToJson(
-        _$_CrashSymbolizationResult instance) =>
+Map<String, dynamic> _$$CrashSymbolizationResultImplToJson(
+        _$CrashSymbolizationResultImpl instance) =>
     <String, dynamic>{
       'crash': instance.crash.toJson(),
       'engineBuild': instance.engineBuild?.toJson(),
@@ -184,14 +191,15 @@
       'notes': instance.notes.map((e) => e.toJson()).toList(),
     };
 
-_$_SymbolizationNote _$$_SymbolizationNoteFromJson(Map<String, dynamic> json) =>
-    _$_SymbolizationNote(
+_$SymbolizationNoteImpl _$$SymbolizationNoteImplFromJson(
+        Map<String, dynamic> json) =>
+    _$SymbolizationNoteImpl(
       kind: $enumDecode(_$SymbolizationNoteKindEnumMap, json['kind']),
       message: json['message'] as String?,
     );
 
-Map<String, dynamic> _$$_SymbolizationNoteToJson(
-        _$_SymbolizationNote instance) =>
+Map<String, dynamic> _$$SymbolizationNoteImplToJson(
+        _$SymbolizationNoteImpl instance) =>
     <String, dynamic>{
       'kind': _$SymbolizationNoteKindEnumMap[instance.kind]!,
       'message': instance.message,
@@ -213,16 +221,12 @@
   SymbolizationNoteKind.exceptionWhileParsing: 'exceptionWhileParsing',
 };
 
-_$_ServerConfig _$$_ServerConfigFromJson(Map<String, dynamic> json) =>
-    _$_ServerConfig(
+_$ServerConfigImpl _$$ServerConfigImplFromJson(Map<String, dynamic> json) =>
+    _$ServerConfigImpl(
       githubToken: json['githubToken'] as String,
-      sendgridToken: json['sendgridToken'] as String,
-      failureEmail: json['failureEmail'] as String,
     );
 
-Map<String, dynamic> _$$_ServerConfigToJson(_$_ServerConfig instance) =>
+Map<String, dynamic> _$$ServerConfigImplToJson(_$ServerConfigImpl instance) =>
     <String, dynamic>{
       'githubToken': instance.githubToken,
-      'sendgridToken': instance.sendgridToken,
-      'failureEmail': instance.failureEmail,
     };
diff --git a/github-label-notifier/symbolizer/lib/ndk.dart b/github-label-notifier/symbolizer/lib/ndk.dart
index bbc3671..cd92d7a 100644
--- a/github-label-notifier/symbolizer/lib/ndk.dart
+++ b/github-label-notifier/symbolizer/lib/ndk.dart
@@ -8,13 +8,21 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:collection/collection.dart';
+import 'package:logging/logging.dart';
 import 'package:path/path.dart' as p;
 
+final _log = Logger('tools');
+
 class Ndk {
+  final LlvmTools llvmTools;
+
+  Ndk({required this.llvmTools});
+
   /// Return information about .text section from the given [object] file.
   Future<SectionInfo> getTextSectionInfo(String object) async {
     final result =
-        await _run(_readelfBinary, ['--elf-output-style=GNU', '-l', object]);
+        await _run(llvmTools.readobj, ['--elf-output-style=GNU', '-l', object]);
     for (var match in _loadCommandPattern.allMatches(result)) {
       if (match.namedGroup('flags')!.trim() == 'R E') {
         // Found .text section
@@ -31,7 +39,7 @@
   /// Return build-id of the given [object] file.
   Future<String> getBuildId(String object) async {
     final result =
-        await _run(_readelfBinary, ['--elf-output-style=GNU', '-n', object]);
+        await _run(llvmTools.readobj, ['--elf-output-style=GNU', '-n', object]);
     final match = _buildIdPattern.firstMatch(result);
     if (match == null) {
       throw 'Failed to extract build-id from $object';
@@ -45,7 +53,7 @@
       {required String object,
       required List<String> addresses,
       String? arch}) async {
-    final result = await _run(_llvmSymbolizerBinary, [
+    final result = await _run(llvmTools.symbolizer, [
       if (arch != null) '--default-arch=$arch',
       '--obj',
       object,
@@ -69,7 +77,7 @@
     required String arch,
   }) async* {
     final process =
-        await Process.start(_llvmObjdumpBinary, ['--arch=$arch', '-d', object]);
+        await Process.start(llvmTools.objdump, ['--arch=$arch', '-d', object]);
 
     await for (var line in process.stdout
         .transform(utf8.decoder)
@@ -102,14 +110,81 @@
   });
 }
 
-final _platform = Platform.isLinux ? 'linux' : 'darwin';
-final _ndkDir = 'tools/android-ndk';
-final _llvmSymbolizerBinary =
-    '$_ndkDir/toolchains/llvm/prebuilt/$_platform-x86_64/bin/llvm-symbolizer';
-final _llvmObjdumpBinary =
-    '$_ndkDir/toolchains/llvm/prebuilt/$_platform-x86_64/bin/llvm-objdump';
-final _readelfBinary =
-    '$_ndkDir/toolchains/llvm/prebuilt/$_platform-x86_64/bin/llvm-readobj';
+class LlvmTools {
+  final String symbolizer;
+  final String objdump;
+  final String readobj;
+
+  LlvmTools._({
+    required this.symbolizer,
+    required this.readobj,
+    required this.objdump,
+  });
+
+  @override
+  String toString() => 'LlvmTools($symbolizer, $objdump, $readobj)';
+
+  static LlvmTools? _at(String root) {
+    _log.info(
+        'checking for llvm-{symbolizer,readobj,objdump} in ${root.isEmpty ? '\$PATH' : root}');
+    final tools = LlvmTools._(
+        symbolizer: p.join(root, 'llvm-symbolizer'),
+        readobj: p.join(root, 'llvm-readobj'),
+        objdump: p.join(root, 'llvm-objdump'));
+    return tools._checkOperational() ? tools : null;
+  }
+
+  bool _checkOperational() {
+    bool checkBinary(String path) {
+      try {
+        final result = Process.runSync(path, ['--help']);
+        return result.exitCode == 0 && result.stdout.startsWith('OVERVIEW: ');
+      } catch (_) {
+        return false;
+      }
+    }
+
+    return checkBinary(symbolizer) &&
+        checkBinary(objdump) &&
+        checkBinary(readobj);
+  }
+
+  static LlvmTools? findTools() {
+    final homeDir = Platform.environment['HOME'] ?? '';
+    return LlvmTools._at('') ??
+        _ndkTools('tools/android-ndk') ??
+        _tryFindNdkAt(p.join(homeDir, 'Library/Android/sdk/ndk')) ??
+        _tryFindNdkAt(p.join(homeDir, 'Android/Sdk/ndk'));
+  }
+
+  static LlvmTools? _tryFindNdkAt(String path) {
+    try {
+      final ndksDir = Directory(path);
+      int majorVersion(String v) {
+        return int.tryParse(v.split('.').first) ?? 0;
+      }
+
+      final ndkVersions = [
+        for (var entry in ndksDir.listSync())
+          if (entry is Directory) p.basename(entry.path),
+      ]..sort((a, b) => majorVersion(b).compareTo(majorVersion(a)));
+
+      return ndkVersions
+          .map((name) => _ndkTools(p.join(path, name)))
+          .whereType<LlvmTools>()
+          .firstOrNull;
+    } catch (_) {
+      return null;
+    }
+  }
+
+  static LlvmTools? _ndkTools(String path) {
+    final platform = Platform.isLinux ? 'linux' : 'darwin';
+    return LlvmTools._at(
+        '$path/toolchains/llvm/prebuilt/$platform-x86_64/bin/');
+  }
+}
+
 final _buildIdPattern = RegExp(r'Build ID:\s+(?<id>[0-9a-f]+)');
 final _loadCommandPattern = RegExp(
     r'^\s+LOAD\s+(?<offset>0x[0-9a-f]+)\s+(?<vma>0x[0-9a-f]+)\s+(?<phys>0x[0-9a-f]+)\s+(?<filesz>0x[0-9a-f]+)\s+(?<memsz>0x[0-9a-f]+)\s+(?<flags>[^0]+)\s+0x[0-9a-f]+\s*$',
diff --git a/github-label-notifier/symbolizer/lib/server.dart b/github-label-notifier/symbolizer/lib/server.dart
deleted file mode 100644
index 47822d1..0000000
--- a/github-label-notifier/symbolizer/lib/server.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// HTTP API for [symbolizer.bot] and [symbolizer.symbolizer] functionality.
-library symbolizer.server;
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:github/github.dart';
-import 'package:github/hooks.dart';
-import 'package:logging/logging.dart';
-import 'package:pedantic/pedantic.dart';
-
-import 'package:symbolizer/bot.dart';
-import 'package:symbolizer/symbolizer.dart';
-
-final _log = Logger('server');
-
-typedef _RequestHandler = Future<Object> Function(Map<String, dynamic> request);
-
-Future<void> serve(Object address, int port,
-    {required Symbolizer symbolizer, required Bot bot}) async {
-  final handlers = <String, _RequestHandler>{
-    '/symbolize': (issue) => symbolizer.symbolize(issue['body']),
-    '/command': (event) async {
-      final repoOrgMember = const {'MEMBER', 'OWNER'}
-          .contains(event['comment']['author_association']);
-      final commentEvent = IssueCommentEvent.fromJson(event);
-      final repo = RepositorySlug.full(event['repository']['full_name']);
-      await bot.executeCommand(repo, commentEvent.issue!, commentEvent.comment!,
-          authorized: repoOrgMember);
-      return {'status': 'ok'};
-    },
-  };
-
-  // Start the server.
-  final server = await HttpServer.bind(address, port);
-  _log.info('Listening on ${server.address}:${server.port}');
-
-  // Intentionally not processing requests in parallel to avoid racing
-  // in symbol cache.
-  await for (HttpRequest request in server) {
-    _log.info('Incoming request: ${request.method} ${request.requestedUri}');
-    final handler = handlers[request.requestedUri.path];
-    if (request.method != 'POST' || handler == null) {
-      request.response
-        ..statusCode = 404
-        ..write('Not found');
-      unawaited(request.response.close());
-      continue;
-    }
-    try {
-      final requestObj =
-          await utf8.decoder.bind(request).transform(json.decoder).first;
-      final responseJson =
-          jsonEncode(await handler(requestObj as Map<String, dynamic>));
-      request.response
-        ..statusCode = HttpStatus.ok
-        ..headers.add(HttpHeaders.contentTypeHeader, 'application/json')
-        ..write(responseJson);
-    } catch (e, st) {
-      request.response
-        ..statusCode = HttpStatus.internalServerError
-        ..headers.add(HttpHeaders.contentTypeHeader, 'application/json')
-        ..write(jsonEncode({
-          'status': 'error',
-          'message': e.toString(),
-          'stacktrace': st.toString(),
-        }));
-    }
-    unawaited(request.response.close());
-  }
-}
diff --git a/github-label-notifier/symbolizer/lib/symbolizer.dart b/github-label-notifier/symbolizer/lib/symbolizer.dart
index 5c30daa..ffdaaf4 100644
--- a/github-label-notifier/symbolizer/lib/symbolizer.dart
+++ b/github-label-notifier/symbolizer/lib/symbolizer.dart
@@ -173,7 +173,7 @@
       } catch (e) {
         return _failedToSymbolize(
             crash, SymbolizationNoteKind.exceptionWhileLookingByBuildId,
-            error: '($buildId) $e');
+            error: 'build-id: $buildId\n$e');
       }
     }
 
diff --git a/github-label-notifier/symbolizer/lib/symbols.dart b/github-label-notifier/symbolizer/lib/symbols.dart
index 72c08ab..fd4875c 100644
--- a/github-label-notifier/symbolizer/lib/symbols.dart
+++ b/github-label-notifier/symbolizer/lib/symbols.dart
@@ -123,7 +123,7 @@
         return engineBuild;
       }
     }
-    throw 'Failed to find build with matching buildId ($buildId)';
+    throw 'Failed to find build with matching buildId';
   }
 
   File get _cacheStateFile => File(p.join(_path, 'cache.json'));
@@ -162,7 +162,7 @@
   }
 
   String _cacheDirectoryFor(EngineBuild build, {String suffix = ''}) =>
-      'symbols-cache/${build.engineHash}-${build.variant.toArtifactPath()}'
+      '$_path/${build.engineHash}-${build.variant.toArtifactPath()}'
       '${suffix.isNotEmpty ? '-' : ''}$suffix';
 
   Future<String> _getImpl(String targetDir, EngineBuild build,
diff --git a/github-label-notifier/symbolizer/pubspec.yaml b/github-label-notifier/symbolizer/pubspec.yaml
index 92e5c05..b52d9ae 100644
--- a/github-label-notifier/symbolizer/pubspec.yaml
+++ b/github-label-notifier/symbolizer/pubspec.yaml
@@ -7,26 +7,27 @@
 publish_to: none
 
 environment:
-  sdk: '>=2.17.0 <4.0.0'
+  sdk: '>=3.0.0 <4.0.0'
+
+executables:
+  symbolize:
 
 dependencies:
-  args: ^2.3.1
-  corsac_jwt: ^1.0.0-nullsafety.1
-  freezed_annotation: ^2.1.0
-  github: ^9.4.0
-  http: ^0.13.5
-  json_annotation: ^4.6.0
-  logging: ^1.0.2
-  meta: ^1.8.0
-  path: ^1.8.2
-  pedantic: ^1.11.1
-  sendgrid_mailer: ^0.1.3
-  collection: ^1.15.0-nullsafety.4
+  args: ^2.4.2
+  freezed_annotation: ^2.4.1
+  github: ^9.24.0
+  http: ^1.2.1
+  json_annotation: ^4.8.1
+  logging: ^1.2.0
+  meta: ^1.12.0
+  path: ^1.9.0
+  collection: ^1.18.0
+  ansicolor: ^2.0.2
 
 dev_dependencies:
-  build_runner: ^2.2.0
-  freezed: ^2.1.0+1
-  json_serializable: ^6.3.1
-  lints: ^2.0.0
-  mockito: ^5.3.0
-  test: ^1.21.4
+  build_runner: ^2.4.8
+  freezed: ^2.4.7
+  json_serializable: ^6.7.1
+  lints: ^3.0.0
+  mockito: ^5.4.0
+  test: ^1.25.2
diff --git a/github-label-notifier/symbolizer/test/bot_test.dart b/github-label-notifier/symbolizer/test/bot_test.dart
deleted file mode 100644
index c467348..0000000
--- a/github-label-notifier/symbolizer/test/bot_test.dart
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:github/github.dart';
-import 'package:mockito/annotations.dart';
-import 'package:mockito/mockito.dart';
-import 'package:path/path.dart' as p;
-import 'package:symbolizer/bot.dart';
-import 'package:symbolizer/config.dart';
-import 'package:symbolizer/model.dart';
-import 'package:symbolizer/ndk.dart';
-import 'package:symbolizer/symbols.dart';
-import 'package:test/test.dart';
-
-import 'package:symbolizer/symbolizer.dart';
-
-@GenerateNiceMocks([
-  MockSpec<GitHub>(),
-  MockSpec<IssuesService>(),
-])
-import 'bot_test.mocks.dart';
-
-class SymbolsCacheProxy implements SymbolsCache {
-  final SymbolsCache impl;
-  final bool shouldThrow;
-  SymbolsCacheProxy(this.impl, {this.shouldThrow = false});
-
-  @override
-  Future<EngineBuild> findVariantByBuildId(
-      {required String engineHash,
-      required EngineVariant variant,
-      String? buildId}) {
-    return impl.findVariantByBuildId(
-        engineHash: engineHash, variant: variant, buildId: buildId);
-  }
-
-  @override
-  Future<String> get(EngineBuild build) {
-    if (shouldThrow) {
-      throw 'Failed to download $build';
-    }
-    return impl.get(build);
-  }
-
-  @override
-  Future<String> getEngineBinary(EngineBuild build) =>
-      impl.getEngineBinary(build);
-}
-
-final regenerateExpectations =
-    bool.fromEnvironment('REGENERATE_EXPECTATIONS') ||
-        Platform.environment['REGENERATE_EXPECTATIONS'] == 'true';
-
-final config = loadConfigFromFile();
-
-void main() {
-  group('command parsing', () {
-    test('nothing to do', () {
-      expect(Bot.parseCommand(0, 'x64'), isNull);
-      expect(Bot.parseCommand(0, 'x64 debug'), isNull);
-      expect(Bot.parseCommand(0, 'x64\n@flutter-symbolizer-bot'), isNull);
-    });
-    test('simple', () {
-      expect(
-          Bot.parseCommand(0, '@flutter-symbolizer-bot'),
-          equals(BotCommand(
-            overrides: SymbolizationOverrides(),
-            symbolizeThis: false,
-            worklist: <String>{},
-          )));
-    });
-    test('with arch', () {
-      for (var arch in ['arm', 'arm64', 'x86', 'x64']) {
-        expect(
-            Bot.parseCommand(0, '@flutter-symbolizer-bot $arch'),
-            equals(BotCommand(
-              overrides: SymbolizationOverrides(arch: arch),
-              symbolizeThis: false,
-              worklist: <String>{},
-            )));
-      }
-    });
-    test('with mode', () {
-      for (var mode in ['profile', 'release', 'debug']) {
-        expect(
-            Bot.parseCommand(0, '@flutter-symbolizer-bot $mode'),
-            equals(BotCommand(
-              overrides: SymbolizationOverrides(mode: mode),
-              symbolizeThis: false,
-              worklist: <String>{},
-            )));
-      }
-    });
-    test('with engine hash', () {
-      expect(
-          Bot.parseCommand(
-              0, '@flutter-symbolizer-bot arm64 engine#aaabbb debug'),
-          equals(BotCommand(
-            overrides: SymbolizationOverrides(
-                arch: 'arm64', engineHash: 'aaabbb', mode: 'debug'),
-            symbolizeThis: false,
-            worklist: <String>{},
-          )));
-    });
-    test('with links', () {
-      expect(
-          Bot.parseCommand(
-              0,
-              '@flutter-symbolizer-bot '
-              'https://github.com/flutter/flutter/issues/0#issue-1 '
-              'engine#aaabbb '
-              'https://github.com/flutter/flutter/issues/0#issuecomment-2'),
-          equals(BotCommand(
-            overrides: SymbolizationOverrides(engineHash: 'aaabbb'),
-            symbolizeThis: false,
-            worklist: <String>{'issue-1', 'issuecomment-2'},
-          )));
-    });
-  });
-
-  group('end-to-end', () {
-    late SymbolsCache symbols;
-    late Ndk ndk;
-    late GitHub github;
-    final files = Directory('test/data').listSync();
-
-    setUpAll(() {
-      ndk = Ndk();
-      symbols = SymbolsCache(path: 'symbols-cache', ndk: ndk);
-      github = GitHub(auth: Authentication.withToken(config.githubToken));
-    });
-
-    for (var inputFile in files
-        .where((f) => p.basename(f.path).endsWith('.input.txt'))
-        .cast<File>()) {
-      final testName = p.basename(inputFile.path).split('.').first;
-      final expectationFile = File('test/data/$testName.expected.github.txt');
-      test(testName, () async {
-        final input = await inputFile.readAsString();
-
-        final authorized = !input.contains('/unauthorized');
-        final shouldThrow = input.contains('/throw');
-
-        final symbolsProxy =
-            SymbolsCacheProxy(symbols, shouldThrow: shouldThrow);
-
-        final symbolizer =
-            Symbolizer(symbols: symbolsProxy, ndk: ndk, github: github);
-
-        final mockGitHub = MockGitHub();
-        final mockIssues = MockIssuesService();
-        final repo = RepositorySlug('flutter', 'flutter');
-        final bot = Bot(
-          github: mockGitHub,
-          symbolizer: symbolizer,
-          failuresEmail: null,
-          mailer: null,
-        );
-
-        final command = Bot.isCommand(input)
-            ? Bot.parseCommand(0, input)!.symbolizeThis
-                ? input
-                : input.split('\n').first
-            : Bot.accountMention;
-
-        final somebody = User(login: 'somebody');
-        final commandComment = IssueComment(
-            id: 1001,
-            body: command,
-            user: somebody,
-            htmlUrl:
-                'https://github.com/flutter/flutter/issues/12345#issuecomment-1001');
-
-        when(mockGitHub.issues).thenReturn(mockIssues);
-
-        when(mockIssues.listCommentsByIssue(repo, 42))
-            .thenAnswer((realInvocation) async* {
-          yield IssueComment(
-              id: 1002,
-              body: 'something',
-              user: somebody,
-              htmlUrl:
-                  'https://github.com/flutter/flutter/issues/12345#issuecomment-1002');
-          yield IssueComment(
-              id: 1042,
-              body: input,
-              user: somebody,
-              htmlUrl:
-                  'https://github.com/flutter/flutter/issues/12345#issuecomment-1042');
-          yield commandComment;
-        });
-
-        when(mockIssues.createComment(repo, 42, any))
-            .thenAnswer((realInvocation) async {
-          return IssueComment();
-        });
-
-        throwOnMissingStub(mockGitHub);
-        throwOnMissingStub(mockIssues);
-        await bot.executeCommand(
-          repo,
-          Issue(id: 1000, body: 'something', number: 42),
-          commandComment,
-          authorized: authorized,
-        );
-
-        final result = verify(mockIssues.createComment(repo, 42, captureAny))
-            .captured
-            .single;
-
-        if (regenerateExpectations) {
-          await expectationFile.writeAsString(result);
-        } else {
-          final expected = await expectationFile.readAsString();
-
-          expect(result, equals(expected));
-        }
-      });
-    }
-
-    tearDownAll(() {
-      github.dispose();
-    });
-  });
-}
diff --git a/github-label-notifier/symbolizer/test/bot_test.mocks.dart b/github-label-notifier/symbolizer/test/bot_test.mocks.dart
deleted file mode 100644
index fc29c3c..0000000
--- a/github-label-notifier/symbolizer/test/bot_test.mocks.dart
+++ /dev/null
@@ -1,715 +0,0 @@
-// Mocks generated by Mockito 5.3.0 from annotations
-// in symbolizer/test/bot_test.dart.
-// Do not manually edit this file.
-
-// ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i4;
-
-import 'package:github/src/common.dart' as _i3;
-import 'package:http/http.dart' as _i2;
-import 'package:mockito/mockito.dart' as _i1;
-
-// ignore_for_file: type=lint
-// ignore_for_file: avoid_redundant_argument_values
-// ignore_for_file: avoid_setters_without_getters
-// ignore_for_file: comment_references
-// ignore_for_file: implementation_imports
-// ignore_for_file: invalid_use_of_visible_for_testing_member
-// ignore_for_file: prefer_const_constructors
-// ignore_for_file: unnecessary_parenthesis
-// ignore_for_file: camel_case_types
-// ignore_for_file: subtype_of_sealed_class
-
-class _FakeClient_0 extends _i1.SmartFake implements _i2.Client {
-  _FakeClient_0(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeActivityService_1 extends _i1.SmartFake
-    implements _i3.ActivityService {
-  _FakeActivityService_1(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeAuthorizationsService_2 extends _i1.SmartFake
-    implements _i3.AuthorizationsService {
-  _FakeAuthorizationsService_2(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeGistsService_3 extends _i1.SmartFake implements _i3.GistsService {
-  _FakeGistsService_3(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeGitService_4 extends _i1.SmartFake implements _i3.GitService {
-  _FakeGitService_4(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeIssuesService_5 extends _i1.SmartFake implements _i3.IssuesService {
-  _FakeIssuesService_5(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeMiscService_6 extends _i1.SmartFake implements _i3.MiscService {
-  _FakeMiscService_6(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeOrganizationsService_7 extends _i1.SmartFake
-    implements _i3.OrganizationsService {
-  _FakeOrganizationsService_7(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakePullRequestsService_8 extends _i1.SmartFake
-    implements _i3.PullRequestsService {
-  _FakePullRequestsService_8(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeRepositoriesService_9 extends _i1.SmartFake
-    implements _i3.RepositoriesService {
-  _FakeRepositoriesService_9(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeSearchService_10 extends _i1.SmartFake implements _i3.SearchService {
-  _FakeSearchService_10(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeUrlShortenerService_11 extends _i1.SmartFake
-    implements _i3.UrlShortenerService {
-  _FakeUrlShortenerService_11(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeUsersService_12 extends _i1.SmartFake implements _i3.UsersService {
-  _FakeUsersService_12(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeChecksService_13 extends _i1.SmartFake implements _i3.ChecksService {
-  _FakeChecksService_13(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeResponse_14 extends _i1.SmartFake implements _i2.Response {
-  _FakeResponse_14(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeGitHub_15 extends _i1.SmartFake implements _i3.GitHub {
-  _FakeGitHub_15(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeIssue_16 extends _i1.SmartFake implements _i3.Issue {
-  _FakeIssue_16(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeIssueComment_17 extends _i1.SmartFake implements _i3.IssueComment {
-  _FakeIssueComment_17(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeIssueLabel_18 extends _i1.SmartFake implements _i3.IssueLabel {
-  _FakeIssueLabel_18(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-class _FakeMilestone_19 extends _i1.SmartFake implements _i3.Milestone {
-  _FakeMilestone_19(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
-}
-
-/// A class which mocks [GitHub].
-///
-/// See the documentation for Mockito's code generation for more information.
-class MockGitHub extends _i1.Mock implements _i3.GitHub {
-  @override
-  set auth(_i3.Authentication? _auth) =>
-      super.noSuchMethod(Invocation.setter(#auth, _auth),
-          returnValueForMissingStub: null);
-  @override
-  String get endpoint => (super.noSuchMethod(Invocation.getter(#endpoint),
-      returnValue: '', returnValueForMissingStub: '') as String);
-  @override
-  _i2.Client get client => (super.noSuchMethod(Invocation.getter(#client),
-      returnValue: _FakeClient_0(this, Invocation.getter(#client)),
-      returnValueForMissingStub:
-          _FakeClient_0(this, Invocation.getter(#client))) as _i2.Client);
-  @override
-  _i3.ActivityService get activity => (super.noSuchMethod(
-      Invocation.getter(#activity),
-      returnValue: _FakeActivityService_1(this, Invocation.getter(#activity)),
-      returnValueForMissingStub: _FakeActivityService_1(
-          this, Invocation.getter(#activity))) as _i3.ActivityService);
-  @override
-  _i3.AuthorizationsService get authorizations =>
-      (super.noSuchMethod(Invocation.getter(#authorizations),
-              returnValue: _FakeAuthorizationsService_2(
-                  this, Invocation.getter(#authorizations)),
-              returnValueForMissingStub: _FakeAuthorizationsService_2(
-                  this, Invocation.getter(#authorizations)))
-          as _i3.AuthorizationsService);
-  @override
-  _i3.GistsService get gists => (super.noSuchMethod(Invocation.getter(#gists),
-          returnValue: _FakeGistsService_3(this, Invocation.getter(#gists)),
-          returnValueForMissingStub:
-              _FakeGistsService_3(this, Invocation.getter(#gists)))
-      as _i3.GistsService);
-  @override
-  _i3.GitService get git => (super.noSuchMethod(Invocation.getter(#git),
-      returnValue: _FakeGitService_4(this, Invocation.getter(#git)),
-      returnValueForMissingStub:
-          _FakeGitService_4(this, Invocation.getter(#git))) as _i3.GitService);
-  @override
-  _i3.IssuesService get issues => (super.noSuchMethod(
-          Invocation.getter(#issues),
-          returnValue: _FakeIssuesService_5(this, Invocation.getter(#issues)),
-          returnValueForMissingStub:
-              _FakeIssuesService_5(this, Invocation.getter(#issues)))
-      as _i3.IssuesService);
-  @override
-  _i3.MiscService get misc => (super.noSuchMethod(Invocation.getter(#misc),
-          returnValue: _FakeMiscService_6(this, Invocation.getter(#misc)),
-          returnValueForMissingStub:
-              _FakeMiscService_6(this, Invocation.getter(#misc)))
-      as _i3.MiscService);
-  @override
-  _i3.OrganizationsService get organizations => (super.noSuchMethod(
-      Invocation.getter(#organizations),
-      returnValue:
-          _FakeOrganizationsService_7(this, Invocation.getter(#organizations)),
-      returnValueForMissingStub: _FakeOrganizationsService_7(
-          this, Invocation.getter(#organizations))) as _i3
-      .OrganizationsService);
-  @override
-  _i3.PullRequestsService get pullRequests => (super.noSuchMethod(
-      Invocation.getter(#pullRequests),
-      returnValue:
-          _FakePullRequestsService_8(this, Invocation.getter(#pullRequests)),
-      returnValueForMissingStub: _FakePullRequestsService_8(
-          this, Invocation.getter(#pullRequests))) as _i3.PullRequestsService);
-  @override
-  _i3.RepositoriesService get repositories => (super.noSuchMethod(
-      Invocation.getter(#repositories),
-      returnValue:
-          _FakeRepositoriesService_9(this, Invocation.getter(#repositories)),
-      returnValueForMissingStub: _FakeRepositoriesService_9(
-          this, Invocation.getter(#repositories))) as _i3.RepositoriesService);
-  @override
-  _i3.SearchService get search => (super.noSuchMethod(
-          Invocation.getter(#search),
-          returnValue: _FakeSearchService_10(this, Invocation.getter(#search)),
-          returnValueForMissingStub:
-              _FakeSearchService_10(this, Invocation.getter(#search)))
-      as _i3.SearchService);
-  @override
-  _i3.UrlShortenerService get urlShortener => (super.noSuchMethod(
-      Invocation.getter(#urlShortener),
-      returnValue:
-          _FakeUrlShortenerService_11(this, Invocation.getter(#urlShortener)),
-      returnValueForMissingStub: _FakeUrlShortenerService_11(
-          this, Invocation.getter(#urlShortener))) as _i3.UrlShortenerService);
-  @override
-  _i3.UsersService get users => (super.noSuchMethod(Invocation.getter(#users),
-          returnValue: _FakeUsersService_12(this, Invocation.getter(#users)),
-          returnValueForMissingStub:
-              _FakeUsersService_12(this, Invocation.getter(#users)))
-      as _i3.UsersService);
-  @override
-  _i3.ChecksService get checks => (super.noSuchMethod(
-          Invocation.getter(#checks),
-          returnValue: _FakeChecksService_13(this, Invocation.getter(#checks)),
-          returnValueForMissingStub:
-              _FakeChecksService_13(this, Invocation.getter(#checks)))
-      as _i3.ChecksService);
-  @override
-  _i4.Future<T> getJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i2.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, String>? params,
-          _i3.JSONConverter<S, T>? convert,
-          String? preview}) =>
-      (super.noSuchMethod(
-              Invocation.method(#getJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #preview: preview
-              }),
-              returnValue: _i4.Future<T>.value(null),
-              returnValueForMissingStub: _i4.Future<T>.value(null))
-          as _i4.Future<T>);
-  @override
-  _i4.Future<T> postJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i2.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i3.JSONConverter<S, T>? convert,
-          dynamic body,
-          String? preview}) =>
-      (super.noSuchMethod(
-              Invocation.method(#postJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i4.Future<T>.value(null),
-              returnValueForMissingStub: _i4.Future<T>.value(null))
-          as _i4.Future<T>);
-  @override
-  _i4.Future<T> putJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i2.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i3.JSONConverter<S, T>? convert,
-          dynamic body,
-          String? preview}) =>
-      (super.noSuchMethod(
-              Invocation.method(#putJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i4.Future<T>.value(null),
-              returnValueForMissingStub: _i4.Future<T>.value(null))
-          as _i4.Future<T>);
-  @override
-  _i4.Future<T> patchJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i2.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i3.JSONConverter<S, T>? convert,
-          dynamic body,
-          String? preview}) =>
-      (super.noSuchMethod(
-              Invocation.method(#patchJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i4.Future<T>.value(null),
-              returnValueForMissingStub: _i4.Future<T>.value(null))
-          as _i4.Future<T>);
-  @override
-  _i4.Future<T> requestJson<S, T>(String? method, String? path,
-          {int? statusCode,
-          void Function(_i2.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i3.JSONConverter<S, T?>? convert,
-          dynamic body,
-          String? preview}) =>
-      (super.noSuchMethod(
-              Invocation.method(#requestJson, [
-                method,
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i4.Future<T>.value(null),
-              returnValueForMissingStub: _i4.Future<T>.value(null))
-          as _i4.Future<T>);
-  @override
-  _i4.Future<_i2.Response> request(String? method, String? path,
-          {Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          dynamic body,
-          int? statusCode,
-          void Function(_i2.Response)? fail,
-          String? preview}) =>
-      (super.noSuchMethod(
-          Invocation.method(#request, [
-            method,
-            path
-          ], {
-            #headers: headers,
-            #params: params,
-            #body: body,
-            #statusCode: statusCode,
-            #fail: fail,
-            #preview: preview
-          }),
-          returnValue: _i4.Future<_i2.Response>.value(_FakeResponse_14(
-              this,
-              Invocation.method(#request, [
-                method,
-                path
-              ], {
-                #headers: headers,
-                #params: params,
-                #body: body,
-                #statusCode: statusCode,
-                #fail: fail,
-                #preview: preview
-              }))),
-          returnValueForMissingStub:
-              _i4.Future<_i2.Response>.value(_FakeResponse_14(
-                  this,
-                  Invocation.method(#request, [
-                    method,
-                    path
-                  ], {
-                    #headers: headers,
-                    #params: params,
-                    #body: body,
-                    #statusCode: statusCode,
-                    #fail: fail,
-                    #preview: preview
-                  })))) as _i4.Future<_i2.Response>);
-  @override
-  void handleStatusCode(_i2.Response? response) =>
-      super.noSuchMethod(Invocation.method(#handleStatusCode, [response]),
-          returnValueForMissingStub: null);
-  @override
-  void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
-      returnValueForMissingStub: null);
-}
-
-/// A class which mocks [IssuesService].
-///
-/// See the documentation for Mockito's code generation for more information.
-class MockIssuesService extends _i1.Mock implements _i3.IssuesService {
-  @override
-  _i3.GitHub get github => (super.noSuchMethod(Invocation.getter(#github),
-      returnValue: _FakeGitHub_15(this, Invocation.getter(#github)),
-      returnValueForMissingStub:
-          _FakeGitHub_15(this, Invocation.getter(#github))) as _i3.GitHub);
-  @override
-  _i4.Stream<_i3.Issue> listAll(
-          {int? milestoneNumber,
-          String? state,
-          String? direction,
-          String? sort,
-          DateTime? since,
-          int? perPage,
-          List<String>? labels}) =>
-      (super.noSuchMethod(
-              Invocation.method(#listAll, [], {
-                #milestoneNumber: milestoneNumber,
-                #state: state,
-                #direction: direction,
-                #sort: sort,
-                #since: since,
-                #perPage: perPage,
-                #labels: labels
-              }),
-              returnValue: _i4.Stream<_i3.Issue>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
-          as _i4.Stream<_i3.Issue>);
-  @override
-  _i4.Stream<_i3.Issue> listByUser(
-          {int? milestoneNumber,
-          String? state,
-          String? direction,
-          String? sort,
-          DateTime? since,
-          int? perPage,
-          List<String>? labels}) =>
-      (super.noSuchMethod(
-              Invocation.method(#listByUser, [], {
-                #milestoneNumber: milestoneNumber,
-                #state: state,
-                #direction: direction,
-                #sort: sort,
-                #since: since,
-                #perPage: perPage,
-                #labels: labels
-              }),
-              returnValue: _i4.Stream<_i3.Issue>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
-          as _i4.Stream<_i3.Issue>);
-  @override
-  _i4.Stream<_i3.Issue> listByOrg(String? org,
-          {int? milestoneNumber,
-          String? state,
-          String? direction,
-          String? sort,
-          DateTime? since,
-          int? perPage,
-          List<String>? labels}) =>
-      (super.noSuchMethod(
-              Invocation.method(#listByOrg, [
-                org
-              ], {
-                #milestoneNumber: milestoneNumber,
-                #state: state,
-                #direction: direction,
-                #sort: sort,
-                #since: since,
-                #perPage: perPage,
-                #labels: labels
-              }),
-              returnValue: _i4.Stream<_i3.Issue>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
-          as _i4.Stream<_i3.Issue>);
-  @override
-  _i4.Stream<_i3.Issue> listByRepo(_i3.RepositorySlug? slug,
-          {int? milestoneNumber,
-          String? state,
-          String? direction,
-          String? sort,
-          DateTime? since,
-          int? perPage,
-          List<String>? labels}) =>
-      (super.noSuchMethod(
-              Invocation.method(#listByRepo, [
-                slug
-              ], {
-                #milestoneNumber: milestoneNumber,
-                #state: state,
-                #direction: direction,
-                #sort: sort,
-                #since: since,
-                #perPage: perPage,
-                #labels: labels
-              }),
-              returnValue: _i4.Stream<_i3.Issue>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.Issue>.empty())
-          as _i4.Stream<_i3.Issue>);
-  @override
-  _i4.Stream<_i3.Reaction> listReactions(
-          _i3.RepositorySlug? slug, int? issueNumber,
-          {_i3.ReactionType? content}) =>
-      (super.noSuchMethod(
-              Invocation.method(
-                  #listReactions, [slug, issueNumber], {#content: content}),
-              returnValue: _i4.Stream<_i3.Reaction>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.Reaction>.empty())
-          as _i4.Stream<_i3.Reaction>);
-  @override
-  _i4.Future<_i3.Issue> edit(_i3.RepositorySlug? slug, int? issueNumber,
-          _i3.IssueRequest? issue) =>
-      (super.noSuchMethod(Invocation.method(#edit, [slug, issueNumber, issue]),
-          returnValue: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
-              this, Invocation.method(#edit, [slug, issueNumber, issue]))),
-          returnValueForMissingStub: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
-              this, Invocation.method(#edit, [slug, issueNumber, issue])))) as _i4
-          .Future<_i3.Issue>);
-  @override
-  _i4.Future<_i3.Issue> get(_i3.RepositorySlug? slug, int? issueNumber) =>
-      (super.noSuchMethod(Invocation.method(#get, [slug, issueNumber]),
-          returnValue: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
-              this, Invocation.method(#get, [slug, issueNumber]))),
-          returnValueForMissingStub: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
-              this, Invocation.method(#get, [slug, issueNumber])))) as _i4
-          .Future<_i3.Issue>);
-  @override
-  _i4.Future<_i3.Issue> create(
-          _i3.RepositorySlug? slug, _i3.IssueRequest? issue) =>
-      (super.noSuchMethod(Invocation.method(#create, [slug, issue]),
-          returnValue: _i4.Future<_i3.Issue>.value(
-              _FakeIssue_16(this, Invocation.method(#create, [slug, issue]))),
-          returnValueForMissingStub: _i4.Future<_i3.Issue>.value(_FakeIssue_16(
-              this, Invocation.method(#create, [slug, issue])))) as _i4
-          .Future<_i3.Issue>);
-  @override
-  _i4.Stream<_i3.User> listAssignees(_i3.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listAssignees, [slug]),
-              returnValue: _i4.Stream<_i3.User>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.User>.empty())
-          as _i4.Stream<_i3.User>);
-  @override
-  _i4.Future<bool> isAssignee(_i3.RepositorySlug? slug, String? repoName) =>
-      (super.noSuchMethod(Invocation.method(#isAssignee, [slug, repoName]),
-              returnValue: _i4.Future<bool>.value(false),
-              returnValueForMissingStub: _i4.Future<bool>.value(false))
-          as _i4.Future<bool>);
-  @override
-  _i4.Stream<_i3.IssueComment> listCommentsByIssue(
-          _i3.RepositorySlug? slug, int? issueNumber) =>
-      (super.noSuchMethod(
-              Invocation.method(#listCommentsByIssue, [slug, issueNumber]),
-              returnValue: _i4.Stream<_i3.IssueComment>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.IssueComment>.empty())
-          as _i4.Stream<_i3.IssueComment>);
-  @override
-  _i4.Stream<_i3.IssueComment> listCommentsByRepo(_i3.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listCommentsByRepo, [slug]),
-              returnValue: _i4.Stream<_i3.IssueComment>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.IssueComment>.empty())
-          as _i4.Stream<_i3.IssueComment>);
-  @override
-  _i4.Future<_i3.IssueComment> getComment(_i3.RepositorySlug? slug, int? id) =>
-      (super.noSuchMethod(Invocation.method(#getComment, [slug, id]),
-          returnValue: _i4.Future<_i3.IssueComment>.value(_FakeIssueComment_17(
-              this, Invocation.method(#getComment, [slug, id]))),
-          returnValueForMissingStub: _i4.Future<_i3.IssueComment>.value(
-              _FakeIssueComment_17(
-                  this, Invocation.method(#getComment, [slug, id])))) as _i4
-          .Future<_i3.IssueComment>);
-  @override
-  _i4.Future<_i3.IssueComment> createComment(
-          _i3.RepositorySlug? slug, int? issueNumber, String? body) =>
-      (super.noSuchMethod(
-          Invocation.method(#createComment, [slug, issueNumber, body]),
-          returnValue: _i4.Future<_i3.IssueComment>.value(_FakeIssueComment_17(
-              this,
-              Invocation.method(#createComment, [slug, issueNumber, body]))),
-          returnValueForMissingStub: _i4.Future<_i3.IssueComment>.value(
-              _FakeIssueComment_17(this, Invocation.method(#createComment, [slug, issueNumber, body])))) as _i4
-          .Future<_i3.IssueComment>);
-  @override
-  _i4.Future<_i3.IssueComment> updateComment(
-          _i3.RepositorySlug? slug, int? id, String? body) =>
-      (super.noSuchMethod(Invocation.method(#updateComment, [slug, id, body]),
-              returnValue: _i4.Future<_i3.IssueComment>.value(
-                  _FakeIssueComment_17(
-                      this, Invocation.method(#updateComment, [slug, id, body]))),
-              returnValueForMissingStub: _i4.Future<_i3.IssueComment>.value(
-                  _FakeIssueComment_17(
-                      this, Invocation.method(#updateComment, [slug, id, body]))))
-          as _i4.Future<_i3.IssueComment>);
-  @override
-  _i4.Future<bool> deleteComment(_i3.RepositorySlug? slug, int? id) =>
-      (super.noSuchMethod(Invocation.method(#deleteComment, [slug, id]),
-              returnValue: _i4.Future<bool>.value(false),
-              returnValueForMissingStub: _i4.Future<bool>.value(false))
-          as _i4.Future<bool>);
-  @override
-  _i4.Stream<_i3.IssueLabel> listLabels(_i3.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listLabels, [slug]),
-              returnValue: _i4.Stream<_i3.IssueLabel>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.IssueLabel>.empty())
-          as _i4.Stream<_i3.IssueLabel>);
-  @override
-  _i4.Future<_i3.IssueLabel> getLabel(_i3.RepositorySlug? slug, String? name) =>
-      (super.noSuchMethod(Invocation.method(#getLabel, [slug, name]),
-              returnValue: _i4.Future<_i3.IssueLabel>.value(_FakeIssueLabel_18(
-                  this, Invocation.method(#getLabel, [slug, name]))),
-              returnValueForMissingStub: _i4.Future<_i3.IssueLabel>.value(
-                  _FakeIssueLabel_18(
-                      this, Invocation.method(#getLabel, [slug, name]))))
-          as _i4.Future<_i3.IssueLabel>);
-  @override
-  _i4.Future<_i3.IssueLabel> createLabel(
-          _i3.RepositorySlug? slug, String? name, String? color) =>
-      (super.noSuchMethod(Invocation.method(#createLabel, [slug, name, color]),
-              returnValue: _i4.Future<_i3.IssueLabel>.value(_FakeIssueLabel_18(
-                  this, Invocation.method(#createLabel, [slug, name, color]))),
-              returnValueForMissingStub: _i4.Future<_i3.IssueLabel>.value(
-                  _FakeIssueLabel_18(
-                      this, Invocation.method(#createLabel, [slug, name, color]))))
-          as _i4.Future<_i3.IssueLabel>);
-  @override
-  _i4.Future<_i3.IssueLabel> editLabel(
-          _i3.RepositorySlug? slug, String? name, String? color) =>
-      (super.noSuchMethod(Invocation.method(#editLabel, [slug, name, color]),
-              returnValue: _i4.Future<_i3.IssueLabel>.value(_FakeIssueLabel_18(
-                  this, Invocation.method(#editLabel, [slug, name, color]))),
-              returnValueForMissingStub: _i4.Future<_i3.IssueLabel>.value(
-                  _FakeIssueLabel_18(
-                      this, Invocation.method(#editLabel, [slug, name, color]))))
-          as _i4.Future<_i3.IssueLabel>);
-  @override
-  _i4.Future<bool> deleteLabel(_i3.RepositorySlug? slug, String? name) =>
-      (super.noSuchMethod(Invocation.method(#deleteLabel, [slug, name]),
-              returnValue: _i4.Future<bool>.value(false),
-              returnValueForMissingStub: _i4.Future<bool>.value(false))
-          as _i4.Future<bool>);
-  @override
-  _i4.Stream<_i3.IssueLabel> listLabelsByIssue(
-          _i3.RepositorySlug? slug, int? issueNumber) =>
-      (super.noSuchMethod(
-              Invocation.method(#listLabelsByIssue, [slug, issueNumber]),
-              returnValue: _i4.Stream<_i3.IssueLabel>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.IssueLabel>.empty())
-          as _i4.Stream<_i3.IssueLabel>);
-  @override
-  _i4.Future<List<_i3.IssueLabel>> addLabelsToIssue(
-          _i3.RepositorySlug? slug, int? issueNumber, List<String>? labels) =>
-      (super.noSuchMethod(
-              Invocation.method(#addLabelsToIssue, [slug, issueNumber, labels]),
-              returnValue:
-                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]),
-              returnValueForMissingStub:
-                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]))
-          as _i4.Future<List<_i3.IssueLabel>>);
-  @override
-  _i4.Future<List<_i3.IssueLabel>> replaceLabelsForIssue(
-          _i3.RepositorySlug? slug, int? issueNumber, List<String>? labels) =>
-      (super.noSuchMethod(
-              Invocation.method(
-                  #replaceLabelsForIssue, [slug, issueNumber, labels]),
-              returnValue:
-                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]),
-              returnValueForMissingStub:
-                  _i4.Future<List<_i3.IssueLabel>>.value(<_i3.IssueLabel>[]))
-          as _i4.Future<List<_i3.IssueLabel>>);
-  @override
-  _i4.Future<bool> removeLabelForIssue(
-          _i3.RepositorySlug? slug, int? issueNumber, String? label) =>
-      (super.noSuchMethod(
-          Invocation.method(#removeLabelForIssue, [slug, issueNumber, label]),
-          returnValue: _i4.Future<bool>.value(false),
-          returnValueForMissingStub:
-              _i4.Future<bool>.value(false)) as _i4.Future<bool>);
-  @override
-  _i4.Future<bool> removeAllLabelsForIssue(
-          _i3.RepositorySlug? slug, int? issueNumber) =>
-      (super.noSuchMethod(
-              Invocation.method(#removeAllLabelsForIssue, [slug, issueNumber]),
-              returnValue: _i4.Future<bool>.value(false),
-              returnValueForMissingStub: _i4.Future<bool>.value(false))
-          as _i4.Future<bool>);
-  @override
-  _i4.Stream<_i3.Milestone> listMilestones(_i3.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listMilestones, [slug]),
-              returnValue: _i4.Stream<_i3.Milestone>.empty(),
-              returnValueForMissingStub: _i4.Stream<_i3.Milestone>.empty())
-          as _i4.Stream<_i3.Milestone>);
-  @override
-  _i4.Future<_i3.Milestone> createMilestone(
-          _i3.RepositorySlug? slug, _i3.CreateMilestone? request) =>
-      (super.noSuchMethod(Invocation.method(#createMilestone, [slug, request]),
-              returnValue: _i4.Future<_i3.Milestone>.value(_FakeMilestone_19(
-                  this, Invocation.method(#createMilestone, [slug, request]))),
-              returnValueForMissingStub: _i4.Future<_i3.Milestone>.value(
-                  _FakeMilestone_19(
-                      this, Invocation.method(#createMilestone, [slug, request]))))
-          as _i4.Future<_i3.Milestone>);
-  @override
-  _i4.Future<bool> deleteMilestone(_i3.RepositorySlug? slug, int? number) =>
-      (super.noSuchMethod(Invocation.method(#deleteMilestone, [slug, number]),
-              returnValue: _i4.Future<bool>.value(false),
-              returnValueForMissingStub: _i4.Future<bool>.value(false))
-          as _i4.Future<bool>);
-}
diff --git a/github-label-notifier/symbolizer/test/data/test01.expected.txt b/github-label-notifier/symbolizer/test/data/test01.expected.txt
index 266e574..6b502c9 100644
--- a/github-label-notifier/symbolizer/test/data/test01.expected.txt
+++ b/github-label-notifier/symbolizer/test/data/test01.expected.txt
@@ -5,7 +5,7 @@
         "engineVariant": {
           "os": "android",
           "arch": "arm",
-          "mode": null
+          "mode": "release"
         },
         "frames": [
           {
@@ -33,19 +33,14 @@
         }
       },
       "symbolized": "#00 96a85449 <...>/lib/arm/libflutter.so+0x1384449\n                                         ??\n                                         ??:0:0\n#01 969c0e81 <...>/lib/arm/libflutter.so+0x12bfe81\n                                         ??\n                                         ??:0:0\n",
-      "notes": [
-        {
-          "kind": "defaultedToReleaseBuildIdUnavailable",
-          "message": null
-        }
-      ]
+      "notes": []
     },
     {
       "crash": {
         "engineVariant": {
           "os": "android",
           "arch": "arm",
-          "mode": null
+          "mode": "release"
         },
         "frames": [
           {
@@ -77,12 +72,7 @@
         }
       },
       "symbolized": "#00 0001a43c /system/lib/libc.so (abort+63)\n#01 002bce85 <...>/lib/arm/libflutter.so (offset 0x1002000)\n                                         EllipticalRRectOp::EllipticalRRectOp(GrSimpleMeshDrawOpHelper::MakeArgs, SkRGBA4f<(SkAlphaType)2> const&, SkMatrix const&, SkRect const&, float, float, SkPoint, bool)\n                                         third_party/skia/src/gpu/ops/GrOvalOpFactory.cpp:2896:18\n",
-      "notes": [
-        {
-          "kind": "defaultedToReleaseBuildIdUnavailable",
-          "message": null
-        }
-      ]
+      "notes": []
     }
   ],
   "runtimeType": "ok"
diff --git a/github-label-notifier/symbolizer/test/symbolizer_test.dart b/github-label-notifier/symbolizer/test/symbolizer_test.dart
index eddd856..69cb760 100644
--- a/github-label-notifier/symbolizer/test/symbolizer_test.dart
+++ b/github-label-notifier/symbolizer/test/symbolizer_test.dart
@@ -9,7 +9,6 @@
 import 'package:mockito/annotations.dart';
 import 'package:mockito/mockito.dart';
 import 'package:path/path.dart' as p;
-import 'package:symbolizer/bot.dart';
 import 'package:symbolizer/config.dart';
 import 'package:symbolizer/model.dart';
 import 'package:symbolizer/ndk.dart';
@@ -49,7 +48,7 @@
     final files = Directory('test/data').listSync();
 
     setUpAll(() {
-      final ndk = Ndk();
+      final ndk = Ndk(llvmTools: LlvmTools.findTools()!);
       final symbols =
           SymbolsCache(path: 'symbols-cache', ndk: ndk, sizeThreshold: 100);
       final github = GitHub(auth: Authentication.withToken(config.githubToken));
@@ -63,7 +62,8 @@
       final expectationFile = File('test/data/$testName.expected.txt');
       test(testName, () async {
         final input = await inputFile.readAsString();
-        final overrides = Bot.parseCommand(0, input)?.overrides;
+        final overrides =
+            SymbolizationOverrides.tryParse(input.split('\n').first);
         final result = await symbolizer.symbolize(input, overrides: overrides);
         final roundTrip =
             SymbolizationResult.fromJson(jsonDecode(jsonEncode(result)));
diff --git a/github-label-notifier/symbolizer/test/symbolizer_test.mocks.dart b/github-label-notifier/symbolizer/test/symbolizer_test.mocks.dart
index 47c5686..39921dd 100644
--- a/github-label-notifier/symbolizer/test/symbolizer_test.mocks.dart
+++ b/github-label-notifier/symbolizer/test/symbolizer_test.mocks.dart
@@ -1,21 +1,24 @@
-// Mocks generated by Mockito 5.3.0 from annotations
+// Mocks generated by Mockito 5.4.4 from annotations
 // in symbolizer/test/symbolizer_test.dart.
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i7;
+import 'dart:async' as _i5;
 
-import 'package:github/src/common.dart' as _i4;
-import 'package:http/http.dart' as _i3;
+import 'package:github/src/common.dart' as _i3;
+import 'package:http/http.dart' as _i4;
 import 'package:mockito/mockito.dart' as _i1;
+import 'package:mockito/src/dummies.dart' as _i8;
 import 'package:symbolizer/model.dart' as _i2;
-import 'package:symbolizer/ndk.dart' as _i5;
-import 'package:symbolizer/symbols.dart' as _i6;
+import 'package:symbolizer/ndk.dart' as _i6;
+import 'package:symbolizer/symbols.dart' as _i7;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
 // ignore_for_file: avoid_setters_without_getters
 // ignore_for_file: comment_references
+// ignore_for_file: deprecated_member_use
+// ignore_for_file: deprecated_member_use_from_same_package
 // ignore_for_file: implementation_imports
 // ignore_for_file: invalid_use_of_visible_for_testing_member
 // ignore_for_file: prefer_const_constructors
@@ -24,980 +27,2568 @@
 // ignore_for_file: subtype_of_sealed_class
 
 class _FakeEngineBuild_0 extends _i1.SmartFake implements _i2.EngineBuild {
-  _FakeEngineBuild_0(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+  _FakeEngineBuild_0(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeClient_1 extends _i1.SmartFake implements _i3.Client {
-  _FakeClient_1(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeAuthentication_1 extends _i1.SmartFake
+    implements _i3.Authentication {
+  _FakeAuthentication_1(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeActivityService_2 extends _i1.SmartFake
-    implements _i4.ActivityService {
-  _FakeActivityService_2(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeClient_2 extends _i1.SmartFake implements _i4.Client {
+  _FakeClient_2(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeAuthorizationsService_3 extends _i1.SmartFake
-    implements _i4.AuthorizationsService {
-  _FakeAuthorizationsService_3(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeActivityService_3 extends _i1.SmartFake
+    implements _i3.ActivityService {
+  _FakeActivityService_3(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeGistsService_4 extends _i1.SmartFake implements _i4.GistsService {
-  _FakeGistsService_4(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeAuthorizationsService_4 extends _i1.SmartFake
+    implements _i3.AuthorizationsService {
+  _FakeAuthorizationsService_4(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeGitService_5 extends _i1.SmartFake implements _i4.GitService {
-  _FakeGitService_5(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeGistsService_5 extends _i1.SmartFake implements _i3.GistsService {
+  _FakeGistsService_5(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeIssuesService_6 extends _i1.SmartFake implements _i4.IssuesService {
-  _FakeIssuesService_6(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeGitService_6 extends _i1.SmartFake implements _i3.GitService {
+  _FakeGitService_6(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeMiscService_7 extends _i1.SmartFake implements _i4.MiscService {
-  _FakeMiscService_7(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeIssuesService_7 extends _i1.SmartFake implements _i3.IssuesService {
+  _FakeIssuesService_7(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeOrganizationsService_8 extends _i1.SmartFake
-    implements _i4.OrganizationsService {
-  _FakeOrganizationsService_8(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeMiscService_8 extends _i1.SmartFake implements _i3.MiscService {
+  _FakeMiscService_8(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakePullRequestsService_9 extends _i1.SmartFake
-    implements _i4.PullRequestsService {
-  _FakePullRequestsService_9(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeOrganizationsService_9 extends _i1.SmartFake
+    implements _i3.OrganizationsService {
+  _FakeOrganizationsService_9(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeRepositoriesService_10 extends _i1.SmartFake
-    implements _i4.RepositoriesService {
-  _FakeRepositoriesService_10(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakePullRequestsService_10 extends _i1.SmartFake
+    implements _i3.PullRequestsService {
+  _FakePullRequestsService_10(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeSearchService_11 extends _i1.SmartFake implements _i4.SearchService {
-  _FakeSearchService_11(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeRepositoriesService_11 extends _i1.SmartFake
+    implements _i3.RepositoriesService {
+  _FakeRepositoriesService_11(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeUrlShortenerService_12 extends _i1.SmartFake
-    implements _i4.UrlShortenerService {
-  _FakeUrlShortenerService_12(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeSearchService_12 extends _i1.SmartFake implements _i3.SearchService {
+  _FakeSearchService_12(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeUsersService_13 extends _i1.SmartFake implements _i4.UsersService {
-  _FakeUsersService_13(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeUrlShortenerService_13 extends _i1.SmartFake
+    implements _i3.UrlShortenerService {
+  _FakeUrlShortenerService_13(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeChecksService_14 extends _i1.SmartFake implements _i4.ChecksService {
-  _FakeChecksService_14(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeUsersService_14 extends _i1.SmartFake implements _i3.UsersService {
+  _FakeUsersService_14(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeResponse_15 extends _i1.SmartFake implements _i3.Response {
-  _FakeResponse_15(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeChecksService_15 extends _i1.SmartFake implements _i3.ChecksService {
+  _FakeChecksService_15(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeSectionInfo_16 extends _i1.SmartFake implements _i5.SectionInfo {
-  _FakeSectionInfo_16(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeFuture_16<T1> extends _i1.SmartFake implements _i5.Future<T1> {
+  _FakeFuture_16(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeGitHub_17 extends _i1.SmartFake implements _i4.GitHub {
-  _FakeGitHub_17(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeResponse_17 extends _i1.SmartFake implements _i4.Response {
+  _FakeResponse_17(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeRepository_18 extends _i1.SmartFake implements _i4.Repository {
-  _FakeRepository_18(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeLlvmTools_18 extends _i1.SmartFake implements _i6.LlvmTools {
+  _FakeLlvmTools_18(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeLicenseDetails_19 extends _i1.SmartFake
-    implements _i4.LicenseDetails {
-  _FakeLicenseDetails_19(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeSectionInfo_19 extends _i1.SmartFake implements _i6.SectionInfo {
+  _FakeSectionInfo_19(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeLanguageBreakdown_20 extends _i1.SmartFake
-    implements _i4.LanguageBreakdown {
-  _FakeLanguageBreakdown_20(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeGitHub_20 extends _i1.SmartFake implements _i3.GitHub {
+  _FakeGitHub_20(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeBranch_21 extends _i1.SmartFake implements _i4.Branch {
-  _FakeBranch_21(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeRepository_21 extends _i1.SmartFake implements _i3.Repository {
+  _FakeRepository_21(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeCommitComment_22 extends _i1.SmartFake implements _i4.CommitComment {
-  _FakeCommitComment_22(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeLicenseDetails_22 extends _i1.SmartFake
+    implements _i3.LicenseDetails {
+  _FakeLicenseDetails_22(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeRepositoryCommit_23 extends _i1.SmartFake
-    implements _i4.RepositoryCommit {
-  _FakeRepositoryCommit_23(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeLanguageBreakdown_23 extends _i1.SmartFake
+    implements _i3.LanguageBreakdown {
+  _FakeLanguageBreakdown_23(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeGitHubComparison_24 extends _i1.SmartFake
-    implements _i4.GitHubComparison {
-  _FakeGitHubComparison_24(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeBranch_24 extends _i1.SmartFake implements _i3.Branch {
+  _FakeBranch_24(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeGitHubFile_25 extends _i1.SmartFake implements _i4.GitHubFile {
-  _FakeGitHubFile_25(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeCommitComment_25 extends _i1.SmartFake implements _i3.CommitComment {
+  _FakeCommitComment_25(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeRepositoryContents_26 extends _i1.SmartFake
-    implements _i4.RepositoryContents {
-  _FakeRepositoryContents_26(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeRepositoryCommit_26 extends _i1.SmartFake
+    implements _i3.RepositoryCommit {
+  _FakeRepositoryCommit_26(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeContentCreation_27 extends _i1.SmartFake
-    implements _i4.ContentCreation {
-  _FakeContentCreation_27(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeGitHubComparison_27 extends _i1.SmartFake
+    implements _i3.GitHubComparison {
+  _FakeGitHubComparison_27(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeHook_28 extends _i1.SmartFake implements _i4.Hook {
-  _FakeHook_28(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeGitHubFile_28 extends _i1.SmartFake implements _i3.GitHubFile {
+  _FakeGitHubFile_28(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakePublicKey_29 extends _i1.SmartFake implements _i4.PublicKey {
-  _FakePublicKey_29(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeRepositoryContents_29 extends _i1.SmartFake
+    implements _i3.RepositoryContents {
+  _FakeRepositoryContents_29(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeRepositoryPages_30 extends _i1.SmartFake
-    implements _i4.RepositoryPages {
-  _FakeRepositoryPages_30(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeContentCreation_30 extends _i1.SmartFake
+    implements _i3.ContentCreation {
+  _FakeContentCreation_30(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakePageBuild_31 extends _i1.SmartFake implements _i4.PageBuild {
-  _FakePageBuild_31(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeHook_31 extends _i1.SmartFake implements _i3.Hook {
+  _FakeHook_31(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeRelease_32 extends _i1.SmartFake implements _i4.Release {
-  _FakeRelease_32(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakePublicKey_32 extends _i1.SmartFake implements _i3.PublicKey {
+  _FakePublicKey_32(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeReleaseAsset_33 extends _i1.SmartFake implements _i4.ReleaseAsset {
-  _FakeReleaseAsset_33(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeRepositoryPages_33 extends _i1.SmartFake
+    implements _i3.RepositoryPages {
+  _FakeRepositoryPages_33(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeContributorParticipation_34 extends _i1.SmartFake
-    implements _i4.ContributorParticipation {
-  _FakeContributorParticipation_34(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakePageBuild_34 extends _i1.SmartFake implements _i3.PageBuild {
+  _FakePageBuild_34(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeRepositoryStatus_35 extends _i1.SmartFake
-    implements _i4.RepositoryStatus {
-  _FakeRepositoryStatus_35(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeRelease_35 extends _i1.SmartFake implements _i3.Release {
+  _FakeRelease_35(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeCombinedRepositoryStatus_36 extends _i1.SmartFake
-    implements _i4.CombinedRepositoryStatus {
-  _FakeCombinedRepositoryStatus_36(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeReleaseAsset_36 extends _i1.SmartFake implements _i3.ReleaseAsset {
+  _FakeReleaseAsset_36(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
-class _FakeReleaseNotes_37 extends _i1.SmartFake implements _i4.ReleaseNotes {
-  _FakeReleaseNotes_37(Object parent, Invocation parentInvocation)
-      : super(parent, parentInvocation);
+class _FakeContributorParticipation_37 extends _i1.SmartFake
+    implements _i3.ContributorParticipation {
+  _FakeContributorParticipation_37(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeRepositoryStatus_38 extends _i1.SmartFake
+    implements _i3.RepositoryStatus {
+  _FakeRepositoryStatus_38(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeCombinedRepositoryStatus_39 extends _i1.SmartFake
+    implements _i3.CombinedRepositoryStatus {
+  _FakeCombinedRepositoryStatus_39(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
+}
+
+class _FakeReleaseNotes_40 extends _i1.SmartFake implements _i3.ReleaseNotes {
+  _FakeReleaseNotes_40(
+    Object parent,
+    Invocation parentInvocation,
+  ) : super(
+          parent,
+          parentInvocation,
+        );
 }
 
 /// A class which mocks [SymbolsCache].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockSymbolsCache extends _i1.Mock implements _i6.SymbolsCache {
+class MockSymbolsCache extends _i1.Mock implements _i7.SymbolsCache {
   @override
-  _i7.Future<String> get(_i2.EngineBuild? build) =>
-      (super.noSuchMethod(Invocation.method(#get, [build]),
-              returnValue: _i7.Future<String>.value(''),
-              returnValueForMissingStub: _i7.Future<String>.value(''))
-          as _i7.Future<String>);
+  _i5.Future<String> get(_i2.EngineBuild? build) => (super.noSuchMethod(
+        Invocation.method(
+          #get,
+          [build],
+        ),
+        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #get,
+            [build],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #get,
+            [build],
+          ),
+        )),
+      ) as _i5.Future<String>);
+
   @override
-  _i7.Future<String> getEngineBinary(_i2.EngineBuild? build) =>
-      (super.noSuchMethod(Invocation.method(#getEngineBinary, [build]),
-              returnValue: _i7.Future<String>.value(''),
-              returnValueForMissingStub: _i7.Future<String>.value(''))
-          as _i7.Future<String>);
+  _i5.Future<String> getEngineBinary(_i2.EngineBuild? build) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getEngineBinary,
+          [build],
+        ),
+        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #getEngineBinary,
+            [build],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #getEngineBinary,
+            [build],
+          ),
+        )),
+      ) as _i5.Future<String>);
+
   @override
-  _i7.Future<_i2.EngineBuild> findVariantByBuildId(
-          {String? engineHash, _i2.EngineVariant? variant, String? buildId}) =>
-      (super.noSuchMethod(Invocation.method(#findVariantByBuildId, [], {#engineHash: engineHash, #variant: variant, #buildId: buildId}),
-              returnValue: _i7.Future<_i2.EngineBuild>.value(_FakeEngineBuild_0(
-                  this,
-                  Invocation.method(#findVariantByBuildId, [], {
-                    #engineHash: engineHash,
-                    #variant: variant,
-                    #buildId: buildId
-                  }))),
-              returnValueForMissingStub:
-                  _i7.Future<_i2.EngineBuild>.value(_FakeEngineBuild_0(this, Invocation.method(#findVariantByBuildId, [], {#engineHash: engineHash, #variant: variant, #buildId: buildId}))))
-          as _i7.Future<_i2.EngineBuild>);
+  _i5.Future<_i2.EngineBuild> findVariantByBuildId({
+    required String? engineHash,
+    required _i2.EngineVariant? variant,
+    required String? buildId,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #findVariantByBuildId,
+          [],
+          {
+            #engineHash: engineHash,
+            #variant: variant,
+            #buildId: buildId,
+          },
+        ),
+        returnValue: _i5.Future<_i2.EngineBuild>.value(_FakeEngineBuild_0(
+          this,
+          Invocation.method(
+            #findVariantByBuildId,
+            [],
+            {
+              #engineHash: engineHash,
+              #variant: variant,
+              #buildId: buildId,
+            },
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i2.EngineBuild>.value(_FakeEngineBuild_0(
+          this,
+          Invocation.method(
+            #findVariantByBuildId,
+            [],
+            {
+              #engineHash: engineHash,
+              #variant: variant,
+              #buildId: buildId,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i2.EngineBuild>);
 }
 
 /// A class which mocks [GitHub].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockGitHub extends _i1.Mock implements _i4.GitHub {
+class MockGitHub extends _i1.Mock implements _i3.GitHub {
   @override
-  set auth(_i4.Authentication? _auth) =>
-      super.noSuchMethod(Invocation.setter(#auth, _auth),
-          returnValueForMissingStub: null);
+  _i3.Authentication get auth => (super.noSuchMethod(
+        Invocation.getter(#auth),
+        returnValue: _FakeAuthentication_1(
+          this,
+          Invocation.getter(#auth),
+        ),
+        returnValueForMissingStub: _FakeAuthentication_1(
+          this,
+          Invocation.getter(#auth),
+        ),
+      ) as _i3.Authentication);
+
   @override
-  String get endpoint => (super.noSuchMethod(Invocation.getter(#endpoint),
-      returnValue: '', returnValueForMissingStub: '') as String);
+  set auth(_i3.Authentication? _auth) => super.noSuchMethod(
+        Invocation.setter(
+          #auth,
+          _auth,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  _i3.Client get client => (super.noSuchMethod(Invocation.getter(#client),
-      returnValue: _FakeClient_1(this, Invocation.getter(#client)),
-      returnValueForMissingStub:
-          _FakeClient_1(this, Invocation.getter(#client))) as _i3.Client);
+  String get endpoint => (super.noSuchMethod(
+        Invocation.getter(#endpoint),
+        returnValue: _i8.dummyValue<String>(
+          this,
+          Invocation.getter(#endpoint),
+        ),
+        returnValueForMissingStub: _i8.dummyValue<String>(
+          this,
+          Invocation.getter(#endpoint),
+        ),
+      ) as String);
+
   @override
-  _i4.ActivityService get activity => (super.noSuchMethod(
-      Invocation.getter(#activity),
-      returnValue: _FakeActivityService_2(this, Invocation.getter(#activity)),
-      returnValueForMissingStub: _FakeActivityService_2(
-          this, Invocation.getter(#activity))) as _i4.ActivityService);
+  String get version => (super.noSuchMethod(
+        Invocation.getter(#version),
+        returnValue: _i8.dummyValue<String>(
+          this,
+          Invocation.getter(#version),
+        ),
+        returnValueForMissingStub: _i8.dummyValue<String>(
+          this,
+          Invocation.getter(#version),
+        ),
+      ) as String);
+
   @override
-  _i4.AuthorizationsService get authorizations =>
-      (super.noSuchMethod(Invocation.getter(#authorizations),
-              returnValue: _FakeAuthorizationsService_3(
-                  this, Invocation.getter(#authorizations)),
-              returnValueForMissingStub: _FakeAuthorizationsService_3(
-                  this, Invocation.getter(#authorizations)))
-          as _i4.AuthorizationsService);
+  _i4.Client get client => (super.noSuchMethod(
+        Invocation.getter(#client),
+        returnValue: _FakeClient_2(
+          this,
+          Invocation.getter(#client),
+        ),
+        returnValueForMissingStub: _FakeClient_2(
+          this,
+          Invocation.getter(#client),
+        ),
+      ) as _i4.Client);
+
   @override
-  _i4.GistsService get gists => (super.noSuchMethod(Invocation.getter(#gists),
-          returnValue: _FakeGistsService_4(this, Invocation.getter(#gists)),
-          returnValueForMissingStub:
-              _FakeGistsService_4(this, Invocation.getter(#gists)))
-      as _i4.GistsService);
+  _i3.ActivityService get activity => (super.noSuchMethod(
+        Invocation.getter(#activity),
+        returnValue: _FakeActivityService_3(
+          this,
+          Invocation.getter(#activity),
+        ),
+        returnValueForMissingStub: _FakeActivityService_3(
+          this,
+          Invocation.getter(#activity),
+        ),
+      ) as _i3.ActivityService);
+
   @override
-  _i4.GitService get git => (super.noSuchMethod(Invocation.getter(#git),
-      returnValue: _FakeGitService_5(this, Invocation.getter(#git)),
-      returnValueForMissingStub:
-          _FakeGitService_5(this, Invocation.getter(#git))) as _i4.GitService);
+  _i3.AuthorizationsService get authorizations => (super.noSuchMethod(
+        Invocation.getter(#authorizations),
+        returnValue: _FakeAuthorizationsService_4(
+          this,
+          Invocation.getter(#authorizations),
+        ),
+        returnValueForMissingStub: _FakeAuthorizationsService_4(
+          this,
+          Invocation.getter(#authorizations),
+        ),
+      ) as _i3.AuthorizationsService);
+
   @override
-  _i4.IssuesService get issues => (super.noSuchMethod(
+  _i3.GistsService get gists => (super.noSuchMethod(
+        Invocation.getter(#gists),
+        returnValue: _FakeGistsService_5(
+          this,
+          Invocation.getter(#gists),
+        ),
+        returnValueForMissingStub: _FakeGistsService_5(
+          this,
+          Invocation.getter(#gists),
+        ),
+      ) as _i3.GistsService);
+
+  @override
+  _i3.GitService get git => (super.noSuchMethod(
+        Invocation.getter(#git),
+        returnValue: _FakeGitService_6(
+          this,
+          Invocation.getter(#git),
+        ),
+        returnValueForMissingStub: _FakeGitService_6(
+          this,
+          Invocation.getter(#git),
+        ),
+      ) as _i3.GitService);
+
+  @override
+  _i3.IssuesService get issues => (super.noSuchMethod(
+        Invocation.getter(#issues),
+        returnValue: _FakeIssuesService_7(
+          this,
           Invocation.getter(#issues),
-          returnValue: _FakeIssuesService_6(this, Invocation.getter(#issues)),
-          returnValueForMissingStub:
-              _FakeIssuesService_6(this, Invocation.getter(#issues)))
-      as _i4.IssuesService);
+        ),
+        returnValueForMissingStub: _FakeIssuesService_7(
+          this,
+          Invocation.getter(#issues),
+        ),
+      ) as _i3.IssuesService);
+
   @override
-  _i4.MiscService get misc => (super.noSuchMethod(Invocation.getter(#misc),
-          returnValue: _FakeMiscService_7(this, Invocation.getter(#misc)),
-          returnValueForMissingStub:
-              _FakeMiscService_7(this, Invocation.getter(#misc)))
-      as _i4.MiscService);
+  _i3.MiscService get misc => (super.noSuchMethod(
+        Invocation.getter(#misc),
+        returnValue: _FakeMiscService_8(
+          this,
+          Invocation.getter(#misc),
+        ),
+        returnValueForMissingStub: _FakeMiscService_8(
+          this,
+          Invocation.getter(#misc),
+        ),
+      ) as _i3.MiscService);
+
   @override
-  _i4.OrganizationsService get organizations => (super.noSuchMethod(
-      Invocation.getter(#organizations),
-      returnValue:
-          _FakeOrganizationsService_8(this, Invocation.getter(#organizations)),
-      returnValueForMissingStub: _FakeOrganizationsService_8(
-          this, Invocation.getter(#organizations))) as _i4
-      .OrganizationsService);
+  _i3.OrganizationsService get organizations => (super.noSuchMethod(
+        Invocation.getter(#organizations),
+        returnValue: _FakeOrganizationsService_9(
+          this,
+          Invocation.getter(#organizations),
+        ),
+        returnValueForMissingStub: _FakeOrganizationsService_9(
+          this,
+          Invocation.getter(#organizations),
+        ),
+      ) as _i3.OrganizationsService);
+
   @override
-  _i4.PullRequestsService get pullRequests => (super.noSuchMethod(
-      Invocation.getter(#pullRequests),
-      returnValue:
-          _FakePullRequestsService_9(this, Invocation.getter(#pullRequests)),
-      returnValueForMissingStub: _FakePullRequestsService_9(
-          this, Invocation.getter(#pullRequests))) as _i4.PullRequestsService);
+  _i3.PullRequestsService get pullRequests => (super.noSuchMethod(
+        Invocation.getter(#pullRequests),
+        returnValue: _FakePullRequestsService_10(
+          this,
+          Invocation.getter(#pullRequests),
+        ),
+        returnValueForMissingStub: _FakePullRequestsService_10(
+          this,
+          Invocation.getter(#pullRequests),
+        ),
+      ) as _i3.PullRequestsService);
+
   @override
-  _i4.RepositoriesService get repositories => (super.noSuchMethod(
-      Invocation.getter(#repositories),
-      returnValue:
-          _FakeRepositoriesService_10(this, Invocation.getter(#repositories)),
-      returnValueForMissingStub: _FakeRepositoriesService_10(
-          this, Invocation.getter(#repositories))) as _i4.RepositoriesService);
+  _i3.RepositoriesService get repositories => (super.noSuchMethod(
+        Invocation.getter(#repositories),
+        returnValue: _FakeRepositoriesService_11(
+          this,
+          Invocation.getter(#repositories),
+        ),
+        returnValueForMissingStub: _FakeRepositoriesService_11(
+          this,
+          Invocation.getter(#repositories),
+        ),
+      ) as _i3.RepositoriesService);
+
   @override
-  _i4.SearchService get search => (super.noSuchMethod(
+  _i3.SearchService get search => (super.noSuchMethod(
+        Invocation.getter(#search),
+        returnValue: _FakeSearchService_12(
+          this,
           Invocation.getter(#search),
-          returnValue: _FakeSearchService_11(this, Invocation.getter(#search)),
-          returnValueForMissingStub:
-              _FakeSearchService_11(this, Invocation.getter(#search)))
-      as _i4.SearchService);
+        ),
+        returnValueForMissingStub: _FakeSearchService_12(
+          this,
+          Invocation.getter(#search),
+        ),
+      ) as _i3.SearchService);
+
   @override
-  _i4.UrlShortenerService get urlShortener => (super.noSuchMethod(
-      Invocation.getter(#urlShortener),
-      returnValue:
-          _FakeUrlShortenerService_12(this, Invocation.getter(#urlShortener)),
-      returnValueForMissingStub: _FakeUrlShortenerService_12(
-          this, Invocation.getter(#urlShortener))) as _i4.UrlShortenerService);
+  _i3.UrlShortenerService get urlShortener => (super.noSuchMethod(
+        Invocation.getter(#urlShortener),
+        returnValue: _FakeUrlShortenerService_13(
+          this,
+          Invocation.getter(#urlShortener),
+        ),
+        returnValueForMissingStub: _FakeUrlShortenerService_13(
+          this,
+          Invocation.getter(#urlShortener),
+        ),
+      ) as _i3.UrlShortenerService);
+
   @override
-  _i4.UsersService get users => (super.noSuchMethod(Invocation.getter(#users),
-          returnValue: _FakeUsersService_13(this, Invocation.getter(#users)),
-          returnValueForMissingStub:
-              _FakeUsersService_13(this, Invocation.getter(#users)))
-      as _i4.UsersService);
+  _i3.UsersService get users => (super.noSuchMethod(
+        Invocation.getter(#users),
+        returnValue: _FakeUsersService_14(
+          this,
+          Invocation.getter(#users),
+        ),
+        returnValueForMissingStub: _FakeUsersService_14(
+          this,
+          Invocation.getter(#users),
+        ),
+      ) as _i3.UsersService);
+
   @override
-  _i4.ChecksService get checks => (super.noSuchMethod(
+  _i3.ChecksService get checks => (super.noSuchMethod(
+        Invocation.getter(#checks),
+        returnValue: _FakeChecksService_15(
+          this,
           Invocation.getter(#checks),
-          returnValue: _FakeChecksService_14(this, Invocation.getter(#checks)),
-          returnValueForMissingStub:
-              _FakeChecksService_14(this, Invocation.getter(#checks)))
-      as _i4.ChecksService);
+        ),
+        returnValueForMissingStub: _FakeChecksService_15(
+          this,
+          Invocation.getter(#checks),
+        ),
+      ) as _i3.ChecksService);
+
   @override
-  _i7.Future<T> getJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i3.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, String>? params,
-          _i4.JSONConverter<S, T>? convert,
-          String? preview}) =>
+  _i5.Future<T> getJSON<S, T>(
+    String? path, {
+    int? statusCode,
+    void Function(_i4.Response)? fail,
+    Map<String, String>? headers,
+    Map<String, String>? params,
+    _i3.JSONConverter<S, T>? convert,
+    String? preview,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#getJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #preview: preview
-              }),
-              returnValue: _i7.Future<T>.value(null),
-              returnValueForMissingStub: _i7.Future<T>.value(null))
-          as _i7.Future<T>);
+        Invocation.method(
+          #getJSON,
+          [path],
+          {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #preview: preview,
+          },
+        ),
+        returnValue: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #getJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #getJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #preview: preview,
+                },
+              ),
+            ),
+        returnValueForMissingStub: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #getJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #getJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #preview: preview,
+                },
+              ),
+            ),
+      ) as _i5.Future<T>);
+
   @override
-  _i7.Future<T> postJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i3.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i4.JSONConverter<S, T>? convert,
-          dynamic body,
-          String? preview}) =>
+  _i5.Future<T> postJSON<S, T>(
+    String? path, {
+    int? statusCode,
+    void Function(_i4.Response)? fail,
+    Map<String, String>? headers,
+    Map<String, dynamic>? params,
+    _i3.JSONConverter<S, T>? convert,
+    dynamic body,
+    String? preview,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#postJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i7.Future<T>.value(null),
-              returnValueForMissingStub: _i7.Future<T>.value(null))
-          as _i7.Future<T>);
+        Invocation.method(
+          #postJSON,
+          [path],
+          {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview,
+          },
+        ),
+        returnValue: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #postJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #postJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+        returnValueForMissingStub: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #postJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #postJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+      ) as _i5.Future<T>);
+
   @override
-  _i7.Future<T> putJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i3.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i4.JSONConverter<S, T>? convert,
-          dynamic body,
-          String? preview}) =>
+  _i5.Future<T> putJSON<S, T>(
+    String? path, {
+    int? statusCode,
+    void Function(_i4.Response)? fail,
+    Map<String, String>? headers,
+    Map<String, dynamic>? params,
+    _i3.JSONConverter<S, T>? convert,
+    dynamic body,
+    String? preview,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#putJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i7.Future<T>.value(null),
-              returnValueForMissingStub: _i7.Future<T>.value(null))
-          as _i7.Future<T>);
+        Invocation.method(
+          #putJSON,
+          [path],
+          {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview,
+          },
+        ),
+        returnValue: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #putJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #putJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+        returnValueForMissingStub: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #putJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #putJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+      ) as _i5.Future<T>);
+
   @override
-  _i7.Future<T> patchJSON<S, T>(String? path,
-          {int? statusCode,
-          void Function(_i3.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i4.JSONConverter<S, T>? convert,
-          dynamic body,
-          String? preview}) =>
+  _i5.Future<T> patchJSON<S, T>(
+    String? path, {
+    int? statusCode,
+    void Function(_i4.Response)? fail,
+    Map<String, String>? headers,
+    Map<String, dynamic>? params,
+    _i3.JSONConverter<S, T>? convert,
+    dynamic body,
+    String? preview,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#patchJSON, [
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i7.Future<T>.value(null),
-              returnValueForMissingStub: _i7.Future<T>.value(null))
-          as _i7.Future<T>);
+        Invocation.method(
+          #patchJSON,
+          [path],
+          {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview,
+          },
+        ),
+        returnValue: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #patchJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #patchJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+        returnValueForMissingStub: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #patchJSON,
+                  [path],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #patchJSON,
+                [path],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+      ) as _i5.Future<T>);
+
   @override
-  _i7.Future<T> requestJson<S, T>(String? method, String? path,
-          {int? statusCode,
-          void Function(_i3.Response)? fail,
-          Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          _i4.JSONConverter<S, T?>? convert,
-          dynamic body,
-          String? preview}) =>
+  _i5.Future<T> requestJson<S, T>(
+    String? method,
+    String? path, {
+    int? statusCode,
+    void Function(_i4.Response)? fail,
+    Map<String, String>? headers,
+    Map<String, dynamic>? params,
+    _i3.JSONConverter<S, T?>? convert,
+    dynamic body,
+    String? preview,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#requestJson, [
-                method,
-                path
-              ], {
-                #statusCode: statusCode,
-                #fail: fail,
-                #headers: headers,
-                #params: params,
-                #convert: convert,
-                #body: body,
-                #preview: preview
-              }),
-              returnValue: _i7.Future<T>.value(null),
-              returnValueForMissingStub: _i7.Future<T>.value(null))
-          as _i7.Future<T>);
-  @override
-  _i7.Future<_i3.Response> request(String? method, String? path,
-          {Map<String, String>? headers,
-          Map<String, dynamic>? params,
-          dynamic body,
-          int? statusCode,
-          void Function(_i3.Response)? fail,
-          String? preview}) =>
-      (super.noSuchMethod(
-          Invocation.method(#request, [
+        Invocation.method(
+          #requestJson,
+          [
             method,
-            path
-          ], {
+            path,
+          ],
+          {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview,
+          },
+        ),
+        returnValue: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #requestJson,
+                  [
+                    method,
+                    path,
+                  ],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #requestJson,
+                [
+                  method,
+                  path,
+                ],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+        returnValueForMissingStub: _i8.ifNotNull(
+              _i8.dummyValueOrNull<T>(
+                this,
+                Invocation.method(
+                  #requestJson,
+                  [
+                    method,
+                    path,
+                  ],
+                  {
+                    #statusCode: statusCode,
+                    #fail: fail,
+                    #headers: headers,
+                    #params: params,
+                    #convert: convert,
+                    #body: body,
+                    #preview: preview,
+                  },
+                ),
+              ),
+              (T v) => _i5.Future<T>.value(v),
+            ) ??
+            _FakeFuture_16<T>(
+              this,
+              Invocation.method(
+                #requestJson,
+                [
+                  method,
+                  path,
+                ],
+                {
+                  #statusCode: statusCode,
+                  #fail: fail,
+                  #headers: headers,
+                  #params: params,
+                  #convert: convert,
+                  #body: body,
+                  #preview: preview,
+                },
+              ),
+            ),
+      ) as _i5.Future<T>);
+
+  @override
+  _i5.Future<_i4.Response> request(
+    String? method,
+    String? path, {
+    Map<String, String>? headers,
+    Map<String, dynamic>? params,
+    dynamic body,
+    int? statusCode,
+    void Function(_i4.Response)? fail,
+    String? preview,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #request,
+          [
+            method,
+            path,
+          ],
+          {
             #headers: headers,
             #params: params,
             #body: body,
             #statusCode: statusCode,
             #fail: fail,
-            #preview: preview
-          }),
-          returnValue: _i7.Future<_i3.Response>.value(_FakeResponse_15(
-              this,
-              Invocation.method(#request, [
-                method,
-                path
-              ], {
-                #headers: headers,
-                #params: params,
-                #body: body,
-                #statusCode: statusCode,
-                #fail: fail,
-                #preview: preview
-              }))),
-          returnValueForMissingStub:
-              _i7.Future<_i3.Response>.value(_FakeResponse_15(
-                  this,
-                  Invocation.method(#request, [
-                    method,
-                    path
-                  ], {
-                    #headers: headers,
-                    #params: params,
-                    #body: body,
-                    #statusCode: statusCode,
-                    #fail: fail,
-                    #preview: preview
-                  })))) as _i7.Future<_i3.Response>);
+            #preview: preview,
+          },
+        ),
+        returnValue: _i5.Future<_i4.Response>.value(_FakeResponse_17(
+          this,
+          Invocation.method(
+            #request,
+            [
+              method,
+              path,
+            ],
+            {
+              #headers: headers,
+              #params: params,
+              #body: body,
+              #statusCode: statusCode,
+              #fail: fail,
+              #preview: preview,
+            },
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i4.Response>.value(_FakeResponse_17(
+          this,
+          Invocation.method(
+            #request,
+            [
+              method,
+              path,
+            ],
+            {
+              #headers: headers,
+              #params: params,
+              #body: body,
+              #statusCode: statusCode,
+              #fail: fail,
+              #preview: preview,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i4.Response>);
+
   @override
-  void handleStatusCode(_i3.Response? response) =>
-      super.noSuchMethod(Invocation.method(#handleStatusCode, [response]),
-          returnValueForMissingStub: null);
+  Never handleStatusCode(_i4.Response? response) => (super.noSuchMethod(
+        Invocation.method(
+          #handleStatusCode,
+          [response],
+        ),
+        returnValue: null,
+        returnValueForMissingStub: null,
+      ) as Never);
+
   @override
-  void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
-      returnValueForMissingStub: null);
+  void dispose() => super.noSuchMethod(
+        Invocation.method(
+          #dispose,
+          [],
+        ),
+        returnValueForMissingStub: null,
+      );
 }
 
 /// A class which mocks [Ndk].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockNdk extends _i1.Mock implements _i5.Ndk {
+class MockNdk extends _i1.Mock implements _i6.Ndk {
   @override
-  _i7.Future<_i5.SectionInfo> getTextSectionInfo(String? object) =>
-      (super.noSuchMethod(Invocation.method(#getTextSectionInfo, [object]),
-          returnValue: _i7.Future<_i5.SectionInfo>.value(_FakeSectionInfo_16(
-              this, Invocation.method(#getTextSectionInfo, [object]))),
-          returnValueForMissingStub: _i7.Future<_i5.SectionInfo>.value(
-              _FakeSectionInfo_16(this,
-                  Invocation.method(#getTextSectionInfo, [object])))) as _i7
-          .Future<_i5.SectionInfo>);
+  _i6.LlvmTools get llvmTools => (super.noSuchMethod(
+        Invocation.getter(#llvmTools),
+        returnValue: _FakeLlvmTools_18(
+          this,
+          Invocation.getter(#llvmTools),
+        ),
+        returnValueForMissingStub: _FakeLlvmTools_18(
+          this,
+          Invocation.getter(#llvmTools),
+        ),
+      ) as _i6.LlvmTools);
+
   @override
-  _i7.Future<String> getBuildId(String? object) =>
-      (super.noSuchMethod(Invocation.method(#getBuildId, [object]),
-              returnValue: _i7.Future<String>.value(''),
-              returnValueForMissingStub: _i7.Future<String>.value(''))
-          as _i7.Future<String>);
-  @override
-  _i7.Future<List<String>> symbolize(
-          {String? object, List<String>? addresses, String? arch}) =>
+  _i5.Future<_i6.SectionInfo> getTextSectionInfo(String? object) =>
       (super.noSuchMethod(
-              Invocation.method(#symbolize, [],
-                  {#object: object, #addresses: addresses, #arch: arch}),
-              returnValue: _i7.Future<List<String>>.value(<String>[]),
-              returnValueForMissingStub:
-                  _i7.Future<List<String>>.value(<String>[]))
-          as _i7.Future<List<String>>);
+        Invocation.method(
+          #getTextSectionInfo,
+          [object],
+        ),
+        returnValue: _i5.Future<_i6.SectionInfo>.value(_FakeSectionInfo_19(
+          this,
+          Invocation.method(
+            #getTextSectionInfo,
+            [object],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i6.SectionInfo>.value(_FakeSectionInfo_19(
+          this,
+          Invocation.method(
+            #getTextSectionInfo,
+            [object],
+          ),
+        )),
+      ) as _i5.Future<_i6.SectionInfo>);
+
   @override
-  _i7.Stream<String> objdump({String? object, String? arch}) => (super
-          .noSuchMethod(
-              Invocation.method(#objdump, [], {#object: object, #arch: arch}),
-              returnValue: _i7.Stream<String>.empty(),
-              returnValueForMissingStub: _i7.Stream<String>.empty())
-      as _i7.Stream<String>);
+  _i5.Future<String> getBuildId(String? object) => (super.noSuchMethod(
+        Invocation.method(
+          #getBuildId,
+          [object],
+        ),
+        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #getBuildId,
+            [object],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #getBuildId,
+            [object],
+          ),
+        )),
+      ) as _i5.Future<String>);
+
+  @override
+  _i5.Future<List<String>> symbolize({
+    required String? object,
+    required List<String>? addresses,
+    String? arch,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #symbolize,
+          [],
+          {
+            #object: object,
+            #addresses: addresses,
+            #arch: arch,
+          },
+        ),
+        returnValue: _i5.Future<List<String>>.value(<String>[]),
+        returnValueForMissingStub: _i5.Future<List<String>>.value(<String>[]),
+      ) as _i5.Future<List<String>>);
+
+  @override
+  _i5.Stream<String> objdump({
+    required String? object,
+    required String? arch,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #objdump,
+          [],
+          {
+            #object: object,
+            #arch: arch,
+          },
+        ),
+        returnValue: _i5.Stream<String>.empty(),
+        returnValueForMissingStub: _i5.Stream<String>.empty(),
+      ) as _i5.Stream<String>);
 }
 
 /// A class which mocks [RepositoriesService].
 ///
 /// See the documentation for Mockito's code generation for more information.
 class MockRepositoriesService extends _i1.Mock
-    implements _i4.RepositoriesService {
+    implements _i3.RepositoriesService {
   @override
-  _i4.GitHub get github => (super.noSuchMethod(Invocation.getter(#github),
-      returnValue: _FakeGitHub_17(this, Invocation.getter(#github)),
-      returnValueForMissingStub:
-          _FakeGitHub_17(this, Invocation.getter(#github))) as _i4.GitHub);
+  _i3.GitHub get github => (super.noSuchMethod(
+        Invocation.getter(#github),
+        returnValue: _FakeGitHub_20(
+          this,
+          Invocation.getter(#github),
+        ),
+        returnValueForMissingStub: _FakeGitHub_20(
+          this,
+          Invocation.getter(#github),
+        ),
+      ) as _i3.GitHub);
+
   @override
-  _i7.Stream<_i4.Repository> listRepositories(
-          {String? type = r'owner',
-          String? sort = r'full_name',
-          String? direction = r'asc'}) =>
+  _i5.Stream<_i3.Repository> listRepositories({
+    String? type = r'owner',
+    String? sort = r'full_name',
+    String? direction = r'asc',
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#listRepositories, [],
-                  {#type: type, #sort: sort, #direction: direction}),
-              returnValue: _i7.Stream<_i4.Repository>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Repository>.empty())
-          as _i7.Stream<_i4.Repository>);
+        Invocation.method(
+          #listRepositories,
+          [],
+          {
+            #type: type,
+            #sort: sort,
+            #direction: direction,
+          },
+        ),
+        returnValue: _i5.Stream<_i3.Repository>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
+      ) as _i5.Stream<_i3.Repository>);
+
   @override
-  _i7.Stream<_i4.Repository> listUserRepositories(String? user,
-          {String? type = r'owner',
-          String? sort = r'full_name',
-          String? direction = r'asc'}) =>
+  _i5.Stream<_i3.Repository> listUserRepositories(
+    String? user, {
+    String? type = r'owner',
+    String? sort = r'full_name',
+    String? direction = r'asc',
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#listUserRepositories, [user],
-                  {#type: type, #sort: sort, #direction: direction}),
-              returnValue: _i7.Stream<_i4.Repository>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Repository>.empty())
-          as _i7.Stream<_i4.Repository>);
+        Invocation.method(
+          #listUserRepositories,
+          [user],
+          {
+            #type: type,
+            #sort: sort,
+            #direction: direction,
+          },
+        ),
+        returnValue: _i5.Stream<_i3.Repository>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
+      ) as _i5.Stream<_i3.Repository>);
+
   @override
-  _i7.Stream<_i4.Repository> listOrganizationRepositories(String? org,
-          {String? type = r'all'}) =>
+  _i5.Stream<_i3.Repository> listOrganizationRepositories(
+    String? org, {
+    String? type = r'all',
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #listOrganizationRepositories, [org], {#type: type}),
-              returnValue: _i7.Stream<_i4.Repository>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Repository>.empty())
-          as _i7.Stream<_i4.Repository>);
+        Invocation.method(
+          #listOrganizationRepositories,
+          [org],
+          {#type: type},
+        ),
+        returnValue: _i5.Stream<_i3.Repository>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
+      ) as _i5.Stream<_i3.Repository>);
+
   @override
-  _i7.Stream<_i4.Repository> listPublicRepositories(
-          {int? limit = 50, DateTime? since}) =>
+  _i5.Stream<_i3.Repository> listPublicRepositories({
+    int? limit = 50,
+    DateTime? since,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(
-                  #listPublicRepositories, [], {#limit: limit, #since: since}),
-              returnValue: _i7.Stream<_i4.Repository>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Repository>.empty())
-          as _i7.Stream<_i4.Repository>);
+        Invocation.method(
+          #listPublicRepositories,
+          [],
+          {
+            #limit: limit,
+            #since: since,
+          },
+        ),
+        returnValue: _i5.Stream<_i3.Repository>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
+      ) as _i5.Stream<_i3.Repository>);
+
   @override
-  _i7.Future<_i4.Repository> createRepository(_i4.CreateRepository? repository,
-          {String? org}) =>
+  _i5.Future<_i3.Repository> createRepository(
+    _i3.CreateRepository? repository, {
+    String? org,
+  }) =>
       (super.noSuchMethod(
-          Invocation.method(#createRepository, [repository], {#org: org}),
-          returnValue: _i7.Future<_i4.Repository>.value(_FakeRepository_18(this,
-              Invocation.method(#createRepository, [repository], {#org: org}))),
-          returnValueForMissingStub: _i7.Future<_i4.Repository>.value(
-              _FakeRepository_18(this, Invocation.method(#createRepository, [repository], {#org: org})))) as _i7
-          .Future<_i4.Repository>);
+        Invocation.method(
+          #createRepository,
+          [repository],
+          {#org: org},
+        ),
+        returnValue: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #createRepository,
+            [repository],
+            {#org: org},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #createRepository,
+            [repository],
+            {#org: org},
+          ),
+        )),
+      ) as _i5.Future<_i3.Repository>);
+
   @override
-  _i7.Future<_i4.LicenseDetails> getLicense(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#getLicense, [slug]),
-              returnValue: _i7.Future<_i4.LicenseDetails>.value(
-                  _FakeLicenseDetails_19(
-                      this, Invocation.method(#getLicense, [slug]))),
-              returnValueForMissingStub: _i7.Future<_i4.LicenseDetails>.value(
-                  _FakeLicenseDetails_19(
-                      this, Invocation.method(#getLicense, [slug]))))
-          as _i7.Future<_i4.LicenseDetails>);
-  @override
-  _i7.Future<_i4.Repository> getRepository(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#getRepository, [slug]),
-              returnValue: _i7.Future<_i4.Repository>.value(_FakeRepository_18(
-                  this, Invocation.method(#getRepository, [slug]))),
-              returnValueForMissingStub: _i7.Future<_i4.Repository>.value(
-                  _FakeRepository_18(
-                      this, Invocation.method(#getRepository, [slug]))))
-          as _i7.Future<_i4.Repository>);
-  @override
-  _i7.Stream<_i4.Repository> getRepositories(List<_i4.RepositorySlug>? slugs) =>
-      (super.noSuchMethod(Invocation.method(#getRepositories, [slugs]),
-              returnValue: _i7.Stream<_i4.Repository>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Repository>.empty())
-          as _i7.Stream<_i4.Repository>);
-  @override
-  _i7.Future<_i4.Repository> editRepository(_i4.RepositorySlug? slug,
-          {String? name,
-          String? description,
-          String? homepage,
-          bool? private,
-          bool? hasIssues,
-          bool? hasWiki,
-          bool? hasDownloads}) =>
+  _i5.Future<_i3.LicenseDetails> getLicense(_i3.RepositorySlug? slug) =>
       (super.noSuchMethod(
-          Invocation.method(#editRepository, [
-            slug
-          ], {
+        Invocation.method(
+          #getLicense,
+          [slug],
+        ),
+        returnValue:
+            _i5.Future<_i3.LicenseDetails>.value(_FakeLicenseDetails_22(
+          this,
+          Invocation.method(
+            #getLicense,
+            [slug],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.LicenseDetails>.value(_FakeLicenseDetails_22(
+          this,
+          Invocation.method(
+            #getLicense,
+            [slug],
+          ),
+        )),
+      ) as _i5.Future<_i3.LicenseDetails>);
+
+  @override
+  _i5.Future<_i3.Repository> getRepository(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getRepository,
+          [slug],
+        ),
+        returnValue: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #getRepository,
+            [slug],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #getRepository,
+            [slug],
+          ),
+        )),
+      ) as _i5.Future<_i3.Repository>);
+
+  @override
+  _i5.Stream<_i3.Repository> getRepositories(List<_i3.RepositorySlug>? slugs) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getRepositories,
+          [slugs],
+        ),
+        returnValue: _i5.Stream<_i3.Repository>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
+      ) as _i5.Stream<_i3.Repository>);
+
+  @override
+  _i5.Future<_i3.Repository> editRepository(
+    _i3.RepositorySlug? slug, {
+    String? name,
+    String? description,
+    String? homepage,
+    bool? private,
+    bool? hasIssues,
+    bool? hasWiki,
+    bool? hasDownloads,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #editRepository,
+          [slug],
+          {
             #name: name,
             #description: description,
             #homepage: homepage,
             #private: private,
             #hasIssues: hasIssues,
             #hasWiki: hasWiki,
-            #hasDownloads: hasDownloads
-          }),
-          returnValue: _i7.Future<_i4.Repository>.value(_FakeRepository_18(
-              this,
-              Invocation.method(#editRepository, [
-                slug
-              ], {
-                #name: name,
-                #description: description,
-                #homepage: homepage,
-                #private: private,
-                #hasIssues: hasIssues,
-                #hasWiki: hasWiki,
-                #hasDownloads: hasDownloads
-              }))),
-          returnValueForMissingStub:
-              _i7.Future<_i4.Repository>.value(_FakeRepository_18(
-                  this,
-                  Invocation.method(#editRepository, [
-                    slug
-                  ], {
-                    #name: name,
-                    #description: description,
-                    #homepage: homepage,
-                    #private: private,
-                    #hasIssues: hasIssues,
-                    #hasWiki: hasWiki,
-                    #hasDownloads: hasDownloads
-                  })))) as _i7.Future<_i4.Repository>);
+            #hasDownloads: hasDownloads,
+          },
+        ),
+        returnValue: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #editRepository,
+            [slug],
+            {
+              #name: name,
+              #description: description,
+              #homepage: homepage,
+              #private: private,
+              #hasIssues: hasIssues,
+              #hasWiki: hasWiki,
+              #hasDownloads: hasDownloads,
+            },
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #editRepository,
+            [slug],
+            {
+              #name: name,
+              #description: description,
+              #homepage: homepage,
+              #private: private,
+              #hasIssues: hasIssues,
+              #hasWiki: hasWiki,
+              #hasDownloads: hasDownloads,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i3.Repository>);
+
   @override
-  _i7.Future<bool> deleteRepository(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#deleteRepository, [slug]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Stream<_i4.Contributor> listContributors(_i4.RepositorySlug? slug,
-          {bool? anon = false}) =>
+  _i5.Future<bool> deleteRepository(_i3.RepositorySlug? slug) =>
       (super.noSuchMethod(
-              Invocation.method(#listContributors, [slug], {#anon: anon}),
-              returnValue: _i7.Stream<_i4.Contributor>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Contributor>.empty())
-          as _i7.Stream<_i4.Contributor>);
+        Invocation.method(
+          #deleteRepository,
+          [slug],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
   @override
-  _i7.Stream<_i4.Team> listTeams(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listTeams, [slug]),
-              returnValue: _i7.Stream<_i4.Team>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Team>.empty())
-          as _i7.Stream<_i4.Team>);
-  @override
-  _i7.Future<_i4.LanguageBreakdown> listLanguages(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listLanguages, [slug]),
-          returnValue: _i7.Future<_i4.LanguageBreakdown>.value(
-              _FakeLanguageBreakdown_20(
-                  this, Invocation.method(#listLanguages, [slug]))),
-          returnValueForMissingStub: _i7.Future<_i4.LanguageBreakdown>.value(
-              _FakeLanguageBreakdown_20(
-                  this, Invocation.method(#listLanguages, [slug])))) as _i7
-          .Future<_i4.LanguageBreakdown>);
-  @override
-  _i7.Stream<_i4.Tag> listTags(_i4.RepositorySlug? slug,
-          {int? page = 1, int? pages, int? perPage = 30}) =>
+  _i5.Stream<_i3.Contributor> listContributors(
+    _i3.RepositorySlug? slug, {
+    bool? anon = false,
+  }) =>
       (super.noSuchMethod(
-              Invocation.method(#listTags, [slug],
-                  {#page: page, #pages: pages, #perPage: perPage}),
-              returnValue: _i7.Stream<_i4.Tag>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Tag>.empty())
-          as _i7.Stream<_i4.Tag>);
+        Invocation.method(
+          #listContributors,
+          [slug],
+          {#anon: anon},
+        ),
+        returnValue: _i5.Stream<_i3.Contributor>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Contributor>.empty(),
+      ) as _i5.Stream<_i3.Contributor>);
+
   @override
-  _i7.Stream<_i4.Branch> listBranches(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listBranches, [slug]),
-              returnValue: _i7.Stream<_i4.Branch>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Branch>.empty())
-          as _i7.Stream<_i4.Branch>);
-  @override
-  _i7.Future<_i4.Branch> getBranch(_i4.RepositorySlug? slug, String? branch) =>
-      (super.noSuchMethod(Invocation.method(#getBranch, [slug, branch]),
-              returnValue: _i7.Future<_i4.Branch>.value(_FakeBranch_21(
-                  this, Invocation.method(#getBranch, [slug, branch]))),
-              returnValueForMissingStub: _i7.Future<_i4.Branch>.value(
-                  _FakeBranch_21(
-                      this, Invocation.method(#getBranch, [slug, branch]))))
-          as _i7.Future<_i4.Branch>);
-  @override
-  _i7.Stream<_i4.Collaborator> listCollaborators(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listCollaborators, [slug]),
-              returnValue: _i7.Stream<_i4.Collaborator>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Collaborator>.empty())
-          as _i7.Stream<_i4.Collaborator>);
-  @override
-  _i7.Future<bool> isCollaborator(_i4.RepositorySlug? slug, String? user) =>
-      (super.noSuchMethod(Invocation.method(#isCollaborator, [slug, user]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Future<bool> addCollaborator(_i4.RepositorySlug? slug, String? user) =>
-      (super.noSuchMethod(Invocation.method(#addCollaborator, [slug, user]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Future<bool> removeCollaborator(_i4.RepositorySlug? slug, String? user) =>
-      (super.noSuchMethod(Invocation.method(#removeCollaborator, [slug, user]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Stream<_i4.CommitComment> listSingleCommitComments(
-          _i4.RepositorySlug? slug, _i4.RepositoryCommit? commit) =>
+  _i5.Stream<_i3.Team> listTeams(_i3.RepositorySlug? slug) =>
       (super.noSuchMethod(
-              Invocation.method(#listSingleCommitComments, [slug, commit]),
-              returnValue: _i7.Stream<_i4.CommitComment>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.CommitComment>.empty())
-          as _i7.Stream<_i4.CommitComment>);
+        Invocation.method(
+          #listTeams,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.Team>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Team>.empty(),
+      ) as _i5.Stream<_i3.Team>);
+
   @override
-  _i7.Stream<_i4.CommitComment> listCommitComments(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listCommitComments, [slug]),
-              returnValue: _i7.Stream<_i4.CommitComment>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.CommitComment>.empty())
-          as _i7.Stream<_i4.CommitComment>);
-  @override
-  _i7.Future<_i4.CommitComment> createCommitComment(
-          _i4.RepositorySlug? slug, _i4.RepositoryCommit? commit,
-          {String? body, String? path, int? position, int? line}) =>
-      (super.noSuchMethod(Invocation.method(#createCommitComment, [slug, commit], {#body: body, #path: path, #position: position, #line: line}),
-              returnValue: _i7.Future<_i4.CommitComment>.value(_FakeCommitComment_22(
-                  this,
-                  Invocation.method(#createCommitComment, [
-                    slug,
-                    commit
-                  ], {
-                    #body: body,
-                    #path: path,
-                    #position: position,
-                    #line: line
-                  }))),
-              returnValueForMissingStub: _i7.Future<_i4.CommitComment>.value(_FakeCommitComment_22(this, Invocation.method(#createCommitComment, [slug, commit], {#body: body, #path: path, #position: position, #line: line}))))
-          as _i7.Future<_i4.CommitComment>);
-  @override
-  _i7.Future<_i4.CommitComment> getCommitComment(_i4.RepositorySlug? slug,
-          {int? id}) =>
-      (super.noSuchMethod(Invocation.method(#getCommitComment, [slug], {#id: id}),
-              returnValue: _i7.Future<_i4.CommitComment>.value(_FakeCommitComment_22(
-                  this, Invocation.method(#getCommitComment, [slug], {#id: id}))),
-              returnValueForMissingStub: _i7.Future<_i4.CommitComment>.value(
-                  _FakeCommitComment_22(
-                      this, Invocation.method(#getCommitComment, [slug], {#id: id}))))
-          as _i7.Future<_i4.CommitComment>);
-  @override
-  _i7.Future<_i4.CommitComment> updateCommitComment(_i4.RepositorySlug? slug,
-          {int? id, String? body}) =>
-      (super.noSuchMethod(Invocation.method(#updateCommitComment, [slug], {#id: id, #body: body}),
-              returnValue: _i7.Future<_i4.CommitComment>.value(
-                  _FakeCommitComment_22(
-                      this,
-                      Invocation.method(
-                          #updateCommitComment, [slug], {#id: id, #body: body}))),
-              returnValueForMissingStub: _i7.Future<_i4.CommitComment>.value(
-                  _FakeCommitComment_22(this, Invocation.method(#updateCommitComment, [slug], {#id: id, #body: body}))))
-          as _i7.Future<_i4.CommitComment>);
-  @override
-  _i7.Future<bool> deleteCommitComment(_i4.RepositorySlug? slug, {int? id}) =>
+  _i5.Future<_i3.LanguageBreakdown> listLanguages(_i3.RepositorySlug? slug) =>
       (super.noSuchMethod(
-              Invocation.method(#deleteCommitComment, [slug], {#id: id}),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
+        Invocation.method(
+          #listLanguages,
+          [slug],
+        ),
+        returnValue:
+            _i5.Future<_i3.LanguageBreakdown>.value(_FakeLanguageBreakdown_23(
+          this,
+          Invocation.method(
+            #listLanguages,
+            [slug],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.LanguageBreakdown>.value(_FakeLanguageBreakdown_23(
+          this,
+          Invocation.method(
+            #listLanguages,
+            [slug],
+          ),
+        )),
+      ) as _i5.Future<_i3.LanguageBreakdown>);
+
   @override
-  _i7.Stream<_i4.RepositoryCommit> listCommits(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listCommits, [slug]),
-              returnValue: _i7.Stream<_i4.RepositoryCommit>.empty(),
-              returnValueForMissingStub:
-                  _i7.Stream<_i4.RepositoryCommit>.empty())
-          as _i7.Stream<_i4.RepositoryCommit>);
-  @override
-  _i7.Future<_i4.RepositoryCommit> getCommit(_i4.RepositorySlug? slug, String? sha) =>
-      (super.noSuchMethod(Invocation.method(#getCommit, [slug, sha]),
-              returnValue: _i7.Future<_i4.RepositoryCommit>.value(
-                  _FakeRepositoryCommit_23(
-                      this, Invocation.method(#getCommit, [slug, sha]))),
-              returnValueForMissingStub: _i7.Future<_i4.RepositoryCommit>.value(
-                  _FakeRepositoryCommit_23(
-                      this, Invocation.method(#getCommit, [slug, sha]))))
-          as _i7.Future<_i4.RepositoryCommit>);
-  @override
-  _i7.Future<String> getCommitDiff(_i4.RepositorySlug? slug, String? sha) =>
-      (super.noSuchMethod(Invocation.method(#getCommitDiff, [slug, sha]),
-              returnValue: _i7.Future<String>.value(''),
-              returnValueForMissingStub: _i7.Future<String>.value(''))
-          as _i7.Future<String>);
-  @override
-  _i7.Future<_i4.GitHubComparison> compareCommits(
-          _i4.RepositorySlug? slug, String? refBase, String? refHead) =>
+  _i5.Stream<_i3.Tag> listTags(
+    _i3.RepositorySlug? slug, {
+    int? page = 1,
+    int? pages,
+    int? perPage = 30,
+  }) =>
       (super.noSuchMethod(
-          Invocation.method(#compareCommits, [slug, refBase, refHead]),
-          returnValue: _i7.Future<_i4.GitHubComparison>.value(_FakeGitHubComparison_24(
-              this,
-              Invocation.method(#compareCommits, [slug, refBase, refHead]))),
-          returnValueForMissingStub: _i7.Future<_i4.GitHubComparison>.value(
-              _FakeGitHubComparison_24(this, Invocation.method(#compareCommits, [slug, refBase, refHead])))) as _i7
-          .Future<_i4.GitHubComparison>);
+        Invocation.method(
+          #listTags,
+          [slug],
+          {
+            #page: page,
+            #pages: pages,
+            #perPage: perPage,
+          },
+        ),
+        returnValue: _i5.Stream<_i3.Tag>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Tag>.empty(),
+      ) as _i5.Stream<_i3.Tag>);
+
   @override
-  _i7.Future<_i4.GitHubFile> getReadme(_i4.RepositorySlug? slug,
-          {String? ref}) =>
-      (super.noSuchMethod(Invocation.method(#getReadme, [slug], {#ref: ref}),
-              returnValue: _i7.Future<_i4.GitHubFile>.value(_FakeGitHubFile_25(
-                  this, Invocation.method(#getReadme, [slug], {#ref: ref}))),
-              returnValueForMissingStub: _i7.Future<_i4.GitHubFile>.value(
-                  _FakeGitHubFile_25(this,
-                      Invocation.method(#getReadme, [slug], {#ref: ref}))))
-          as _i7.Future<_i4.GitHubFile>);
-  @override
-  _i7.Future<_i4.RepositoryContents> getContents(
-          _i4.RepositorySlug? slug, String? path, {String? ref}) =>
+  _i5.Stream<_i3.Branch> listBranches(_i3.RepositorySlug? slug) =>
       (super.noSuchMethod(
-              Invocation.method(#getContents, [slug, path], {#ref: ref}),
-              returnValue: _i7.Future<_i4.RepositoryContents>.value(
-                  _FakeRepositoryContents_26(this,
-                      Invocation.method(#getContents, [slug, path], {#ref: ref}))),
-              returnValueForMissingStub: _i7.Future<_i4.RepositoryContents>.value(
-                  _FakeRepositoryContents_26(this, Invocation.method(#getContents, [slug, path], {#ref: ref}))))
-          as _i7.Future<_i4.RepositoryContents>);
+        Invocation.method(
+          #listBranches,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.Branch>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Branch>.empty(),
+      ) as _i5.Stream<_i3.Branch>);
+
   @override
-  _i7.Future<_i4.ContentCreation> createFile(
-          _i4.RepositorySlug? slug, _i4.CreateFile? file) =>
-      (super.noSuchMethod(Invocation.method(#createFile, [slug, file]),
-              returnValue: _i7.Future<_i4.ContentCreation>.value(_FakeContentCreation_27(
-                  this, Invocation.method(#createFile, [slug, file]))),
-              returnValueForMissingStub: _i7.Future<_i4.ContentCreation>.value(
-                  _FakeContentCreation_27(
-                      this, Invocation.method(#createFile, [slug, file]))))
-          as _i7.Future<_i4.ContentCreation>);
-  @override
-  _i7.Future<_i4.ContentCreation> updateFile(
-          _i4.RepositorySlug? slug, String? path, String? message, String? content, String? sha,
-          {String? branch}) =>
-      (super.noSuchMethod(Invocation.method(#updateFile, [slug, path, message, content, sha], {#branch: branch}),
-              returnValue: _i7.Future<_i4.ContentCreation>.value(_FakeContentCreation_27(
-                  this,
-                  Invocation.method(#updateFile,
-                      [slug, path, message, content, sha], {#branch: branch}))),
-              returnValueForMissingStub: _i7.Future<_i4.ContentCreation>.value(_FakeContentCreation_27(this, Invocation.method(#updateFile, [slug, path, message, content, sha], {#branch: branch}))))
-          as _i7.Future<_i4.ContentCreation>);
-  @override
-  _i7.Future<_i4.ContentCreation> deleteFile(_i4.RepositorySlug? slug,
-          String? path, String? message, String? sha, String? branch) =>
-      (super.noSuchMethod(Invocation.method(#deleteFile, [slug, path, message, sha, branch]),
-              returnValue: _i7.Future<_i4.ContentCreation>.value(_FakeContentCreation_27(
-                  this,
-                  Invocation.method(
-                      #deleteFile, [slug, path, message, sha, branch]))),
-              returnValueForMissingStub: _i7.Future<_i4.ContentCreation>.value(
-                  _FakeContentCreation_27(this, Invocation.method(#deleteFile, [slug, path, message, sha, branch]))))
-          as _i7.Future<_i4.ContentCreation>);
-  @override
-  _i7.Future<String?> getArchiveLink(_i4.RepositorySlug? slug, String? ref,
-          {String? format = r'tarball'}) =>
+  _i5.Future<_i3.Branch> getBranch(
+    _i3.RepositorySlug? slug,
+    String? branch,
+  ) =>
       (super.noSuchMethod(
-          Invocation.method(#getArchiveLink, [slug, ref], {#format: format}),
-          returnValue: _i7.Future<String?>.value(),
-          returnValueForMissingStub:
-              _i7.Future<String?>.value()) as _i7.Future<String?>);
-  @override
-  _i7.Stream<_i4.Repository> listForks(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listForks, [slug]),
-              returnValue: _i7.Stream<_i4.Repository>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Repository>.empty())
-          as _i7.Stream<_i4.Repository>);
-  @override
-  _i7.Future<_i4.Repository> createFork(_i4.RepositorySlug? slug,
-          [_i4.CreateFork? fork]) =>
-      (super.noSuchMethod(Invocation.method(#createFork, [slug, fork]),
-              returnValue: _i7.Future<_i4.Repository>.value(_FakeRepository_18(
-                  this, Invocation.method(#createFork, [slug, fork]))),
-              returnValueForMissingStub: _i7.Future<_i4.Repository>.value(
-                  _FakeRepository_18(
-                      this, Invocation.method(#createFork, [slug, fork]))))
-          as _i7.Future<_i4.Repository>);
-  @override
-  _i7.Stream<_i4.Hook> listHooks(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listHooks, [slug]),
-              returnValue: _i7.Stream<_i4.Hook>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Hook>.empty())
-          as _i7.Stream<_i4.Hook>);
-  @override
-  _i7.Future<_i4.Hook> getHook(_i4.RepositorySlug? slug, int? id) =>
-      (super.noSuchMethod(Invocation.method(#getHook, [slug, id]),
-              returnValue: _i7.Future<_i4.Hook>.value(
-                  _FakeHook_28(this, Invocation.method(#getHook, [slug, id]))),
-              returnValueForMissingStub: _i7.Future<_i4.Hook>.value(
-                  _FakeHook_28(this, Invocation.method(#getHook, [slug, id]))))
-          as _i7.Future<_i4.Hook>);
-  @override
-  _i7.Future<_i4.Hook> createHook(
-          _i4.RepositorySlug? slug, _i4.CreateHook? hook) =>
-      (super.noSuchMethod(Invocation.method(#createHook, [slug, hook]),
-          returnValue: _i7.Future<_i4.Hook>.value(
-              _FakeHook_28(this, Invocation.method(#createHook, [slug, hook]))),
-          returnValueForMissingStub: _i7.Future<_i4.Hook>.value(_FakeHook_28(
-              this, Invocation.method(#createHook, [slug, hook])))) as _i7
-          .Future<_i4.Hook>);
-  @override
-  _i7.Future<_i4.Hook> editHook(_i4.RepositorySlug? slug, _i4.Hook? hookToEdit,
-          {String? configUrl,
-          String? configContentType,
-          String? configSecret,
-          bool? configInsecureSsl,
-          List<String>? events,
-          List<String>? addEvents,
-          List<String>? removeEvents,
-          bool? active}) =>
-      (super.noSuchMethod(
-          Invocation.method(#editHook, [
+        Invocation.method(
+          #getBranch,
+          [
             slug,
-            hookToEdit
-          ], {
+            branch,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.Branch>.value(_FakeBranch_24(
+          this,
+          Invocation.method(
+            #getBranch,
+            [
+              slug,
+              branch,
+            ],
+          ),
+        )),
+        returnValueForMissingStub: _i5.Future<_i3.Branch>.value(_FakeBranch_24(
+          this,
+          Invocation.method(
+            #getBranch,
+            [
+              slug,
+              branch,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.Branch>);
+
+  @override
+  _i5.Stream<_i3.Collaborator> listCollaborators(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listCollaborators,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.Collaborator>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Collaborator>.empty(),
+      ) as _i5.Stream<_i3.Collaborator>);
+
+  @override
+  _i5.Future<bool> isCollaborator(
+    _i3.RepositorySlug? slug,
+    String? user,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #isCollaborator,
+          [
+            slug,
+            user,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Future<bool> addCollaborator(
+    _i3.RepositorySlug? slug,
+    String? user,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #addCollaborator,
+          [
+            slug,
+            user,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Future<bool> removeCollaborator(
+    _i3.RepositorySlug? slug,
+    String? user,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #removeCollaborator,
+          [
+            slug,
+            user,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Stream<_i3.CommitComment> listSingleCommitComments(
+    _i3.RepositorySlug? slug,
+    _i3.RepositoryCommit? commit,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listSingleCommitComments,
+          [
+            slug,
+            commit,
+          ],
+        ),
+        returnValue: _i5.Stream<_i3.CommitComment>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.CommitComment>.empty(),
+      ) as _i5.Stream<_i3.CommitComment>);
+
+  @override
+  _i5.Stream<_i3.CommitComment> listCommitComments(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listCommitComments,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.CommitComment>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.CommitComment>.empty(),
+      ) as _i5.Stream<_i3.CommitComment>);
+
+  @override
+  _i5.Future<_i3.CommitComment> createCommitComment(
+    _i3.RepositorySlug? slug,
+    _i3.RepositoryCommit? commit, {
+    required String? body,
+    String? path,
+    int? position,
+    int? line,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createCommitComment,
+          [
+            slug,
+            commit,
+          ],
+          {
+            #body: body,
+            #path: path,
+            #position: position,
+            #line: line,
+          },
+        ),
+        returnValue: _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
+          this,
+          Invocation.method(
+            #createCommitComment,
+            [
+              slug,
+              commit,
+            ],
+            {
+              #body: body,
+              #path: path,
+              #position: position,
+              #line: line,
+            },
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
+          this,
+          Invocation.method(
+            #createCommitComment,
+            [
+              slug,
+              commit,
+            ],
+            {
+              #body: body,
+              #path: path,
+              #position: position,
+              #line: line,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i3.CommitComment>);
+
+  @override
+  _i5.Future<_i3.CommitComment> getCommitComment(
+    _i3.RepositorySlug? slug, {
+    required int? id,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getCommitComment,
+          [slug],
+          {#id: id},
+        ),
+        returnValue: _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
+          this,
+          Invocation.method(
+            #getCommitComment,
+            [slug],
+            {#id: id},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
+          this,
+          Invocation.method(
+            #getCommitComment,
+            [slug],
+            {#id: id},
+          ),
+        )),
+      ) as _i5.Future<_i3.CommitComment>);
+
+  @override
+  _i5.Future<_i3.CommitComment> updateCommitComment(
+    _i3.RepositorySlug? slug, {
+    required int? id,
+    required String? body,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #updateCommitComment,
+          [slug],
+          {
+            #id: id,
+            #body: body,
+          },
+        ),
+        returnValue: _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
+          this,
+          Invocation.method(
+            #updateCommitComment,
+            [slug],
+            {
+              #id: id,
+              #body: body,
+            },
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.CommitComment>.value(_FakeCommitComment_25(
+          this,
+          Invocation.method(
+            #updateCommitComment,
+            [slug],
+            {
+              #id: id,
+              #body: body,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i3.CommitComment>);
+
+  @override
+  _i5.Future<bool> deleteCommitComment(
+    _i3.RepositorySlug? slug, {
+    required int? id,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #deleteCommitComment,
+          [slug],
+          {#id: id},
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Stream<_i3.RepositoryCommit> listCommits(
+    _i3.RepositorySlug? slug, {
+    String? sha,
+    String? path,
+    String? author,
+    String? committer,
+    DateTime? since,
+    DateTime? until,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listCommits,
+          [slug],
+          {
+            #sha: sha,
+            #path: path,
+            #author: author,
+            #committer: committer,
+            #since: since,
+            #until: until,
+          },
+        ),
+        returnValue: _i5.Stream<_i3.RepositoryCommit>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.RepositoryCommit>.empty(),
+      ) as _i5.Stream<_i3.RepositoryCommit>);
+
+  @override
+  _i5.Future<_i3.RepositoryCommit> getCommit(
+    _i3.RepositorySlug? slug,
+    String? sha,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getCommit,
+          [
+            slug,
+            sha,
+          ],
+        ),
+        returnValue:
+            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
+          this,
+          Invocation.method(
+            #getCommit,
+            [
+              slug,
+              sha,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
+          this,
+          Invocation.method(
+            #getCommit,
+            [
+              slug,
+              sha,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.RepositoryCommit>);
+
+  @override
+  _i5.Future<String> getCommitDiff(
+    _i3.RepositorySlug? slug,
+    String? sha,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getCommitDiff,
+          [
+            slug,
+            sha,
+          ],
+        ),
+        returnValue: _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #getCommitDiff,
+            [
+              slug,
+              sha,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<String>.value(_i8.dummyValue<String>(
+          this,
+          Invocation.method(
+            #getCommitDiff,
+            [
+              slug,
+              sha,
+            ],
+          ),
+        )),
+      ) as _i5.Future<String>);
+
+  @override
+  _i5.Future<_i3.GitHubComparison> compareCommits(
+    _i3.RepositorySlug? slug,
+    String? refBase,
+    String? refHead,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #compareCommits,
+          [
+            slug,
+            refBase,
+            refHead,
+          ],
+        ),
+        returnValue:
+            _i5.Future<_i3.GitHubComparison>.value(_FakeGitHubComparison_27(
+          this,
+          Invocation.method(
+            #compareCommits,
+            [
+              slug,
+              refBase,
+              refHead,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.GitHubComparison>.value(_FakeGitHubComparison_27(
+          this,
+          Invocation.method(
+            #compareCommits,
+            [
+              slug,
+              refBase,
+              refHead,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.GitHubComparison>);
+
+  @override
+  _i5.Future<_i3.GitHubFile> getReadme(
+    _i3.RepositorySlug? slug, {
+    String? ref,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getReadme,
+          [slug],
+          {#ref: ref},
+        ),
+        returnValue: _i5.Future<_i3.GitHubFile>.value(_FakeGitHubFile_28(
+          this,
+          Invocation.method(
+            #getReadme,
+            [slug],
+            {#ref: ref},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.GitHubFile>.value(_FakeGitHubFile_28(
+          this,
+          Invocation.method(
+            #getReadme,
+            [slug],
+            {#ref: ref},
+          ),
+        )),
+      ) as _i5.Future<_i3.GitHubFile>);
+
+  @override
+  _i5.Future<_i3.RepositoryContents> getContents(
+    _i3.RepositorySlug? slug,
+    String? path, {
+    String? ref,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getContents,
+          [
+            slug,
+            path,
+          ],
+          {#ref: ref},
+        ),
+        returnValue:
+            _i5.Future<_i3.RepositoryContents>.value(_FakeRepositoryContents_29(
+          this,
+          Invocation.method(
+            #getContents,
+            [
+              slug,
+              path,
+            ],
+            {#ref: ref},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.RepositoryContents>.value(_FakeRepositoryContents_29(
+          this,
+          Invocation.method(
+            #getContents,
+            [
+              slug,
+              path,
+            ],
+            {#ref: ref},
+          ),
+        )),
+      ) as _i5.Future<_i3.RepositoryContents>);
+
+  @override
+  _i5.Future<_i3.ContentCreation> createFile(
+    _i3.RepositorySlug? slug,
+    _i3.CreateFile? file,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createFile,
+          [
+            slug,
+            file,
+          ],
+        ),
+        returnValue:
+            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
+          this,
+          Invocation.method(
+            #createFile,
+            [
+              slug,
+              file,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
+          this,
+          Invocation.method(
+            #createFile,
+            [
+              slug,
+              file,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.ContentCreation>);
+
+  @override
+  _i5.Future<_i3.ContentCreation> updateFile(
+    _i3.RepositorySlug? slug,
+    String? path,
+    String? message,
+    String? content,
+    String? sha, {
+    String? branch,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #updateFile,
+          [
+            slug,
+            path,
+            message,
+            content,
+            sha,
+          ],
+          {#branch: branch},
+        ),
+        returnValue:
+            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
+          this,
+          Invocation.method(
+            #updateFile,
+            [
+              slug,
+              path,
+              message,
+              content,
+              sha,
+            ],
+            {#branch: branch},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
+          this,
+          Invocation.method(
+            #updateFile,
+            [
+              slug,
+              path,
+              message,
+              content,
+              sha,
+            ],
+            {#branch: branch},
+          ),
+        )),
+      ) as _i5.Future<_i3.ContentCreation>);
+
+  @override
+  _i5.Future<_i3.ContentCreation> deleteFile(
+    _i3.RepositorySlug? slug,
+    String? path,
+    String? message,
+    String? sha,
+    String? branch,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #deleteFile,
+          [
+            slug,
+            path,
+            message,
+            sha,
+            branch,
+          ],
+        ),
+        returnValue:
+            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
+          this,
+          Invocation.method(
+            #deleteFile,
+            [
+              slug,
+              path,
+              message,
+              sha,
+              branch,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.ContentCreation>.value(_FakeContentCreation_30(
+          this,
+          Invocation.method(
+            #deleteFile,
+            [
+              slug,
+              path,
+              message,
+              sha,
+              branch,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.ContentCreation>);
+
+  @override
+  _i5.Future<String?> getArchiveLink(
+    _i3.RepositorySlug? slug,
+    String? ref, {
+    String? format = r'tarball',
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getArchiveLink,
+          [
+            slug,
+            ref,
+          ],
+          {#format: format},
+        ),
+        returnValue: _i5.Future<String?>.value(),
+        returnValueForMissingStub: _i5.Future<String?>.value(),
+      ) as _i5.Future<String?>);
+
+  @override
+  _i5.Stream<_i3.Repository> listForks(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listForks,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.Repository>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Repository>.empty(),
+      ) as _i5.Stream<_i3.Repository>);
+
+  @override
+  _i5.Future<_i3.Repository> createFork(
+    _i3.RepositorySlug? slug, [
+    _i3.CreateFork? fork,
+  ]) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createFork,
+          [
+            slug,
+            fork,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #createFork,
+            [
+              slug,
+              fork,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Repository>.value(_FakeRepository_21(
+          this,
+          Invocation.method(
+            #createFork,
+            [
+              slug,
+              fork,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.Repository>);
+
+  @override
+  _i5.Stream<_i3.Hook> listHooks(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listHooks,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.Hook>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Hook>.empty(),
+      ) as _i5.Stream<_i3.Hook>);
+
+  @override
+  _i5.Future<_i3.Hook> getHook(
+    _i3.RepositorySlug? slug,
+    int? id,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getHook,
+          [
+            slug,
+            id,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.Hook>.value(_FakeHook_31(
+          this,
+          Invocation.method(
+            #getHook,
+            [
+              slug,
+              id,
+            ],
+          ),
+        )),
+        returnValueForMissingStub: _i5.Future<_i3.Hook>.value(_FakeHook_31(
+          this,
+          Invocation.method(
+            #getHook,
+            [
+              slug,
+              id,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.Hook>);
+
+  @override
+  _i5.Future<_i3.Hook> createHook(
+    _i3.RepositorySlug? slug,
+    _i3.CreateHook? hook,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createHook,
+          [
+            slug,
+            hook,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.Hook>.value(_FakeHook_31(
+          this,
+          Invocation.method(
+            #createHook,
+            [
+              slug,
+              hook,
+            ],
+          ),
+        )),
+        returnValueForMissingStub: _i5.Future<_i3.Hook>.value(_FakeHook_31(
+          this,
+          Invocation.method(
+            #createHook,
+            [
+              slug,
+              hook,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.Hook>);
+
+  @override
+  _i5.Future<_i3.Hook> editHook(
+    _i3.RepositorySlug? slug,
+    _i3.Hook? hookToEdit, {
+    String? configUrl,
+    String? configContentType,
+    String? configSecret,
+    bool? configInsecureSsl,
+    List<String>? events,
+    List<String>? addEvents,
+    List<String>? removeEvents,
+    bool? active,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #editHook,
+          [
+            slug,
+            hookToEdit,
+          ],
+          {
             #configUrl: configUrl,
             #configContentType: configContentType,
             #configSecret: configSecret,
@@ -1005,403 +2596,967 @@
             #events: events,
             #addEvents: addEvents,
             #removeEvents: removeEvents,
-            #active: active
-          }),
-          returnValue: _i7.Future<_i4.Hook>.value(_FakeHook_28(
-              this,
-              Invocation.method(#editHook, [
-                slug,
-                hookToEdit
-              ], {
-                #configUrl: configUrl,
-                #configContentType: configContentType,
-                #configSecret: configSecret,
-                #configInsecureSsl: configInsecureSsl,
-                #events: events,
-                #addEvents: addEvents,
-                #removeEvents: removeEvents,
-                #active: active
-              }))),
-          returnValueForMissingStub: _i7.Future<_i4.Hook>.value(_FakeHook_28(
-              this,
-              Invocation.method(#editHook, [
-                slug,
-                hookToEdit
-              ], {
-                #configUrl: configUrl,
-                #configContentType: configContentType,
-                #configSecret: configSecret,
-                #configInsecureSsl: configInsecureSsl,
-                #events: events,
-                #addEvents: addEvents,
-                #removeEvents: removeEvents,
-                #active: active
-              })))) as _i7.Future<_i4.Hook>);
+            #active: active,
+          },
+        ),
+        returnValue: _i5.Future<_i3.Hook>.value(_FakeHook_31(
+          this,
+          Invocation.method(
+            #editHook,
+            [
+              slug,
+              hookToEdit,
+            ],
+            {
+              #configUrl: configUrl,
+              #configContentType: configContentType,
+              #configSecret: configSecret,
+              #configInsecureSsl: configInsecureSsl,
+              #events: events,
+              #addEvents: addEvents,
+              #removeEvents: removeEvents,
+              #active: active,
+            },
+          ),
+        )),
+        returnValueForMissingStub: _i5.Future<_i3.Hook>.value(_FakeHook_31(
+          this,
+          Invocation.method(
+            #editHook,
+            [
+              slug,
+              hookToEdit,
+            ],
+            {
+              #configUrl: configUrl,
+              #configContentType: configContentType,
+              #configSecret: configSecret,
+              #configInsecureSsl: configInsecureSsl,
+              #events: events,
+              #addEvents: addEvents,
+              #removeEvents: removeEvents,
+              #active: active,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i3.Hook>);
+
   @override
-  _i7.Future<bool> testPushHook(_i4.RepositorySlug? slug, int? id) =>
-      (super.noSuchMethod(Invocation.method(#testPushHook, [slug, id]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Future<bool> pingHook(_i4.RepositorySlug? slug, int? id) =>
-      (super.noSuchMethod(Invocation.method(#pingHook, [slug, id]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Future<bool> deleteHook(_i4.RepositorySlug? slug, int? id) =>
-      (super.noSuchMethod(Invocation.method(#deleteHook, [slug, id]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Stream<_i4.PublicKey> listDeployKeys(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listDeployKeys, [slug]),
-              returnValue: _i7.Stream<_i4.PublicKey>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.PublicKey>.empty())
-          as _i7.Stream<_i4.PublicKey>);
-  @override
-  _i7.Future<_i4.PublicKey> getDeployKey(_i4.RepositorySlug? slug, {int? id}) =>
-      (super.noSuchMethod(Invocation.method(#getDeployKey, [slug], {#id: id}),
-              returnValue: _i7.Future<_i4.PublicKey>.value(_FakePublicKey_29(
-                  this, Invocation.method(#getDeployKey, [slug], {#id: id}))),
-              returnValueForMissingStub: _i7.Future<_i4.PublicKey>.value(
-                  _FakePublicKey_29(this,
-                      Invocation.method(#getDeployKey, [slug], {#id: id}))))
-          as _i7.Future<_i4.PublicKey>);
-  @override
-  _i7.Future<_i4.PublicKey> createDeployKey(
-          _i4.RepositorySlug? slug, _i4.CreatePublicKey? key) =>
-      (super.noSuchMethod(Invocation.method(#createDeployKey, [slug, key]),
-              returnValue: _i7.Future<_i4.PublicKey>.value(_FakePublicKey_29(
-                  this, Invocation.method(#createDeployKey, [slug, key]))),
-              returnValueForMissingStub: _i7.Future<_i4.PublicKey>.value(
-                  _FakePublicKey_29(
-                      this, Invocation.method(#createDeployKey, [slug, key]))))
-          as _i7.Future<_i4.PublicKey>);
-  @override
-  _i7.Future<bool> deleteDeployKey(
-          {_i4.RepositorySlug? slug, _i4.PublicKey? key}) =>
+  _i5.Future<bool> testPushHook(
+    _i3.RepositorySlug? slug,
+    int? id,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#deleteDeployKey, [], {#slug: slug, #key: key}),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Future<_i4.RepositoryCommit> merge(
-          _i4.RepositorySlug? slug, _i4.CreateMerge? merge) =>
-      (super.noSuchMethod(Invocation.method(#merge, [slug, merge]),
-              returnValue: _i7.Future<_i4.RepositoryCommit>.value(_FakeRepositoryCommit_23(
-                  this, Invocation.method(#merge, [slug, merge]))),
-              returnValueForMissingStub: _i7.Future<_i4.RepositoryCommit>.value(
-                  _FakeRepositoryCommit_23(
-                      this, Invocation.method(#merge, [slug, merge]))))
-          as _i7.Future<_i4.RepositoryCommit>);
-  @override
-  _i7.Future<_i4.RepositoryPages> getPagesInfo(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#getPagesInfo, [slug]),
-              returnValue: _i7.Future<_i4.RepositoryPages>.value(
-                  _FakeRepositoryPages_30(
-                      this, Invocation.method(#getPagesInfo, [slug]))),
-              returnValueForMissingStub: _i7.Future<_i4.RepositoryPages>.value(
-                  _FakeRepositoryPages_30(
-                      this, Invocation.method(#getPagesInfo, [slug]))))
-          as _i7.Future<_i4.RepositoryPages>);
-  @override
-  _i7.Stream<_i4.PageBuild> listPagesBuilds(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listPagesBuilds, [slug]),
-              returnValue: _i7.Stream<_i4.PageBuild>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.PageBuild>.empty())
-          as _i7.Stream<_i4.PageBuild>);
-  @override
-  _i7.Future<_i4.PageBuild> getLatestPagesBuild(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#getLatestPagesBuild, [slug]),
-              returnValue: _i7.Future<_i4.PageBuild>.value(_FakePageBuild_31(
-                  this, Invocation.method(#getLatestPagesBuild, [slug]))),
-              returnValueForMissingStub: _i7.Future<_i4.PageBuild>.value(
-                  _FakePageBuild_31(
-                      this, Invocation.method(#getLatestPagesBuild, [slug]))))
-          as _i7.Future<_i4.PageBuild>);
-  @override
-  _i7.Stream<_i4.Release> listReleases(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listReleases, [slug]),
-              returnValue: _i7.Stream<_i4.Release>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.Release>.empty())
-          as _i7.Stream<_i4.Release>);
-  @override
-  _i7.Future<_i4.Release> getLatestRelease(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#getLatestRelease, [slug]),
-              returnValue: _i7.Future<_i4.Release>.value(_FakeRelease_32(
-                  this, Invocation.method(#getLatestRelease, [slug]))),
-              returnValueForMissingStub: _i7.Future<_i4.Release>.value(
-                  _FakeRelease_32(
-                      this, Invocation.method(#getLatestRelease, [slug]))))
-          as _i7.Future<_i4.Release>);
-  @override
-  _i7.Future<_i4.Release> getReleaseById(_i4.RepositorySlug? slug, int? id) =>
-      (super.noSuchMethod(Invocation.method(#getReleaseById, [slug, id]),
-              returnValue: _i7.Future<_i4.Release>.value(_FakeRelease_32(
-                  this, Invocation.method(#getReleaseById, [slug, id]))),
-              returnValueForMissingStub: _i7.Future<_i4.Release>.value(
-                  _FakeRelease_32(
-                      this, Invocation.method(#getReleaseById, [slug, id]))))
-          as _i7.Future<_i4.Release>);
-  @override
-  _i7.Future<_i4.Release> getReleaseByTagName(
-          _i4.RepositorySlug? slug, String? tagName) =>
-      (super.noSuchMethod(
-          Invocation.method(#getReleaseByTagName, [slug, tagName]),
-          returnValue: _i7.Future<_i4.Release>.value(_FakeRelease_32(
-              this, Invocation.method(#getReleaseByTagName, [slug, tagName]))),
-          returnValueForMissingStub: _i7.Future<_i4.Release>.value(_FakeRelease_32(
-              this, Invocation.method(#getReleaseByTagName, [slug, tagName])))) as _i7
-          .Future<_i4.Release>);
-  @override
-  _i7.Future<_i4.Release> createRelease(
-          _i4.RepositorySlug? slug, _i4.CreateRelease? createRelease,
-          {bool? getIfExists = true}) =>
-      (super.noSuchMethod(Invocation.method(#createRelease, [slug, createRelease], {#getIfExists: getIfExists}),
-              returnValue: _i7.Future<_i4.Release>.value(_FakeRelease_32(
-                  this,
-                  Invocation.method(#createRelease, [slug, createRelease],
-                      {#getIfExists: getIfExists}))),
-              returnValueForMissingStub:
-                  _i7.Future<_i4.Release>.value(_FakeRelease_32(this, Invocation.method(#createRelease, [slug, createRelease], {#getIfExists: getIfExists}))))
-          as _i7.Future<_i4.Release>);
-  @override
-  _i7.Future<_i4.Release> editRelease(
-          _i4.RepositorySlug? slug, _i4.Release? releaseToEdit,
-          {String? tagName,
-          String? targetCommitish,
-          String? name,
-          String? body,
-          bool? draft,
-          bool? preRelease}) =>
-      (super.noSuchMethod(
-          Invocation.method(#editRelease, [
+        Invocation.method(
+          #testPushHook,
+          [
             slug,
-            releaseToEdit
-          ], {
+            id,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Future<bool> pingHook(
+    _i3.RepositorySlug? slug,
+    int? id,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #pingHook,
+          [
+            slug,
+            id,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Future<bool> deleteHook(
+    _i3.RepositorySlug? slug,
+    int? id,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #deleteHook,
+          [
+            slug,
+            id,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Stream<_i3.PublicKey> listDeployKeys(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listDeployKeys,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.PublicKey>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.PublicKey>.empty(),
+      ) as _i5.Stream<_i3.PublicKey>);
+
+  @override
+  _i5.Future<_i3.PublicKey> getDeployKey(
+    _i3.RepositorySlug? slug, {
+    required int? id,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getDeployKey,
+          [slug],
+          {#id: id},
+        ),
+        returnValue: _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
+          this,
+          Invocation.method(
+            #getDeployKey,
+            [slug],
+            {#id: id},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
+          this,
+          Invocation.method(
+            #getDeployKey,
+            [slug],
+            {#id: id},
+          ),
+        )),
+      ) as _i5.Future<_i3.PublicKey>);
+
+  @override
+  _i5.Future<_i3.PublicKey> createDeployKey(
+    _i3.RepositorySlug? slug,
+    _i3.CreatePublicKey? key,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createDeployKey,
+          [
+            slug,
+            key,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
+          this,
+          Invocation.method(
+            #createDeployKey,
+            [
+              slug,
+              key,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.PublicKey>.value(_FakePublicKey_32(
+          this,
+          Invocation.method(
+            #createDeployKey,
+            [
+              slug,
+              key,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.PublicKey>);
+
+  @override
+  _i5.Future<bool> deleteDeployKey({
+    required _i3.RepositorySlug? slug,
+    required _i3.PublicKey? key,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #deleteDeployKey,
+          [],
+          {
+            #slug: slug,
+            #key: key,
+          },
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Future<_i3.RepositoryCommit> merge(
+    _i3.RepositorySlug? slug,
+    _i3.CreateMerge? merge,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #merge,
+          [
+            slug,
+            merge,
+          ],
+        ),
+        returnValue:
+            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
+          this,
+          Invocation.method(
+            #merge,
+            [
+              slug,
+              merge,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.RepositoryCommit>.value(_FakeRepositoryCommit_26(
+          this,
+          Invocation.method(
+            #merge,
+            [
+              slug,
+              merge,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.RepositoryCommit>);
+
+  @override
+  _i5.Future<_i3.RepositoryPages> getPagesInfo(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getPagesInfo,
+          [slug],
+        ),
+        returnValue:
+            _i5.Future<_i3.RepositoryPages>.value(_FakeRepositoryPages_33(
+          this,
+          Invocation.method(
+            #getPagesInfo,
+            [slug],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.RepositoryPages>.value(_FakeRepositoryPages_33(
+          this,
+          Invocation.method(
+            #getPagesInfo,
+            [slug],
+          ),
+        )),
+      ) as _i5.Future<_i3.RepositoryPages>);
+
+  @override
+  _i5.Stream<_i3.PageBuild> listPagesBuilds(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listPagesBuilds,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.PageBuild>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.PageBuild>.empty(),
+      ) as _i5.Stream<_i3.PageBuild>);
+
+  @override
+  _i5.Future<_i3.PageBuild> getLatestPagesBuild(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getLatestPagesBuild,
+          [slug],
+        ),
+        returnValue: _i5.Future<_i3.PageBuild>.value(_FakePageBuild_34(
+          this,
+          Invocation.method(
+            #getLatestPagesBuild,
+            [slug],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.PageBuild>.value(_FakePageBuild_34(
+          this,
+          Invocation.method(
+            #getLatestPagesBuild,
+            [slug],
+          ),
+        )),
+      ) as _i5.Future<_i3.PageBuild>);
+
+  @override
+  _i5.Stream<_i3.Release> listReleases(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listReleases,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.Release>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.Release>.empty(),
+      ) as _i5.Stream<_i3.Release>);
+
+  @override
+  _i5.Future<_i3.Release> getLatestRelease(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getLatestRelease,
+          [slug],
+        ),
+        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #getLatestRelease,
+            [slug],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #getLatestRelease,
+            [slug],
+          ),
+        )),
+      ) as _i5.Future<_i3.Release>);
+
+  @override
+  _i5.Future<_i3.Release> getReleaseById(
+    _i3.RepositorySlug? slug,
+    int? id,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getReleaseById,
+          [
+            slug,
+            id,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #getReleaseById,
+            [
+              slug,
+              id,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #getReleaseById,
+            [
+              slug,
+              id,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.Release>);
+
+  @override
+  _i5.Future<_i3.Release> getReleaseByTagName(
+    _i3.RepositorySlug? slug,
+    String? tagName,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getReleaseByTagName,
+          [
+            slug,
+            tagName,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #getReleaseByTagName,
+            [
+              slug,
+              tagName,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #getReleaseByTagName,
+            [
+              slug,
+              tagName,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.Release>);
+
+  @override
+  _i5.Future<_i3.Release> createRelease(
+    _i3.RepositorySlug? slug,
+    _i3.CreateRelease? createRelease, {
+    bool? getIfExists = true,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createRelease,
+          [
+            slug,
+            createRelease,
+          ],
+          {#getIfExists: getIfExists},
+        ),
+        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #createRelease,
+            [
+              slug,
+              createRelease,
+            ],
+            {#getIfExists: getIfExists},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #createRelease,
+            [
+              slug,
+              createRelease,
+            ],
+            {#getIfExists: getIfExists},
+          ),
+        )),
+      ) as _i5.Future<_i3.Release>);
+
+  @override
+  _i5.Future<_i3.Release> editRelease(
+    _i3.RepositorySlug? slug,
+    _i3.Release? releaseToEdit, {
+    String? tagName,
+    String? targetCommitish,
+    String? name,
+    String? body,
+    bool? draft,
+    bool? preRelease,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #editRelease,
+          [
+            slug,
+            releaseToEdit,
+          ],
+          {
             #tagName: tagName,
             #targetCommitish: targetCommitish,
             #name: name,
             #body: body,
             #draft: draft,
-            #preRelease: preRelease
-          }),
-          returnValue: _i7.Future<_i4.Release>.value(_FakeRelease_32(
-              this,
-              Invocation.method(#editRelease, [
-                slug,
-                releaseToEdit
-              ], {
-                #tagName: tagName,
-                #targetCommitish: targetCommitish,
-                #name: name,
-                #body: body,
-                #draft: draft,
-                #preRelease: preRelease
-              }))),
-          returnValueForMissingStub:
-              _i7.Future<_i4.Release>.value(_FakeRelease_32(
-                  this,
-                  Invocation.method(#editRelease, [
-                    slug,
-                    releaseToEdit
-                  ], {
-                    #tagName: tagName,
-                    #targetCommitish: targetCommitish,
-                    #name: name,
-                    #body: body,
-                    #draft: draft,
-                    #preRelease: preRelease
-                  })))) as _i7.Future<_i4.Release>);
-  @override
-  _i7.Future<bool> deleteRelease(
-          _i4.RepositorySlug? slug, _i4.Release? release) =>
-      (super.noSuchMethod(Invocation.method(#deleteRelease, [slug, release]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Stream<_i4.ReleaseAsset> listReleaseAssets(
-          _i4.RepositorySlug? slug, _i4.Release? release) =>
-      (super.noSuchMethod(
-              Invocation.method(#listReleaseAssets, [slug, release]),
-              returnValue: _i7.Stream<_i4.ReleaseAsset>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.ReleaseAsset>.empty())
-          as _i7.Stream<_i4.ReleaseAsset>);
-  @override
-  _i7.Future<_i4.ReleaseAsset> getReleaseAsset(
-          _i4.RepositorySlug? slug, _i4.Release? release, {int? assetId}) =>
-      (super.noSuchMethod(Invocation.method(#getReleaseAsset, [slug, release], {#assetId: assetId}),
-              returnValue: _i7.Future<_i4.ReleaseAsset>.value(_FakeReleaseAsset_33(
-                  this,
-                  Invocation.method(
-                      #getReleaseAsset, [slug, release], {#assetId: assetId}))),
-              returnValueForMissingStub: _i7.Future<_i4.ReleaseAsset>.value(
-                  _FakeReleaseAsset_33(this, Invocation.method(#getReleaseAsset, [slug, release], {#assetId: assetId}))))
-          as _i7.Future<_i4.ReleaseAsset>);
-  @override
-  _i7.Future<_i4.ReleaseAsset> editReleaseAsset(
-          _i4.RepositorySlug? slug, _i4.ReleaseAsset? assetToEdit,
-          {String? name, String? label}) =>
-      (super.noSuchMethod(Invocation.method(#editReleaseAsset, [slug, assetToEdit], {#name: name, #label: label}),
-              returnValue: _i7.Future<_i4.ReleaseAsset>.value(_FakeReleaseAsset_33(
-                  this,
-                  Invocation.method(#editReleaseAsset, [slug, assetToEdit],
-                      {#name: name, #label: label}))),
-              returnValueForMissingStub:
-                  _i7.Future<_i4.ReleaseAsset>.value(_FakeReleaseAsset_33(this, Invocation.method(#editReleaseAsset, [slug, assetToEdit], {#name: name, #label: label}))))
-          as _i7.Future<_i4.ReleaseAsset>);
-  @override
-  _i7.Future<bool> deleteReleaseAsset(
-          _i4.RepositorySlug? slug, _i4.ReleaseAsset? asset) =>
-      (super.noSuchMethod(Invocation.method(#deleteReleaseAsset, [slug, asset]),
-              returnValue: _i7.Future<bool>.value(false),
-              returnValueForMissingStub: _i7.Future<bool>.value(false))
-          as _i7.Future<bool>);
-  @override
-  _i7.Future<List<_i4.ReleaseAsset>> uploadReleaseAssets(_i4.Release? release,
-          Iterable<_i4.CreateReleaseAsset>? createReleaseAssets) =>
-      (super.noSuchMethod(
+            #preRelease: preRelease,
+          },
+        ),
+        returnValue: _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
           Invocation.method(
-              #uploadReleaseAssets, [release, createReleaseAssets]),
-          returnValue:
-              _i7.Future<List<_i4.ReleaseAsset>>.value(<_i4.ReleaseAsset>[]),
-          returnValueForMissingStub: _i7.Future<List<_i4.ReleaseAsset>>.value(
-              <_i4.ReleaseAsset>[])) as _i7.Future<List<_i4.ReleaseAsset>>);
+            #editRelease,
+            [
+              slug,
+              releaseToEdit,
+            ],
+            {
+              #tagName: tagName,
+              #targetCommitish: targetCommitish,
+              #name: name,
+              #body: body,
+              #draft: draft,
+              #preRelease: preRelease,
+            },
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.Release>.value(_FakeRelease_35(
+          this,
+          Invocation.method(
+            #editRelease,
+            [
+              slug,
+              releaseToEdit,
+            ],
+            {
+              #tagName: tagName,
+              #targetCommitish: targetCommitish,
+              #name: name,
+              #body: body,
+              #draft: draft,
+              #preRelease: preRelease,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i3.Release>);
+
   @override
-  _i7.Future<List<_i4.ContributorStatistics>> listContributorStats(
-          _i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listContributorStats, [slug]),
-              returnValue: _i7.Future<List<_i4.ContributorStatistics>>.value(
-                  <_i4.ContributorStatistics>[]),
-              returnValueForMissingStub:
-                  _i7.Future<List<_i4.ContributorStatistics>>.value(
-                      <_i4.ContributorStatistics>[]))
-          as _i7.Future<List<_i4.ContributorStatistics>>);
-  @override
-  _i7.Stream<_i4.YearCommitCountWeek> listCommitActivity(
-          _i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listCommitActivity, [slug]),
-              returnValue: _i7.Stream<_i4.YearCommitCountWeek>.empty(),
-              returnValueForMissingStub:
-                  _i7.Stream<_i4.YearCommitCountWeek>.empty())
-          as _i7.Stream<_i4.YearCommitCountWeek>);
-  @override
-  _i7.Stream<_i4.WeeklyChangesCount> listCodeFrequency(
-          _i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listCodeFrequency, [slug]),
-              returnValue: _i7.Stream<_i4.WeeklyChangesCount>.empty(),
-              returnValueForMissingStub:
-                  _i7.Stream<_i4.WeeklyChangesCount>.empty())
-          as _i7.Stream<_i4.WeeklyChangesCount>);
-  @override
-  _i7.Future<_i4.ContributorParticipation> getParticipation(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#getParticipation, [slug]),
-              returnValue: _i7.Future<_i4.ContributorParticipation>.value(
-                  _FakeContributorParticipation_34(
-                      this, Invocation.method(#getParticipation, [slug]))),
-              returnValueForMissingStub: _i7.Future<_i4.ContributorParticipation>.value(
-                  _FakeContributorParticipation_34(
-                      this, Invocation.method(#getParticipation, [slug]))))
-          as _i7.Future<_i4.ContributorParticipation>);
-  @override
-  _i7.Stream<_i4.PunchcardEntry> listPunchcard(_i4.RepositorySlug? slug) =>
-      (super.noSuchMethod(Invocation.method(#listPunchcard, [slug]),
-              returnValue: _i7.Stream<_i4.PunchcardEntry>.empty(),
-              returnValueForMissingStub: _i7.Stream<_i4.PunchcardEntry>.empty())
-          as _i7.Stream<_i4.PunchcardEntry>);
-  @override
-  _i7.Stream<_i4.RepositoryStatus> listStatuses(
-          _i4.RepositorySlug? slug, String? ref) =>
-      (super.noSuchMethod(Invocation.method(#listStatuses, [slug, ref]),
-              returnValue: _i7.Stream<_i4.RepositoryStatus>.empty(),
-              returnValueForMissingStub:
-                  _i7.Stream<_i4.RepositoryStatus>.empty())
-          as _i7.Stream<_i4.RepositoryStatus>);
-  @override
-  _i7.Future<_i4.RepositoryStatus> createStatus(
-          _i4.RepositorySlug? slug, String? ref, _i4.CreateStatus? request) =>
+  _i5.Future<bool> deleteRelease(
+    _i3.RepositorySlug? slug,
+    _i3.Release? release,
+  ) =>
       (super.noSuchMethod(
-              Invocation.method(#createStatus, [slug, ref, request]),
-              returnValue: _i7.Future<_i4.RepositoryStatus>.value(
-                  _FakeRepositoryStatus_35(this,
-                      Invocation.method(#createStatus, [slug, ref, request]))),
-              returnValueForMissingStub: _i7.Future<_i4.RepositoryStatus>.value(
-                  _FakeRepositoryStatus_35(this, Invocation.method(#createStatus, [slug, ref, request]))))
-          as _i7.Future<_i4.RepositoryStatus>);
+        Invocation.method(
+          #deleteRelease,
+          [
+            slug,
+            release,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
   @override
-  _i7.Future<_i4.CombinedRepositoryStatus> getCombinedStatus(
-          _i4.RepositorySlug? slug, String? ref) =>
-      (super.noSuchMethod(Invocation.method(#getCombinedStatus, [slug, ref]),
-              returnValue: _i7.Future<_i4.CombinedRepositoryStatus>.value(
-                  _FakeCombinedRepositoryStatus_36(this,
-                      Invocation.method(#getCombinedStatus, [slug, ref]))),
-              returnValueForMissingStub:
-                  _i7.Future<_i4.CombinedRepositoryStatus>.value(
-                      _FakeCombinedRepositoryStatus_36(this, Invocation.method(#getCombinedStatus, [slug, ref]))))
-          as _i7.Future<_i4.CombinedRepositoryStatus>);
+  _i5.Stream<_i3.ReleaseAsset> listReleaseAssets(
+    _i3.RepositorySlug? slug,
+    _i3.Release? release,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listReleaseAssets,
+          [
+            slug,
+            release,
+          ],
+        ),
+        returnValue: _i5.Stream<_i3.ReleaseAsset>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.ReleaseAsset>.empty(),
+      ) as _i5.Stream<_i3.ReleaseAsset>);
+
   @override
-  _i7.Future<_i4.ReleaseNotes> generateReleaseNotes(
-          _i4.CreateReleaseNotes? crn) =>
-      (super.noSuchMethod(Invocation.method(#generateReleaseNotes, [crn]),
-              returnValue: _i7.Future<_i4.ReleaseNotes>.value(
-                  _FakeReleaseNotes_37(
-                      this, Invocation.method(#generateReleaseNotes, [crn]))),
-              returnValueForMissingStub: _i7.Future<_i4.ReleaseNotes>.value(
-                  _FakeReleaseNotes_37(
-                      this, Invocation.method(#generateReleaseNotes, [crn]))))
-          as _i7.Future<_i4.ReleaseNotes>);
+  _i5.Future<_i3.ReleaseAsset> getReleaseAsset(
+    _i3.RepositorySlug? slug,
+    _i3.Release? release, {
+    required int? assetId,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getReleaseAsset,
+          [
+            slug,
+            release,
+          ],
+          {#assetId: assetId},
+        ),
+        returnValue: _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
+          this,
+          Invocation.method(
+            #getReleaseAsset,
+            [
+              slug,
+              release,
+            ],
+            {#assetId: assetId},
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
+          this,
+          Invocation.method(
+            #getReleaseAsset,
+            [
+              slug,
+              release,
+            ],
+            {#assetId: assetId},
+          ),
+        )),
+      ) as _i5.Future<_i3.ReleaseAsset>);
+
+  @override
+  _i5.Future<_i3.ReleaseAsset> editReleaseAsset(
+    _i3.RepositorySlug? slug,
+    _i3.ReleaseAsset? assetToEdit, {
+    String? name,
+    String? label,
+  }) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #editReleaseAsset,
+          [
+            slug,
+            assetToEdit,
+          ],
+          {
+            #name: name,
+            #label: label,
+          },
+        ),
+        returnValue: _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
+          this,
+          Invocation.method(
+            #editReleaseAsset,
+            [
+              slug,
+              assetToEdit,
+            ],
+            {
+              #name: name,
+              #label: label,
+            },
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.ReleaseAsset>.value(_FakeReleaseAsset_36(
+          this,
+          Invocation.method(
+            #editReleaseAsset,
+            [
+              slug,
+              assetToEdit,
+            ],
+            {
+              #name: name,
+              #label: label,
+            },
+          ),
+        )),
+      ) as _i5.Future<_i3.ReleaseAsset>);
+
+  @override
+  _i5.Future<bool> deleteReleaseAsset(
+    _i3.RepositorySlug? slug,
+    _i3.ReleaseAsset? asset,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #deleteReleaseAsset,
+          [
+            slug,
+            asset,
+          ],
+        ),
+        returnValue: _i5.Future<bool>.value(false),
+        returnValueForMissingStub: _i5.Future<bool>.value(false),
+      ) as _i5.Future<bool>);
+
+  @override
+  _i5.Future<List<_i3.ReleaseAsset>> uploadReleaseAssets(
+    _i3.Release? release,
+    Iterable<_i3.CreateReleaseAsset>? createReleaseAssets,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #uploadReleaseAssets,
+          [
+            release,
+            createReleaseAssets,
+          ],
+        ),
+        returnValue:
+            _i5.Future<List<_i3.ReleaseAsset>>.value(<_i3.ReleaseAsset>[]),
+        returnValueForMissingStub:
+            _i5.Future<List<_i3.ReleaseAsset>>.value(<_i3.ReleaseAsset>[]),
+      ) as _i5.Future<List<_i3.ReleaseAsset>>);
+
+  @override
+  _i5.Future<List<_i3.ContributorStatistics>> listContributorStats(
+          _i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listContributorStats,
+          [slug],
+        ),
+        returnValue: _i5.Future<List<_i3.ContributorStatistics>>.value(
+            <_i3.ContributorStatistics>[]),
+        returnValueForMissingStub:
+            _i5.Future<List<_i3.ContributorStatistics>>.value(
+                <_i3.ContributorStatistics>[]),
+      ) as _i5.Future<List<_i3.ContributorStatistics>>);
+
+  @override
+  _i5.Stream<_i3.YearCommitCountWeek> listCommitActivity(
+          _i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listCommitActivity,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.YearCommitCountWeek>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.YearCommitCountWeek>.empty(),
+      ) as _i5.Stream<_i3.YearCommitCountWeek>);
+
+  @override
+  _i5.Stream<_i3.WeeklyChangesCount> listCodeFrequency(
+          _i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listCodeFrequency,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.WeeklyChangesCount>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.WeeklyChangesCount>.empty(),
+      ) as _i5.Stream<_i3.WeeklyChangesCount>);
+
+  @override
+  _i5.Future<_i3.ContributorParticipation> getParticipation(
+          _i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getParticipation,
+          [slug],
+        ),
+        returnValue: _i5.Future<_i3.ContributorParticipation>.value(
+            _FakeContributorParticipation_37(
+          this,
+          Invocation.method(
+            #getParticipation,
+            [slug],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.ContributorParticipation>.value(
+                _FakeContributorParticipation_37(
+          this,
+          Invocation.method(
+            #getParticipation,
+            [slug],
+          ),
+        )),
+      ) as _i5.Future<_i3.ContributorParticipation>);
+
+  @override
+  _i5.Stream<_i3.PunchcardEntry> listPunchcard(_i3.RepositorySlug? slug) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listPunchcard,
+          [slug],
+        ),
+        returnValue: _i5.Stream<_i3.PunchcardEntry>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.PunchcardEntry>.empty(),
+      ) as _i5.Stream<_i3.PunchcardEntry>);
+
+  @override
+  _i5.Stream<_i3.RepositoryStatus> listStatuses(
+    _i3.RepositorySlug? slug,
+    String? ref,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #listStatuses,
+          [
+            slug,
+            ref,
+          ],
+        ),
+        returnValue: _i5.Stream<_i3.RepositoryStatus>.empty(),
+        returnValueForMissingStub: _i5.Stream<_i3.RepositoryStatus>.empty(),
+      ) as _i5.Stream<_i3.RepositoryStatus>);
+
+  @override
+  _i5.Future<_i3.RepositoryStatus> createStatus(
+    _i3.RepositorySlug? slug,
+    String? ref,
+    _i3.CreateStatus? request,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #createStatus,
+          [
+            slug,
+            ref,
+            request,
+          ],
+        ),
+        returnValue:
+            _i5.Future<_i3.RepositoryStatus>.value(_FakeRepositoryStatus_38(
+          this,
+          Invocation.method(
+            #createStatus,
+            [
+              slug,
+              ref,
+              request,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.RepositoryStatus>.value(_FakeRepositoryStatus_38(
+          this,
+          Invocation.method(
+            #createStatus,
+            [
+              slug,
+              ref,
+              request,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.RepositoryStatus>);
+
+  @override
+  _i5.Future<_i3.CombinedRepositoryStatus> getCombinedStatus(
+    _i3.RepositorySlug? slug,
+    String? ref,
+  ) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #getCombinedStatus,
+          [
+            slug,
+            ref,
+          ],
+        ),
+        returnValue: _i5.Future<_i3.CombinedRepositoryStatus>.value(
+            _FakeCombinedRepositoryStatus_39(
+          this,
+          Invocation.method(
+            #getCombinedStatus,
+            [
+              slug,
+              ref,
+            ],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.CombinedRepositoryStatus>.value(
+                _FakeCombinedRepositoryStatus_39(
+          this,
+          Invocation.method(
+            #getCombinedStatus,
+            [
+              slug,
+              ref,
+            ],
+          ),
+        )),
+      ) as _i5.Future<_i3.CombinedRepositoryStatus>);
+
+  @override
+  _i5.Future<_i3.ReleaseNotes> generateReleaseNotes(
+          _i3.CreateReleaseNotes? crn) =>
+      (super.noSuchMethod(
+        Invocation.method(
+          #generateReleaseNotes,
+          [crn],
+        ),
+        returnValue: _i5.Future<_i3.ReleaseNotes>.value(_FakeReleaseNotes_40(
+          this,
+          Invocation.method(
+            #generateReleaseNotes,
+            [crn],
+          ),
+        )),
+        returnValueForMissingStub:
+            _i5.Future<_i3.ReleaseNotes>.value(_FakeReleaseNotes_40(
+          this,
+          Invocation.method(
+            #generateReleaseNotes,
+            [crn],
+          ),
+        )),
+      ) as _i5.Future<_i3.ReleaseNotes>);
 }
 
 /// A class which mocks [RepositoryCommit].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockRepositoryCommit extends _i1.Mock implements _i4.RepositoryCommit {
+class MockRepositoryCommit extends _i1.Mock implements _i3.RepositoryCommit {
   @override
-  set url(String? _url) => super.noSuchMethod(Invocation.setter(#url, _url),
-      returnValueForMissingStub: null);
+  set url(String? _url) => super.noSuchMethod(
+        Invocation.setter(
+          #url,
+          _url,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set sha(String? _sha) => super.noSuchMethod(Invocation.setter(#sha, _sha),
-      returnValueForMissingStub: null);
+  set sha(String? _sha) => super.noSuchMethod(
+        Invocation.setter(
+          #sha,
+          _sha,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set htmlUrl(String? _htmlUrl) =>
-      super.noSuchMethod(Invocation.setter(#htmlUrl, _htmlUrl),
-          returnValueForMissingStub: null);
+  set htmlUrl(String? _htmlUrl) => super.noSuchMethod(
+        Invocation.setter(
+          #htmlUrl,
+          _htmlUrl,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set commentsUrl(String? _commentsUrl) =>
-      super.noSuchMethod(Invocation.setter(#commentsUrl, _commentsUrl),
-          returnValueForMissingStub: null);
+  set commentsUrl(String? _commentsUrl) => super.noSuchMethod(
+        Invocation.setter(
+          #commentsUrl,
+          _commentsUrl,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set commit(_i4.GitCommit? _commit) =>
-      super.noSuchMethod(Invocation.setter(#commit, _commit),
-          returnValueForMissingStub: null);
+  set commit(_i3.GitCommit? _commit) => super.noSuchMethod(
+        Invocation.setter(
+          #commit,
+          _commit,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set author(_i4.User? _author) =>
-      super.noSuchMethod(Invocation.setter(#author, _author),
-          returnValueForMissingStub: null);
+  set author(_i3.User? _author) => super.noSuchMethod(
+        Invocation.setter(
+          #author,
+          _author,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set committer(_i4.User? _committer) =>
-      super.noSuchMethod(Invocation.setter(#committer, _committer),
-          returnValueForMissingStub: null);
+  set committer(_i3.User? _committer) => super.noSuchMethod(
+        Invocation.setter(
+          #committer,
+          _committer,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set parents(List<_i4.GitCommit>? _parents) =>
-      super.noSuchMethod(Invocation.setter(#parents, _parents),
-          returnValueForMissingStub: null);
+  set parents(List<_i3.GitCommit>? _parents) => super.noSuchMethod(
+        Invocation.setter(
+          #parents,
+          _parents,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set stats(_i4.CommitStats? _stats) =>
-      super.noSuchMethod(Invocation.setter(#stats, _stats),
-          returnValueForMissingStub: null);
+  set stats(_i3.CommitStats? _stats) => super.noSuchMethod(
+        Invocation.setter(
+          #stats,
+          _stats,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
-  set files(List<_i4.CommitFile>? _files) =>
-      super.noSuchMethod(Invocation.setter(#files, _files),
-          returnValueForMissingStub: null);
+  set files(List<_i3.CommitFile>? _files) => super.noSuchMethod(
+        Invocation.setter(
+          #files,
+          _files,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
   Map<String, dynamic> toJson() => (super.noSuchMethod(
-      Invocation.method(#toJson, []),
-      returnValue: <String, dynamic>{},
-      returnValueForMissingStub: <String, dynamic>{}) as Map<String, dynamic>);
+        Invocation.method(
+          #toJson,
+          [],
+        ),
+        returnValue: <String, dynamic>{},
+        returnValueForMissingStub: <String, dynamic>{},
+      ) as Map<String, dynamic>);
 }
